モジュール性と再利用性を高める Angular のプロジェクト構成
Angular アプリケーションを core、features、shared に分け、依存関係の境界を明確にするフォルダ構成を紹介します。
ディレクトリ構成
- core
- 定数、ガード、インターセプター、モデル、サービスなど、アプリケーション全体で使用する機能を含みます。
featuresから参照できますが、coreから features や shared のコードを参照してはいけません。
- features
- 機能モジュールごとにディレクトリを作成します。
- 各機能モジュールは
coreやsharedを参照できますが、機能モジュール同士は独立させます。
- shared
- ディレクティブ、フォーム、パイプ、サービスなど、再利用可能なコードを含みます。
featuresから利用できますが、sharedから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 を参照せず、各機能モジュールは 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 にデプロイする
FastAPI で書いた API バックエンドをコンテナ化し、Lambda Web Adapter と AWS CDK を使って単一の Lambda 関数へデプロイします。
Jest で ECMAScript Modules をテストする
package.json、TypeScript、Jest の設定を連携させ、Jest の "Cannot use import statement outside a module" エラーを解消する方法を紹介します。
