Angular SSR ด้วย Angular Universal: Server-Side Rendering
#angular12 เม.ย. 2569
Angular SSR คืออะไร
Angular Universal ช่วยให้ render HTML บน server ก่อนส่งไปยัง browser ทำให้
- SEO ดีขึ้น เพราะ crawler เห็น content
- First Contentful Paint (FCP) เร็วขึ้น
- Social media preview ทำงานได้
ติดตั้ง SSR
ng add @angular/ssr
คำสั่งนี้จะสร้างไฟล์ที่จำเป็นให้อัตโนมัติ
โครงสร้างหลัง SSR
src/
app/
app.config.ts # client config
app.config.server.ts # server config
main.ts # client bootstrap
main.server.ts # server bootstrap
server.ts # Express server
isPlatformBrowser
บางโค้ดรันได้เฉพาะ browser เช่น localStorage, window
import { isPlatformBrowser } from '@angular/common';
import { PLATFORM_ID, inject } from '@angular/core';
export class MyComponent {
private platformId = inject(PLATFORM_ID);
ngOnInit() {
if (isPlatformBrowser(this.platformId)) {
// โค้ดที่รันได้เฉพาะ browser
const token = localStorage.getItem('token');
}
}
}
TransferState
ส่งข้อมูลจาก server ไป client เพื่อไม่ต้อง fetch ซ้ำ
import { TransferState, makeStateKey } from '@angular/core';
const USERS_KEY = makeStateKey<User[]>('users');
export class UserService {
private transferState = inject(TransferState);
getUsers(): Observable<User[]> {
if (this.transferState.hasKey(USERS_KEY)) {
const users = this.transferState.get(USERS_KEY, []);
this.transferState.remove(USERS_KEY);
return of(users);
}
return this.http.get<User[]>('/api/users').pipe(
tap(users => this.transferState.set(USERS_KEY, users))
);
}
}
Build และ Run
ng build
node dist/my-app/server/server.mjs
สรุป
Angular SSR เหมาะกับ app ที่ต้องการ SEO หรือ performance บน first load ควรระวังการใช้ browser-only APIs และใช้ isPlatformBrowser ตรวจสอบก่อนเสมอครับ