Feature modules divide the application into logical parts - like provinces of feudal Japan, each with its own specialization.
Groups business functionality:
1// features/samurai/samurai.module.ts
2@NgModule({
3 declarations: [
4 SamuraiListComponent,
5 SamuraiDetailComponent,
6 SamuraiFormComponent
7 ],
8 imports: [
9 CommonModule,
10 SharedModule,
11 SamuraiRoutingModule
12 ],
13 exports: [SamuraiListComponent]
14})
15export class SamuraiModule { }Contains reusable elements:
1// shared/shared.module.ts
2@NgModule({
3 declarations: [
4 ButtonComponent,
5 CardComponent,
6 LoadingSpinnerComponent,
7 HighlightDirective,
8 TruncatePipe
9 ],
10 imports: [CommonModule],
11 exports: [
12 // We export EVERYTHING that can be used in other modules
13 CommonModule,
14 ButtonComponent,
15 CardComponent,
16 LoadingSpinnerComponent,
17 HighlightDirective,
18 TruncatePipe
19 ]
20})
21export class SharedModule { }Singletons and elements loaded once:
1// core/core.module.ts
2@NgModule({
3 imports: [
4 CommonModule,
5 HttpClientModule
6 ],
7 providers: [
8 AuthService,
9 LoggingService,
10 { provide: HTTP_INTERCEPTORS, useClass: AuthInterceptor, multi: true }
11 ]
12})
13export class CoreModule {
14 // Protection against multiple imports
15 constructor(@Optional() @SkipSelf() parentModule: CoreModule) {
16 if (parentModule) {
17 throw new Error('CoreModule already loaded. Import only in AppModule!');
18 }
19 }
20}1src/app/
2βββ core/ # Singleton services, guards, interceptors
3β βββ core.module.ts
4β βββ services/
5β β βββ auth.service.ts
6β β βββ api.service.ts
7β βββ guards/
8β βββ interceptors/
9β
10βββ shared/ # Reusable components, directives, pipes
11β βββ shared.module.ts
12β βββ components/
13β βββ directives/
14β βββ pipes/
15β
16βββ features/ # Feature modules
17β βββ samurai/
18β β βββ samurai.module.ts
19β β βββ samurai-routing.module.ts
20β β βββ components/
21β β βββ services/
22β β βββ models/
23β βββ dojo/
24β
25βββ app.module.ts
26βββ app.component.ts
27βββ app-routing.module.ts