[[npm ci]]が[[npm install]]と異なる点は以下5点。
- [[package-lock.json]] のバージョンを使う
- [[package-lock.json]] の依存関係が、[[package.json]]と一致しない場合はエラーになる
- プロジェクト全体のインストールのみ許容する
- 個々のインストール `npm ci <package>` は許容しない
- `node_modules` が存在する場合は削除してからインストールを開始する
- [[package.json]] や [[package-lock.json]] を更新することはない
## よくある勘違い
### npm installは[[package-lock.json]]を見ない
実はそんなことはない。[[package-lock.json]]があればそれを優先する。
> This command installs a package and any packages that it depends on. If the package has a package-lock, or an npm shrinkwrap file, or a yarn lock file, the installation of dependencies will be driven by that, respecting the following order of precedence:
>
> - `npm-shrinkwrap.json`
> - `package-lock.json`
> - `yarn.lock`
>
> *[npm-install | npm Docs](https://docs.npmjs.com/cli/v11/commands/npm-install) *
ただし、[[package.json]]と[[package-lock.json]]の内容に齟齬があった場合の挙動は[[npm ci]]と異なる。
1. [[package.json]]の依存関係を優先しインストール
2. [[package-lock.json]]を矛盾しないように更新する
そのため、[[package.json]]と[[package-lock.json]]のバージョン管理に齟齬の出る可能性があるなら、『[[package-lock.json]]の通りに **必ず** インストールされる』ことは保証できない。
なので以下の棲み分けが良さそう。
- ライブラリバージョンアップをしたいときは [[npm install]]
- 動かしたい時 or CI のときは [[npm ci]]