トランスパイラとPM2の連携
本番環境での運用方法
コードベースを共有、バンドル、パッケージ化、またはデプロイする場合は、プレーンなJavaScript(VanillaJS)を使用する方が良いことがよくあります。つまり、コードの前処理バージョンがあり、その後、JavaScriptエントリポイントを実行することになります。
例えば、一般的なディレクトリ構造は以下のようになります。
├── src
├── dist
└── package.json
ここでsrc
にはES6、Coffeescript、その他が含まれ、dist
にはトランスパイルされたJavaScriptが含まれます。これはPM2で簡単に設定できます。PM2は、追加の設定なしでJavaScriptを起動します。
ただし、コードを記述する際には、設定が難しくなる可能性があります。監視と再起動を行うとします。監視、トランスパイル、再起動を行う必要があります。PM2はビルドシステムでもタスクランナーでもないので、2番目の方法を優先することをお勧めします。
開発方法
これは本番ワークフローでも問題なく動作する可能性がありますが、お勧めしません。コードをバンドルする方が安全で、スクリプトの起動プロセスが遅くなり、クラスタモードが使用できない可能性があります。
実行インタープリター
PM2でトランスパイラを使用する最も簡単な方法は、実行インタープリター(exec_interpreter
)をオーバーライドすることです。これが変更された場合、コードはfork_mode
でのみ機能することに注意してください(フォークモードの違いについてはここを参照してください)。
そのためには、CLIを介して--interpreter
オプション、またはJSON設定を介してexec_interpreter
オプションを指定します。
Coffeescript
#- npm install -g coffee-script
#- pm2 start --interpreter coffee index.coffee
--watch
を追加するだけで、ファイルの変更時に再起動するデーモン化されたCoffeescriptになります。
Babel
#- npm install -g babel-cli
#- pm2 start --interpreter babel-node index.es6
これらのコマンドはfork_mode
でのみ機能することに注意してください。PM2クラスタを実行する場合は、以下の代替方法を参照してください。
Requireフック
これは私のお気に入りのオプションです。コード内にトランスパイラを登録することで、標準のJavaScriptとして実行されます。これらのほとんどは実際にはノードの内部require
を変更するか、module
を調整して、必要なスクリプトが解釈される前にトランスパイルされるようにします(例:babelまたはcoffee)。
この回避策は、実際の解決策というよりもハックと見なすことができます。スクリプトの起動が遅くなることに注意してください。
動作させるには、トランスパイルされていないソースを含める前にrequireフックを呼び出すプレーンなJavaScriptのエントリポイントを用意します。
Coffeescript
# server.js
require('coffee/register');
require('./server.coffee');
Babel
require('babel-register');
require('./server.es6');
詳細については、babeljsのドキュメントを参照してください。
その後、pm2 start server.js
でスクリプトを起動するだけです。node
インタープリターを使用するため、クラスタモードは期待通りに動作します。