Angular Lazy Loading และ Code Splitting เพิ่ม Performance

#angular12 เม.ย. 2569

Lazy Loading คืออะไร

Lazy Loading คือการโหลด module หรือ component เฉพาะเมื่อ user เข้าถึง route นั้น ช่วยลด initial bundle size ทำให้ app โหลดเร็วขึ้น

Lazy Loading Component (Standalone)

// app.routes.ts
export const routes: Routes = [
  {
    path: 'dashboard',
    loadComponent: () =>
      import('./dashboard/dashboard.component')
        .then(m => m.DashboardComponent)
  },
  {
    path: 'admin',
    loadChildren: () =>
      import('./admin/admin.routes')
        .then(m => m.adminRoutes)
  }
];

Preloading Strategy

import { PreloadAllModules, provideRouter, withPreloading } from '@angular/router';

bootstrapApplication(AppComponent, {
  providers: [
    provideRouter(
      routes,
      withPreloading(PreloadAllModules)
    )
  ]
});

Custom Preloading

import { PreloadingStrategy, Route } from '@angular/router';
import { Observable, of } from 'rxjs';

export class SelectivePreloading implements PreloadingStrategy {
  preload(route: Route, load: () => Observable<any>): Observable<any> {
    return route.data?.['preload'] ? load() : of(null);
  }
}

// routes
{
  path: 'popular',
  loadComponent: () => import('./popular.component').then(m => m.PopularComponent),
  data: { preload: true }
}

Defer Block (Angular 17+)

@defer (on viewport) {
  <app-heavy-chart />
} @placeholder {
  <div>กำลังโหลด...</div>
} @loading {
  <app-spinner />
} @error {
  <p>โหลดไม่สำเร็จ</p>
}

วิเคราะห์ Bundle Size

ng build --stats-json
npx webpack-bundle-analyzer dist/stats.json

สรุป

Lazy Loading เป็น must-have สำหรับ Angular app ขนาดใหญ่ ใช้ loadComponent สำหรับ standalone และ @defer สำหรับ component ที่ไม่ต้องโหลดทันทีครับ