NgModuleについて
- Angularは
NgModuleと呼ばれるモジュールシステムによってモジュール化されている- 似通った機能をモジュール化してまとめておくことがベストプラクティスとなる
- 他のモジュールをインポートしたり、他のモジュールに公開する機能をエクスポートできる
- すべてのAngularアプリは
AppModuleと呼ばれるルートモジュールを持つ-
app.module.tsという名前で定義される
-
NgModuleのメタデータ
- 他のAngularの要素と同じく、
@NgModuleデコレータによって定義され、いくつかのメタデータを持つ-
declarations: モジュールに属するView要素(componentなど) -
exports:declarationsのうち他モジュールに公開できるもの -
providers: このNgModuleが公開するサービスを提供するクラス群 -
bootstrap: 起動時に表示するcomponent(ルートコンポーネント)を指定する
-
import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
@NgModule({
imports: [ BrowserModule ],
providers: [ Logger ],
declarations: [ AppComponent ],
exports: [ AppComponent ],
bootstrap: [ AppComponent ]
})
export class AppModule { }
ES2015のモジュールとNgModule
- ES2015のモジュールと
NgModuleは全く違う概念 - ES2015モジュールでは、「別の1ファイルをインポートすること」がモジュールで、複数ファイルを纏めたモジュールというのは存在しない
-
NgModuleはES2015よりもさらに大きな塊をモジュール化していると言える- 当然内部的にES2015モジュールは活用されている
NgModule の遅延ロード
NgModule のインポートは一般的にはコンパイル時に解決される。すなわち、生成されるindex.jsファイルにすべてのインポートされたモジュールが含まれることになる。しかしこれにはindex.jsが肥大化し、初期ロード時間が長くなってしまうというデメリットもある。
そこで、特定のパスに遷移したときに初めて読み込まれる、という手法で、初期インポートされるモジュールの肥大化を防ぐことができる。
export const routes: Routes = [
{ path: '', redirectTo: 'contact', pathMatch: 'full'},
{ path: 'items', loadChildren: () => import('./items/items.module').then(m => m.ItemsModule) },
{ path: 'customers', loadChildren: () => import('./customers/customers.module').then(m => m.CustomersModule) }
];
