npm(Node Package Manager)は、サードパーティのパッケージ(依存関係)をインストール・管理し、プロジェクトのスクリプトを実行するための Node の標準ツールです。プロジェクトは 2 つのファイルで定義されます。package.json(マニフェスト)と package-lock.json(正確な依存関係ツリー)です。
package.json — プロジェクトのマニフェスト
メタデータ、スクリプト、依存関係を記録します。^4.18.0 は semver の範囲指定 です。^ は互換性のあるマイナー/パッチ更新を許可します(4.x.x、ただし 5.0.0 は含まない)。
package.json says: express ^4.18.0 (a RANGE — could install 4.18.0 or 4.19.2...)
package-lock.json: express 4.18.2 (the EXACT version + every nested dependency)
ロックファイルは、インストールされたすべてのパッケージ(推移的な依存関係を含む)の 正確な バージョンを固定します。これにより、チームの全員 — そして CI、本番環境 — が 同一の 依存関係ツリーを得ることが保証され、バージョンのずれによる「自分の環境では動く」というバグを防ぎます。
npm install # install all deps from package.json (updates lockfile)
npm install express # add a dependency
npm install -D vitest # add a devDependency
npm ci # install EXACTLY from the lockfile (used in CI — fast, strict)
npm run dev # run a script defined in package.json
npm ci(npm install に対して)は、ロックファイルを変更せずにそこから厳密にインストールします。CI/本番の再現性のために正しいコマンドです。
✓ ALWAYS commit package-lock.json → reproducible installs across the team & CI
npm とこれら 2 つのファイルは、あらゆる Node プロジェクトの基礎です。
package.json(dependencies と devDependencies の違い、semver の範囲指定、スクリプト)を理解し、とりわけ なぜロックファイルが存在するのか(依存関係ツリー全体の決定論的で再現可能なインストール)を理解することは不可欠です。ロックファイルをコミットし、CI で npm ci を使うことで、チームメイトや本番環境が異なるパッケージバージョンを得ることによって生じる、微妙でデバッグしにくい失敗を防げます。