概要

環境構築時にnpmのモジュールを他の開発者と同じようにインストールするために下記のコマンドを使ってnodemoduleをインストールするは鉄則のようなものかと思います。
npm install, npm ci, npm i

ですが「。。。ん?そういえば環境構築のREADME.mdいつもコピペしてて、こんなのよく出てたけどこれらの違いってよくわからないな。。?」
ということで記事を書きます。

いまだに間違った理解をしている可能性も十分にあるので、その場合は訂正コメントをお願いします!

npm install vs npm i

npm install = npm i
省略記法です。
これからはnpm installをnpm iと書き換えて説明します。

npm i vs npm ci

npm iは何をしているのか

package.jsonを基に、npmでパッケージをインストールする。

package.jsonってなんだ

簡単に言うと何を入れたいかが書いてあります。
インストールすべきパッケージのバージョンの範囲が記載されています。

範囲なのでgit cloneしてnpm iしても、実際にインストールしたパッケージが他の開発者と異なる場合があります。

プロジェクト序盤でnpm initをすることで、作成されます。

npm ci は何をしているのか

package-lock.jsonを基に、npmでパッケージをインストールするコマンドです。

下記を実行しています

  1. node_modules ディレクトリの削除
  2. package-lock.json と package.json の整合性のチェック。違ったらエラーを吐く。
  3. package-lock.json から node_modules を再現

ちなみに処理はいくつかの機能を省略するので、npm install より圧倒的に高速な場合があります。

package-lock.jsonってなんだ

簡単に言うと何を実際に入れたが書いてあります。
npmが依存関係など考慮して、実際にインストールしたパッケージのバージョンが記載されています。

大まかな流れ

npm init 
→package.json作成

↓

npm install <package>
→指定したパッケージをインストール
→インストールしたパッケージのバージョン範囲をpackage.jsonに自動で記述
→package-lock.json作成・実際にインストールしたバージョンを記述

↓

npm install
→他の開発者がpackage.jsonをもとにインストール

OR

npm ci
→他の開発者がpackage-lock.jsonをもとにインストール

結論

package.jsonは何をインストールするか、package-lock.jsonは何をインストールしたかが記載されています。
npm ciではpackage-lock.jsonに基づいてパッケージをインストールします。
npm iではpackage.jsonに基づいてパッケージをインストールします。

CI 実行時や git clone 後の動作確認の場合はnpm ci
その他の場合はnpm iで分ける感じかと思います。

環境構築時にnpm iを使うと、他の開発者の環境とまったく同じではない環境ができる可能性があり、レポジトリをpushする際にも毎回差分を削除する必要などが出てくるため、今回のようなケースではnpm ciが推奨されています。インストールのスピードも速いです。

reference

元記事はこちら

npm install vs npm ci ( vs npm i )
著者:
@yutoun