まず結論
npm installは依存関係を追加・更新するため、npm ciはlockfileどおりに再現するためのコマンドです。
| コマンド | 主な用途 | lockfileとの関係 |
|---|---|---|
npm install | 開発中にパッケージを追加・更新する | 状況により更新する |
npm ci | CIや、同じ状態を作り直したい時 | lockfileと一致することを要求する |

npm install
npm install zod
パッケージを追加し、package.jsonとpackage-lock.jsonを更新します。既にある依存関係を入れるだけなら、指定なしのnpm installも使えます。
npm ci
npm ci
npm ciは既存のnode_modulesを削除してから、package-lock.jsonどおりにインストールします。package.jsonとlockfileが食い違っていると失敗します。これはCIで差分を早く見つけるために役立ちます。
使い分け
- 新しいライブラリを加える:
npm install パッケージ名 - 開発中の依存を通常どおり入れる:
npm install - CIまたはlockfileどおりに作り直す:
npm ci
プロジェクトがpnpmやYarnを採用しているなら、npmコマンドを混ぜず、そのプロジェクトのコマンドを使います。
まとめ
依存関係を変更する作業と、同じ依存関係を再現する作業を分けると、開発環境とCIの違いを減らせます。