3秒でわかる
package.json に書く、本番の実行に必要な外部パッケージの一覧。誰がどこで入れても同じ構成を再現するための宣言です。
もう少し詳しく
どういうものか
Node.js のプロジェクトに置く package.json のフィールドで、そのアプリを動かすために必要な外部パッケージの名前と、許容するバージョンの範囲を並べます。npm install を実行すると、ここに書かれたものが node_modules 以下に展開されます。実際に入った正確なバージョンは package-lock.json に記録されるため、別のマシンでも同じ構成を再現できます。
なぜ必要か
外部ライブラリを手で配るとしたら、誰が何を入れたか分からなくなり、動く環境と動かない環境が生まれます。必要なものを宣言として一箇所に書いておけば、リポジトリを clone した人は install コマンド 1 つで同じ状態にできます。CI やコンテナのビルドが成立するのもこの宣言があるからです。
具体例
{
"name": "myapp",
"dependencies": {
"express": "^4.19.2",
"zod": "~3.23.8"
},
"devDependencies": {
"vitest": "^2.0.5",
"typescript": "^5.5.4"
}
}$ npm install express # dependencies に追加される
$ npm install -D vitest # devDependencies に追加される
$ npm ci # lock ファイルどおりに厳密に入れ直す
$ npm install --omit=dev # 本番用。devDependencies を入れないつまずきやすいところ
^4.19.2 はメジャーを固定して 4 系の最新まで許す指定、~3.23.8 はパッチだけ許す指定です。範囲の意味を知らないまま install し直すと、意図せずライブラリが上がって壊れます。似た用語との違い
| フィールド | 入れるもの |
|---|---|
| dependencies | 実行時に読み込むライブラリ |
| devDependencies | テスト、型定義、ビルドツールなど開発時だけ使うもの |
| peerDependencies | 利用側が用意する前提のライブラリ。プラグインで使う |