本番環境で動作をしているライブラリのメンテナンスは、どんな言語であっても悩ましい問題です。
Node.jsは、初期に比べてアップデートによる影響が少なくなってきたとはいえ、バージョン管理を怠ると、更新のコストが大きくなったり、予期せぬ不具合が発生する可能性があります。
今回は、業務でNode.js / npmを使い続けた中で必要だった設定ファイルをまとめたいと思います。
前提として、 ExpressなどのサーバーサイドJavaScriptを使用しておらず、JenkinsなどのCIツールで、フロントエンドのJavaScriptをビルドする場合を想定しています。
TL;DR
- package-lock.json
- .npmrc
- .node-version / .npm-version
この3つがあれば、最低限、バージョンの差異によるトラブルを避けることができます。
1. package-lock.json
まずは基本です。通常、インストールしたパッケージはpackage.jsonで管理されていますが、追加したパッケージが依存しているパッケージは、package-lock.jsonで管理しています。
無いと何が起こるか
- 新規メンバーがpackage.jsonの入ったリポジトリをcloneし、npm installした際、意図しないバージョンがインストールされ、package.json作成当初に発生していないエラーがでる可能性があります
- 新規で参加したメンバーが、
npm install
を実行してもローカル環境を構築できない可能性があります
対応方法
package-lock.jsonに対応したnpm 5.x以上が必要です。
npm installを行うと、自動で生成されます。
yarnを利用している方は、同様のファイルとしてyarn-lock.jsonがあります。
2. .npmrc
npmに関する挙動を制御することができます。
無いと何が起こるか
- npmの挙動の違いにより、メンバー間でローカル環境に差異ができてしまう可能性があります
- 誰かがnpm installした際に、-Sや-Dオプションを指定し忘れ、package.jsonに必要なパッケージが記録されない可能性があります
- npm isntallした際にバージョンに^が追加され、後から来たメンバーがnpm installした際に、当初と異なるバージョンがインストールされる可能性があります。
対応方法
package.jsonと同階層に、ファイルを設置します。
おすすめの設定は下記のとおりです
also=dev
save-exact=true
also=dev
は、npm installで、オプションを指定しなかった場合、自動でdevDepandencysに追加してくれます。
save-exact
npm installしたパッケージのバージョンを固定(= ^をつけない)するようにします。
3. .node-version / .npm-version
ndenvなどを利用して、Node.jsを複数バージョン管理している場合、
これらのファイルがあると、ファイルがあるディレクトリ以下では、指定したバージョンのNode.js/npmが実行されます。
また、Gitリポジトリに含めることで、使用するNode.jsとnpmのバージョンを強制することができるので、より安全に環境構築が可能となります。
無いと何が起こるか
- 開発環境のアップデートが本番環境に影響してしまう可能性があります
- JenkinsのようなCIツールを使用する場合、ビルド用のサーバで必要なファイルを生成し、本番環境を含めた各環境にデプロイするケースがあります。
その場合、開発環境のNode.jsをアップデートしたつもりが、本番環境にも影響が出てしまい、予期せぬエラーに繋がる恐れがあります
対応方法
package.jsonと同階層に、各ファイルを設置します。
ファイルの中には8.11.4
などのバージョンの数値が書かれています。
まとめ
設定ファイルを活用することで、ドキュメントを用意することなく環境を固定することができるため、精神的な負担が軽くなります。
.node-version / .npm-versionについては、対応しているツールとそうでないツールがあるため、ご注意ください。