Angularアプリケーションが成長すると、機能の整理やモジュールの構成が重要になります。
本章では、スケーラブルな構成を実現するためのFeature Modules、CoreModule、SharedModuleの使い分け、サービスのスコープ管理、Barrelファイルによるimportの最適化について詳しく解説します。

1. スケーラブルな構成設計
Angularでは、機能ごとに分割されたモジュール設計が推奨されます。以下の3種のモジュールを意識して構成することで、保守性が高まり、再利用もしやすくなります。
■ Feature Modules(機能単位のモジュール)
特定の機能ごとに独立したモジュール。画面ごと、ドメインごとに設計されます。
例:user/
、admin/
、dashboard/
など
ng generate module user --route user --module app
でLazy Loading対応のルート付きモジュールも作成可能です。
■ CoreModule(アプリ全体で1回だけ使うサービス群)
認証やグローバルなナビゲーションなど、アプリ全体で一度だけ提供されるサービスをまとめます。
ルートモジュール(AppModule)のみでimportし、他ではimportしないのが原則です。
CoreModuleの定義例:
@NgModule({
providers: [AuthService, ApiService]
})
export class CoreModule {}
■ SharedModule(UI部品・パイプ・ディレクティブなどの共有)
複数のモジュールで使い回す共通部品(コンポーネント、パイプ、ディレクティブなど)をまとめます。
@NgModule({
declarations: [CardComponent, CustomPipe],
exports: [CardComponent, CustomPipe, CommonModule, FormsModule]
})
export class SharedModule {}
SharedModuleは複数のモジュールで再利用されても問題ありません(ただしサービスは提供しないこと)。
2. サービスのスコープ管理
サービスの提供範囲(スコープ)を明確にすることで、意図しないインスタンスの共有や重複を防げます。
■ @Injectable({ providedIn }) の使い分け
providedIn: 'root'
:アプリ全体で1つのインスタンス(グローバル)providedIn: 'any'
:各モジュール/コンポーネント単位でインスタンス化(再利用可)- モジュールの
providers
に登録:限定的なスコープにしたい場合
■ CoreModuleにまとめる理由
アプリ全体で共有したいサービス(例:AuthService)はCoreModuleにまとめ、AppModuleのみでimportします。
AppModule:imports: [CoreModule]
※ 他のFeatureModuleではCoreModuleをimportしないよう注意。
3. Barrelファイルによるimport最適化
Barrel(バレル)とは、複数のモジュールやコンポーネント、サービスを一括で再エクスポートするindex.ts
ファイルのことです。これによりimport文が簡潔になり、コードの可読性と保守性が向上します。
■ 例:userディレクトリ内のBarrel
src/app/user/index.ts
:
export * from './user.component';
export * from './user.service';
export * from './user.module';
■ 使用側(import文の簡略化)
import { UserService } from 'src/app/user';
モジュールやサービスが増えてきたら、Barrel構成を導入するとチーム全体の開発効率が向上します。
まとめ
大規模・中長期開発においては、モジュールの分割と構成管理は非常に重要な設計要素です。FeatureModuleで機能を分離し、CoreModule/SharedModuleで共通処理を整理することで、アプリ全体が見通しよく保守性の高い構造になります。
さらに、サービススコープの明確化とBarrelによるimport最適化で、開発生産性と品質が大きく向上します。