依存グラフ
モジュールやパッケージ間の依存関係をグラフ構造で表現し、ビルド順序や影響範囲を分析する
ビルド設計
依存グラフとは
依存グラフ (Dependency Graph) は、モジュール、パッケージ、サービス間の依存関係を有向グラフで表現したものである。webpack や Vite がバンドルを生成する際、import 文を辿って依存グラフを構築し、必要なモジュールだけをバンドルに含める。
依存グラフの用途
| 用途 | ツール |
|---|---|
| バンドル生成 | webpack, Vite, esbuild |
| Tree Shaking | 未使用コードの除去 |
| コード分割 | 動的 import でチャンクを分割 |
| ビルド順序 | Turborepo, Nx (モノレポ) |
| 影響範囲分析 | 変更したモジュールに依存するテストだけ実行 |
import から依存グラフを構築
// index.ts → App.tsx → Header.tsx
// → UserList.tsx → api.ts
// → types.ts
// webpack / Vite がエントリーポイント (index.ts) から
// import を再帰的に辿って依存グラフを構築
index.ts
└── App.tsx
├── Header.tsx
└── UserList.tsx
├── api.ts
└── types.ts
循環依存
// ❌ 循環依存: A → B → A
// a.ts
import { b } from './b';
export const a = b + 1;
// b.ts
import { a } from './a';
export const b = a + 1;
// → 実行時に undefined になる
循環依存はバグの温床。ESLint の import/no-cycle ルールで検出する。
Tree Shaking
// utils.ts
export function add(a: number, b: number) { return a + b; }
export function multiply(a: number, b: number) { return a * b; } // 未使用
// main.ts
import { add } from './utils';
console.log(add(1, 2));
// バンドル結果: multiply は含まれない (Tree Shaking)
依存グラフで「どのエクスポートが実際に使われているか」を分析し、未使用コードを除去する。
モノレポでの依存グラフ
packages/
├── ui/ → shared に依存
├── api/ → shared に依存
└── shared/ → 依存なし
ビルド順序: shared → ui, api (並列)
Turborepo や Nx は依存グラフに基づいてビルド順序を決定し、変更のないパッケージのビルドをスキップする。
npm の依存グラフ
# 依存ツリーの表示
npm ls --all
# 脆弱性のある依存を表示
npm audit
さらに掘り下げるなら関連書籍が参考になる。