Angular Performance Optimization: เทคนิคเพิ่มความเร็ว App

#angular12 เม.ย. 2569

ทำไม Performance ถึงสำคัญ

App ที่ช้าทำให้ user experience แย่ Google ใช้ Core Web Vitals เป็นปัจจัย SEO ด้วย

1. OnPush Change Detection

@Component({
  changeDetection: ChangeDetectionStrategy.OnPush
})

2. TrackBy ใน ngFor

// ❌ ไม่มี trackBy - re-render ทุก item ทุกครั้ง
<li *ngFor="let user of users">{{ user.name }}</li>

// ✅ มี trackBy - re-render เฉพาะที่เปลี่ยน
<li *ngFor="let user of users; trackBy: trackByUserId">
  {{ user.name }}
</li>

trackByUserId(index: number, user: User): number {
  return user.id;
}

3. Lazy Loading

{ path: 'heavy', loadComponent: () => import('./heavy.component') }

4. Virtual Scrolling

import { ScrollingModule } from '@angular/cdk/scrolling';

@Component({
  imports: [ScrollingModule],
  template: `
    <cdk-virtual-scroll-viewport itemSize="50" style="height: 400px">
      <div *cdkVirtualFor="let item of items">{{ item }}</div>
    </cdk-virtual-scroll-viewport>
  `
})

5. Defer Block

@defer (on idle) {
  <app-analytics-chart />
}

6. Image Optimization

import { NgOptimizedImage } from '@angular/common';

@Component({
  imports: [NgOptimizedImage],
  template: `
    <img ngSrc="/hero.jpg" width="800" height="400" priority />
  `
})

7. Memoization ด้วย Signals

const expensiveResult = computed(() => {
  return heavyCalculation(this.data());
});
// computed จะ cache ผลลัพธ์ รันใหม่เฉพาะเมื่อ data() เปลี่ยน

8. Avoid Memory Leaks

private destroy$ = new Subject<void>();

ngOnInit() {
  this.service.getData()
    .pipe(takeUntil(this.destroy$))
    .subscribe(...);
}

ngOnDestroy() {
  this.destroy$.next();
  this.destroy$.complete();
}

สรุป

เริ่มจาก OnPush + trackBy + Lazy Loading ก่อน แล้วค่อย profile ด้วย Chrome DevTools เพื่อหา bottleneck จริงๆ ครับ