モジュール性と再利用性を高める Angular のプロジェクト構成
core、features、shared の各モジュールに依存の方向を定め、機能を独立させつつ再利用可能なコードを一箇所に集約する Angular のフォルダ構成。
ディレクトリ構成
- core
- 定数、ガード、インターセプター、モデル、サービスなど、アプリケーションのコアとなる機能を含みます。
- これらは
featuresディレクトリから参照できますが、features や shared のコンポーネントを参照してはいけません。
- features
- 各機能モジュールはここに配置されます。
- これらのモジュールは
coreやsharedを参照できますが、モジュール性を保つために、アプリケーションの他の部分から独立している必要があります。
- shared
- ディレクティブ、フォーム、パイプ、サービスなど、再利用可能な部品を含みます。
- これらは
featuresから利用可能ですが、featuresを参照してはいけません。

src/├── app/│ ├── core/│ │ ├── constants/│ │ ├── decorators/│ │ ├── guards/│ │ ├── interceptors/│ │ ├── interfaces/│ │ │ ├── api/│ │ ├── models/│ │ ├── resolvers/│ │ ├── services/│ │ │ ├── api/│ │ ├── validators/│ ├── features/│ │ ├── auth/│ │ │ ├── password-reset/│ │ │ ├── sign-in/│ │ │ ├── sign-up/│ │ │ ├── verify/│ │ │ ├── auth.module.ts│ │ │ ├── auth.service.ts│ │ │ ├── auth-routing.module.ts│ │ ├── .../│ ├── shared/│ │ ├── components/│ │ ├── directives/│ │ │ ├── attribute/│ │ │ ├── structural/│ │ ├── forms/│ │ │ ├── input/│ │ │ ├── select/│ │ │ ├── .../│ │ ├── pipes/│ │ ├── services/│ ├── app.component.ts│ ├── app.module.ts│ ├── app-routing.module.tsassets/environments/styles/tests/theme/global.scssAngular のコーディングスタイルガイドではフラットなディレクトリ構成を推奨していますが、フォルダ内のファイル数が 7 を超えたらサブディレクトリの導入を検討すべきです。
Consider creating sub-folders when a folder reaches seven or more files. – Angular coding style guide
参考
まとめ
Angular アプリを core、features、shared のディレクトリに整理し、それぞれに依存の方向を定めれば、機能モジュールを独立させつつ、再利用可能なコードを一箇所に集約できます。この構成を支えているのは、依存の方向を一方通行に保つというルールです。core は決して features や shared を参照してはならず、features は core と shared に依存できますが、機能同士で直接依存し合うことはできません。この一方通行の流れこそが、各機能モジュールの境界を予測可能にしています。つまり、ある機能に固有でないものは、機能間で直接インポートするのではなく core か shared に置くべきということです。スタイルガイドが挙げている「7 ファイル」という閾値は、shared/services や core/guards フォルダがさらに分割すべきほど混み合ってきたかどうかを判断する目安として妥当なものです。
Related posts
Jasmine でモックオブジェクトのプロパティをスパイする
モックオブジェクトのプロパティをスパイする際に発生する Jasmine の "already been spied upon" エラーを、Object.getOwnPropertyDescriptor で回避する方法。

AWS Amplify と Eclipse Mosquitto を連携させた MQTT メッセージング
AWS Amplify の PubSub モジュールを AWS IoT Core に接続する前に、ローカルの Eclipse Mosquitto ブローカーでテストする方法。
Cognito User PoolsとOIDCでSlackサインインを実装する
Cognito user poolをOIDC経由でSlackと連携させ、"Sign in with Slack"をAmplifyでNext.jsアプリに組み込みます。
Lambda Web AdapterでFastAPIをAWS Lambdaにデプロイする
Lambda Web Adapterを使うと、FastAPIで書いたAPIバックエンドをコンテナのまま単一のLambda関数にデプロイできます。
JestでECMAScript Modulesをテストする
package.json、TypeScript、Jestの設定を連携させ、Jestの"Cannot use import statement outside a module"エラーを解消する方法。
