如果你的nodejs项目使用了最新的语法,比如 import
、export
代替了 commonjs
的 require
,那么使用pm2守护进程的时候可能会遇到一些问题。交代一下背景,我的node项目使用了import
,文件名是.js
而不是.mjs
,所以无法直接使用 node
命令运行入口文件,如果要用 PM2
守护进程,需要指定babel-node
解析器,可以采用下面的配置:
// pm2.json
{
"name": "acl",
"script": "./build/server.js", //脚本位置
"exec_interpreter": "./node_modules/.bin/babel-node", // 指定解析器
"interpreter_args": "--config-file ./node-babel.js", // 传给解析器的参数
"exec_mode": "fork", // 自定义解析器和npm只能使用fork模式,无法使用集群
"error_file": "./logs/error.log",
"out_file": "./logs/console.log",
"pid_file": "./logs/pid_file.pid",
"log_date_format": "YYYY-MM-DD HH:mm:ss",
"combine_logs": true,
"merge_logs": true,
"env": {
"NODE_ENV": "qa"
}
}
简单总结下:
pm2的集群模式不支持自定义解析器,其实npm脚本也无法使用集群模式,只是运行npm脚本无需指定解析器,默认的node是可以运行的。如果非要运行包含 import
、export
的node文件,又要支持集群模式,那么需要打包你的程序,可以使用 webpack
构建。
如有错误,欢迎评论!