Performance: Shared modules for reusable components
This affects initial page load speed and bundle size by controlling how reusable components are loaded and shared across the app.
import { CommonModule } from '@angular/common'; import { ComponentA } from './component-a.component'; @NgModule({ declarations: [ComponentA], imports: [CommonModule], exports: [ComponentA] }) export class SharedModule {} @NgModule({ imports: [CommonModule, SharedModule] }) export class FeatureModule1 {} @NgModule({ imports: [CommonModule, SharedModule] }) export class FeatureModule2 {}
import { CommonModule } from '@angular/common'; import { ComponentA } from './component-a.component'; @NgModule({ declarations: [ComponentA], imports: [CommonModule], exports: [ComponentA] }) export class FeatureModule1 {} @NgModule({ declarations: [ComponentA], imports: [CommonModule], exports: [ComponentA] }) export class FeatureModule2 {}
| Pattern | DOM Operations | Reflows | Paint Cost | Verdict |
|---|---|---|---|---|
| Duplicate component declarations in multiple modules | No extra DOM nodes but duplicated JS code | No direct reflows caused | Increased paint cost due to slower JS execution | [X] Bad |
| Single shared module for reusable components | No extra DOM nodes, shared JS code | No direct reflows caused | Lower paint cost due to smaller JS bundle | [OK] Good |
FeatureComponent uses SharedButtonComponent?
@NgModule({
declarations: [SharedButtonComponent],
exports: [SharedButtonComponent]
})
export class SharedModule {}
@NgModule({
imports: [SharedModule],
declarations: [FeatureComponent]
})
export class FeatureModule {}
If FeatureComponent template contains <app-shared-button>Click</app-shared-button>, what happens?@NgModule({
declarations: [SharedCardComponent],
imports: [CommonModule]
})
export class SharedModule {}
@NgModule({
imports: [SharedModule],
declarations: [DashboardComponent]
})
export class DashboardModule {}
DashboardComponent template uses <app-shared-card> but Angular throws an error.// SharedModule
@NgModule({
declarations: [SharedButtonComponent, CustomPipe],
exports: [SharedButtonComponent, CustomPipe],
imports: [CommonModule]
})
export class SharedModule {}
// FeatureModule
@NgModule({
imports: [SharedModule],
declarations: [FeatureComponent]
})
export class FeatureModule {}
What must you do in FeatureComponent template to use both?| customPipe (pipe names are case-sensitive and lowercase by convention).Pass the test and this pattern moves unknown