Nodejsアプリケーションをデプロイするためのベストプラクティスは何ですか?
1)node_modulesフォルダーを開発サーバーから実稼働サーバーに直接移動します。これにより、実稼働環境でも同じローカル環境を作成できます。ノードモジュールにリモートで加えられた変更がコードに影響を与えることはありません。
2)package.jsonを使用して、本番サーバーでnpm install
コマンドを実行します。ここでの問題は、ノードモジュールの変更がコードに影響を与えることです。ループバックモジュールでいくつかの問題に直面しました( issue link )。
誰か助けてもらえますか?
ランニング npm install
特定のシナリオ(コンパイルツールの欠如、インターネットアクセスの制限など)で本番サーバーで実行できません。また、同じプロジェクトを複数のマシンにデプロイする必要がある場合、CPU、メモリ、帯域幅の浪費になる可能性があります。
npm install --production
同じライブラリとノードバージョンの本番サーバーがインストールされているマシンで、node_modulesを圧縮して本番サーバーにデプロイします。また、package-lock.json
ファイルでバージョンを特定します。
このアプローチでは、開発パッケージを使用してコードをビルド/テストし、実際のデプロイの前にnode_modulesをプルーニングすることもできます。
私の推測では、この質問をすると、package.json
ファイルの要点がよくわかりません。
Package.jsonファイルは、この目的(つまり、npmレジストリへのアップロード)、つまりかなりの数の依存関係を一緒に転送する必要のないノードパッケージの転送を目的としています。
neverは手動でnode_modules
ディレクトリを手動で移動する必要があると言って限ります。
運用サーバーでは必ずnpm install
コマンドを使用してください。これが適切な方法です。ローカル環境と比較してnode_modules
ディレクトリが変更されないようにするには、package lock
ファイルを使用します。これは、node_modules
のソースコードへの変更を最小限に抑えるのに役立ちます。
これは悪い意図ではない
npm install
は、バージョンの依存関係を壊す可能性があります。npm ci
。 package_lockファイルを使用し、バージョンを変更せずに必要な依存関係をインストールします。 npm ciは継続的インテグレーションプロジェクトを意味します。 [〜#〜]リンク[〜#〜]私はASP.NET Core開発者ですが、最近Node.jsアプリでの作業を開始しました。私にとって、これはnode_modules
フォルダを本番環境に移行する際に言及した課題の1つでした。フォルダー全体を運用サーバーに移動したり、運用サーバーでnpm install
コマンドのみを実行したりする代わりに、Webpack
を使用してNode.jsアプリを単一/複数のバンドルにバンドルする方法を見つけて試しました。 node_modules
フォルダーを管理する必要がなくなりました。アプリで使用/参照されている必要なnode_modulesパッケージのみを取得し、アプリコードと一緒に単一のファイルにバンドルします。node_modulesフォルダー全体を移動せずに、その単一のファイルを本番環境にデプロイします。
私の場合はこのアプローチが有用であることがわかりましたが、これがアプリのパフォーマンスに関して正しい方法ではない場合や、このアプローチの短所がある場合は教えてください。
絶対に npm install
。しかし、アプリのデプロイに関しては、自分の手でこれを行うべきではありません。
PM2 のように、このためのツールを使用します。
パッケージの変更に関する懸念については、簡単な答えはpackage-lock.json
。