npm
Node.js のデフォルトパッケージマネージャーで、200 万以上の JavaScript パッケージの公開・インストール・管理を行う
パッケージ管理Node.js
npm とは
npm (Node Package Manager) は、Node.js のデフォルトパッケージマネージャーで、npmjs.com レジストリから 200 万以上のパッケージをインストールできる。2010 年に Isaac Z. Schlueter が開発し、Node.js のエコシステムの爆発的な成長を支えた。
package.json と package-lock.json
{
"name": "my-app",
"version": "1.0.0",
"dependencies": {
"express": "^4.18.0",
"zod": "^3.22.0"
},
"devDependencies": {
"typescript": "^5.3.0",
"vitest": "^1.0.0"
},
"scripts": {
"build": "tsc",
"test": "vitest run",
"start": "node dist/index.js"
}
}
package.json: 依存関係とバージョン範囲を宣言package-lock.json: 実際にインストールされた正確なバージョンを記録 (再現性の保証)
package-lock.json は必ず Git にコミットする。これがないと、開発者ごとに異なるバージョンがインストールされ、「自分の環境では動くのに CI では動かない」問題が発生する。
主要コマンド
npm install # package.json の依存をインストール
npm install express # パッケージを追加 (dependencies)
npm install -D vitest # 開発依存に追加 (devDependencies)
npm ci # lock ファイルから厳密にインストール (CI 向け)
npm run build # scripts のコマンドを実行
npm audit # 脆弱性のチェック
npm outdated # 更新可能なパッケージの一覧
npx create-next-app # パッケージを一時的にダウンロードして実行
npm install と npm ci の違いは重要だ。
| コマンド | 動作 | 用途 |
|---|---|---|
npm install |
package.json を解決し、lock を更新する場合がある | 開発時 |
npm ci |
lock ファイルを厳密に再現。lock と package.json が不整合なら失敗 | CI/CD |
CI では必ず npm ci を使う。npm install は lock ファイルを書き換える可能性があり、再現性が保証されない。
セマンティックバージョニング
npm はセマンティックバージョニング (SemVer) に基づいてバージョンを管理する。
^4.18.0 → 4.x.x の最新 (メジャーバージョン固定)
~4.18.0 → 4.18.x の最新 (マイナーバージョン固定)
4.18.0 → 完全一致
^ (キャレット) がデフォルトで、メジャーバージョンを固定しつつマイナー・パッチの更新を許容する。
npm vs yarn vs pnpm
| 観点 | npm | yarn | pnpm |
|---|---|---|---|
| 速度 | 普通 | 速い (並列) | 最速 |
| ディスク使用量 | 大きい (各プロジェクトにコピー) | 大きい | 小さい (ハードリンク) |
| node_modules 構造 | フラット | フラット | シンボリックリンク |
| ワークスペース | v7 以降対応 | 初期から対応 | 対応 |
| 特徴 | Node.js 標準 | Plug'n'Play | 厳密な依存解決 |
pnpm はグローバルストアにパッケージを 1 回だけ保存し、各プロジェクトからハードリンクで参照する。モノレポで複数プロジェクトがある場合、ディスク使用量が大幅に削減される。
サプライチェーンセキュリティ
npm パッケージは誰でも公開できるため、悪意のあるパッケージが紛れ込むリスクがある。
npm auditで既知の脆弱性を定期的にチェックするpackage-lock.jsonをコミットし、意図しないバージョン変更を防ぐnpm ciで lock ファイルを厳密に再現する- 依存パッケージの数を最小限に抑える
体系的に学ぶなら関連書籍を参照してほしい。