まず結論
依存関係とは、自分のプロジェクトが動くために必要な外部のパッケージとの関係です。
Web開発では、すべてを自分で作るわけではありません。フレームワーク、日付処理、テスト、ビルド、CSS処理など、多くの外部パッケージを使います。
npm install astro
このコマンドを実行すると、プロジェクトは astro というパッケージに依存するようになります。
パッケージとは
パッケージは、再利用できるコードや設定をまとめたものです。
JavaScript界隈では、npmに公開されているものを使うことが多いです。
例:
- Astro
- React
- Vite
- TypeScript
- ESLint
- date-fns
自分のプロジェクトは、これらを部品として取り込みます。
直接依存と推移的依存
依存関係には2種類あります。
| 種類 | 意味 |
|---|---|
| 直接依存 | 自分が package.json に書いた依存 |
| 推移的依存 | 依存しているパッケージがさらに依存しているもの |
たとえば、自分のプロジェクトが A に依存していて、A が B に依存している場合、自分から見ると B は推移的依存です。
your-app
-> package A
-> package B
node_modules が大きくなる理由の多くは、この推移的依存にあります。
package manager の役割
package managerは、依存関係を入れる、更新する、削除する、記録するためのツールです。
代表例:
- npm
- pnpm
- Yarn
- Bun
package managerは、次のような仕事をします。
- 必要なパッケージをダウンロードする
- バージョンを解決する
node_modulesを作る- lockfileを更新する
- scriptsを実行する
つまり npm install は、単なるダウンロードではなく、依存関係全体の整合性を取る処理です。
dependencies と devDependencies
package.json には、依存関係を書く場所が複数あります。
{
"dependencies": {
"astro": "^6.0.0"
},
"devDependencies": {
"typescript": "^5.0.0"
}
}
| 項目 | 用途 |
|---|---|
| dependencies | アプリの実行に必要なもの |
| devDependencies | 開発やビルドに必要なもの |
ただしフロントエンドの静的サイトでは、ビルド時に使うものが多いため、境界が少し分かりにくいことがあります。実務では、プロジェクトの慣習に合わせて管理します。
依存関係で起きる問題
依存関係は便利ですが、トラブルも生みます。
よくある問題:
- バージョン差で動かない
- lockfileがずれている
- Node.jsのバージョンが合わない
- パッケージの破壊的変更で壊れる
- 不要なライブラリが増えて重くなる
エラーが出た時は、自分のコードだけでなく、package.json、lockfile、Node.jsのバージョンも確認します。
ポイント: 依存関係は「便利な部品」ですが、プロジェクトの一部です。入れるほど保守対象も増えます。
まとめ
依存関係とは、自分のプロジェクトが使っている外部パッケージとの関係です。package managerは、その依存関係を解決し、インストールし、記録します。
npm install で何かが増えた時は、「直接入れたもの」と「それが連れてきたもの」を分けて考えると理解しやすくなります。