コードをクローンしたり、リポジトリをプルした際、package.jsonに記載された依存パッケージを node_modulesにインストールするため、$ npm iを実行すると思います。
この$ npm iと似たコマンドに$ npm ciがあります。今回は、この2つのコマンドの違いについてご紹介します。また、昨日「package.jsonとpackage-lock.jsonの違い」についての記事も書きましたので、興味があればそちらも併せてご覧ください。
npm i
$ npm iを実行すると、package-lock.jsonに記載されている正確なバージョンのパッケージが node_modulesにインストールされます。ただし、package-lock.jsonが存在しない場合は、package.jsonに記載されているバージョン範囲内で最新のバージョンのパッケージがインストールされます。このとき、新たにpackage-lock.jsonが生成され、インストールされたパッケージの正確なバージョンが記録されます。
npm ci
$ npm ciはpackage-lock.jsonに記載されている正確なバージョンのパッケージをインストールする点では$npm iと似ていますが、動作にはいくつか違いがあります。$ npm ciはpackage-lock.jsonが存在しない場合にエラーを吐き、コマンドが実行できません。また、package.jsonと package-lock.jsonに矛盾がある場合もエラーとなります。さらに、$ npm iが不足分を補完して再利用するのに対し、$ npm ciは既存のnode_modulesを完全に削除した上でパッケージを再インストールします。
どちらを使えばいいのか
これらの違いから、$ npm iは開発中の柔軟な依存関係管理に向いており、$ npm ciは本番環境や CI/CDのように再現性が求められる場面で使用するのが適しています。
まとめ
この記事では、$ npm iと$ npm ciの違いについて解説しました。2日連続でパッケージ管理に関する記事を書いたことで、少し詳しくなった気がします。今後も、Web開発に役立つ小ネタを発信していきますので、ぜひお楽しみにしてください!