Node.jsにおける開発環境と本番環境の違い
Node.jsにおいて、開発環境と本番環境に違いはない
、つまり、Node.jsを本番環境で動作させるために適用する必要がある特定の設定はない。しかし、npmレジストリにあるいくつかのライブラリはNODE_ENV
変数を認識し、デフォルトでdevelopment
設定にしている。常にNODE_ENV=production
を設定してNode.jsを実行すること。
アプリケーションの設定に広く用いられる方法として、twelve factor methodologyがある。
ExpressにおけるNODE_ENV
非常に人気のあるexpressフレームワークでは、NODE_ENVをproductionに設定することで一般的に以下が保証される。
- ログは最小限、必須レベルに保持される
- パフォーマンスを最適化するために、より多くのキャッシュレベルが適用される
これは通常、コマンド
export NODE_ENV=production
をシェルで実行することで行われるが、システムの再起動時に設定が保持されないため、シェル設定ファイル(Bashシェルでは.bash_profile
など)に記述する方が良い。
アプリケーションの初期化コマンドの先頭に環境変数を追加することによっても適用できる。
NODE_ENV=production node app.js
例えば、Expressアプリでは、これを使用して環境ごとに異なるエラーハンドラーを設定できる。
if (process.env.NODE_ENV === 'development') {
app.use(express.errorHandler({ dumpExceptions: true, showStack: true }));
}
if (process.env.NODE_ENV === 'production') {
app.use(express.errorHandler());
}
例えば、Express.jsで使用されるテンプレートエンジンであるPugは、NODE_ENV
がproduction
に設定されていない場合、デバッグモードでコンパイルされる。Expressのビューは開発モードではリクエストごとにコンパイルされるが、本番環境ではキャッシュされる。他にも多くの例がある。
この環境変数は、外部ライブラリで広く使用されている慣習だが、Node.js自体の中では使用されていない。
なぜNODE_ENVはアンチパターンと見なされるのか?
環境とは、エンジニアがソフトウェア製品を構築、テスト、デプロイ、管理できるデジタルプラットフォームまたはシステムのことである。従来、アプリケーションが実行される環境には、以下の4つのステージまたはタイプがある。
- 開発
- ステージング
- 本番
- テスト
NODE_ENV
の基本的な問題は、開発者が最適化とソフトウェアの動作を、ソフトウェアが実行されている環境と組み合わせることにある。その結果、次のようなコードになる。
if (process.env.NODE_ENV === 'development') {
// ...
}
if (process.env.NODE_ENV === 'staging') {
// ...
}
if (process.env.NODE_ENV === 'production') {
// ...
}
if (process.env.NODE_ENV === 'testing') {
// ...
}
これは無害に見えるかもしれないが、本番環境とステージング環境を異ならせることになり、信頼できるテストを不可能にする。例えば、NODE_ENV
がdevelopment
に設定されている場合はテスト、ひいては製品の機能が成功するが、NODE_ENV
をproduction
に設定すると失敗する可能性がある。したがって、NODE_ENV
をproduction
以外に設定することはアンチパターンと見なされる。