在 PM2 中使用转译器
生产环境方式
如果您想共享、捆绑、打包或部署您的代码库,通常最好使用原始的 JavaScript (VanillaJS)。这意味着您将拥有一个预处理版本的代码,然后您将执行一个 JavaScript 入口点。
例如,一个常见的目录结构如下所示
├── src
├── dist
└── package.json
其中 src
包含 es6、coffeescript 或其他任何内容,而 dist
是转译后的 JavaScript。现在使用 PM2 设置起来很容易,因为它将在没有任何配置的情况下启动 JavaScript。
然而,在编写代码时,它可能会使配置变得更加困难。假设您想要监视和重启。您将不得不监视、转译、重启。PM2 不是构建系统也不是任务运行器,因此我们建议您选择第二种方式。
开发环境方式
尽管我们不推荐,但这在生产工作流程中可能也能正常工作。捆绑代码更安全,但这会使脚本启动过程变慢,并且集群模式可能不可用。
执行解释器
在 PM2 中使用转译器的最简单方法是覆盖执行解释器 (exec_interpreter
)。请注意,如果更改此设置,您的代码将**仅**在 fork_mode
中工作(在此处查看 fork 模式之间的差异)。
为此,请通过 CLI 指定 --interpreter
选项,或通过 json 配置指定 exec_interpreter
选项。
Coffee-script
#- npm install -g coffee-script
#- pm2 start --interpreter coffee index.coffee
只需添加 --watch
即可获得一个守护的 coffee 脚本,该脚本将在文件更改时重新启动。
Babel
#- npm install -g babel-cli
#- pm2 start --interpreter babel-node index.es6
请记住,这些命令仅在 fork_mode
中有效。如果您想运行 PM2 集群,请参阅下面的替代方案。
Require 钩子
这是我最喜欢的选择。它将通过在代码中注册转译器来作为标准 JavaScript 运行。其中大多数实际上会更改节点内部的 require
,或者调整 module
,以便在解释之前对所需的脚本进行转译(例如 babel 或 coffee)。
这种解决方法可以被认为更像是一种技巧,而不是真正的解决方案。请记住,这会减慢脚本的启动速度。
为了使其工作,请使用纯 JavaScript 准备一个入口点,该入口点将在包含未转译的源代码之前调用 require 钩子。
Coffee-script
# server.js
require('coffee/register');
require('./server.coffee');
Babel
require('babel-register');
require('./server.es6');
查看 babeljs 文档 以获取更多选项。
然后,您要做的就是启动脚本 pm2 start server.js
。由于这将使用 node
解释器,因此集群模式将按预期工作。