Skip to content

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に設定することで一般的に以下が保証される。

  • ログは最小限、必須レベルに保持される
  • パフォーマンスを最適化するために、より多くのキャッシュレベルが適用される

これは通常、コマンド

bash
export NODE_ENV=production

をシェルで実行することで行われるが、システムの再起動時に設定が保持されないため、シェル設定ファイル(Bashシェルでは.bash_profileなど)に記述する方が良い。

アプリケーションの初期化コマンドの先頭に環境変数を追加することによっても適用できる。

bash
NODE_ENV=production node app.js

例えば、Expressアプリでは、これを使用して環境ごとに異なるエラーハンドラーを設定できる。

javascript
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_ENVproductionに設定されていない場合、デバッグモードでコンパイルされる。Expressのビューは開発モードではリクエストごとにコンパイルされるが、本番環境ではキャッシュされる。他にも多くの例がある。

この環境変数は、外部ライブラリで広く使用されている慣習だが、Node.js自体の中では使用されていない。

なぜNODE_ENVはアンチパターンと見なされるのか?

環境とは、エンジニアがソフトウェア製品を構築、テスト、デプロイ、管理できるデジタルプラットフォームまたはシステムのことである。従来、アプリケーションが実行される環境には、以下の4つのステージまたはタイプがある。

  • 開発
  • ステージング
  • 本番
  • テスト

NODE_ENVの基本的な問題は、開発者が最適化とソフトウェアの動作を、ソフトウェアが実行されている環境と組み合わせることにある。その結果、次のようなコードになる。

javascript
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_ENVdevelopmentに設定されている場合はテスト、ひいては製品の機能が成功するが、NODE_ENVproductionに設定すると失敗する可能性がある。したがって、NODE_ENVproduction以外に設定することはアンチパターンと見なされる。