Dev Study
← Angular コース

84. ディレクトリ構成 — feature単位で切り、sharedに寄せる

フォルダは「ファイルの種類」ではなく「機能(feature)」の単位で切ります。features/products/ の中に商品機能のページ・部品・サービス・型をまとめて置けば、商品の修正で開くフォルダは1つで済みます。複数の機能から使う共通部品やパイプは shared/ に置き、依存の向きは「feature → shared」の一方向に保ちます。

この一方向ルールが実務で効くのは、影響範囲が読めるようになるからです。feature同士が直接依存し合うと、商品機能の修正が注文機能を壊す、といった連鎖が起きます。共有したいものは一度 shared に降ろしてから使う、と決めておけば、機能の追加も削除もフォルダ単位で安全に行えます。

落とし穴は、最初から完璧な構成を目指して手が止まることです。ファイルが数個のうちは平らに置いて構いません。目安は「3つ目の類似ファイルが出たら整理する」です。実際にコードが増えてから分類したほうが、想像で作った空フォルダより正確な構成になります。

サンプルコード(フレームワーク環境が必要なため表示のみ)

// ── feature単位のディレクトリ構成(例) ──
//
// src/app/
// ├── features/                  # 機能ごとにフォルダを切る
// │   ├── products/              # 商品機能のものは全部ここ
// │   │   ├── product-list-page.ts
// │   │   ├── product-card.ts
// │   │   ├── product.service.ts
// │   │   └── product.model.ts
// │   └── orders/                # 注文機能
// │       └── ...
// ├── shared/                    # 複数機能から使う共通部品
// │   ├── ui/                    # ボタン・バッジなどの表示部品
// │   └── pipes/                 # 共通パイプ
// ├── app.ts
// ├── app.config.ts
// └── app.routes.ts
//
// 依存の向きは features → shared の一方向だけ
// (features同士の直接依存と shared → features は作らない)
サンプルコードで身につける(5本) →

学んだ概念を、素朴な例から実務寄りの例まで5つの具体例で確認します。

公式ドキュメントで詳しく ↗