在 PM2 中使用转译器

在 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,以便在解释之前对所需的脚本进行转译(例如 babelcoffee)。

这种解决方法可以被认为更像是一种技巧,而不是真正的解决方案。请记住,这会减慢脚本的启动速度。

为了使其工作,请使用纯 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 解释器,因此集群模式将按预期工作。

为此页面做出贡献