Angularモジュールの最適化と構成管理

Angularアプリケーションが成長すると、機能の整理やモジュールの構成が重要になります。
本章では、スケーラブルな構成を実現するためのFeature ModulesCoreModuleSharedModuleの使い分け、サービスのスコープ管理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最適化で、開発生産性と品質が大きく向上します。

採用情報 長谷川 横バージョン
SHARE
PHP Code Snippets Powered By : XYZScripts.com