Episode ini membahas server-side rendering dan Angular Universal: dasar-dasar Universal, perbedaan prerendering dan SSR, peningkatan SEO dan initial load, serta hydration dan interaksi antara server dan client.

Aplikasi Angular standar dirender di browser, sehingga crawler dan pengguna melihat layar kosong selama JavaScript dimuat. Server-side rendering memindahkan pekerjaan merender HTML ke server, menghasilkan halaman yang langsung bisa dibaca.
Episode 21 membahas dasar-dasar Angular Universal, perbedaan prerendering dan server-side rendering, peningkatan SEO dan initial load, serta hydration dan interaksi antara server dan client. Kalian akan memahami kapan SSR diperlukan dan bagaimana konfigurasinya.
Konsep kuncinya adalah satu aplikasi, dua lingkungan eksekusi. Browser dan server sama-sama menjalankan komponen yang sama, tetapi dengan tanggung jawab yang berbeda.
Universal adalah cara Angular untuk merender aplikasi di server. Pemasangannya cukup dengan satu perintah:
ng add @angular/nguniversalPerintah ini menambahkan server.ts, builder server di angular.json, dan skrip dev:ssr, build:ssr, serta serve:ssr. File main.server.ts menjadi entry point server yang menggunakan renderApplication atau renderModule.
import { renderApplication } from "@angular/platform-server";
import { AppComponent } from "./app/app.component";
import { appConfig } from "./app/app.config";
const bootstrap = () => import("./main").then(() => AppComponent);
renderApplication(AppComponent, {
providers: appConfig.providers,
});Mode development menjalankan server Node sekaligus rebuild otomatis:
npm run dev:ssrSetiap perubahan file langsung direfleksikan, dan kalian bisa memeriksa hasil HTML yang dikirim server lewat view-source browser.
Prerendering mengubah setiap route menjadi file HTML saat build. Jalankan build dengan prerender:
ng build --prerenderHasilnya adalah folder statis yang bisa dilayani oleh CDN mana pun. Cocok untuk halaman yang isinya sama untuk semua pengguna.
Server-side rendering menghasilkan HTML setiap kali ada request, jadi isi halaman bisa berbeda per pengguna:
ng build
npm run serve:ssrserve:ssr menjalankan server Node dari file server.ts. Pilih prerender jika halaman hampir statis, dan SSR jika halaman bergantung pada data pengguna, session, atau cookie.
Halaman yang dirender server bisa menyuntikkan meta tag yang dibaca crawler dan media sosial. Angular menyediakan Meta dan Title dari @angular/platform-browser:
import { Injectable } from "@angular/core";
import { Meta, Title } from "@angular/platform-browser";
@Injectable({ providedIn: "root" })
export class SeoService {
constructor(private title: Title, private meta: Meta) {}
update(title: string, description: string): void {
this.title.setTitle(title);
this.meta.updateTag({ name: "description", content: description });
}
}Dengan SSR, meta tag ini sudah ada di HTML yang diterima crawler, sehingga Google tidak perlu menunggu JavaScript.
Pengguna melihat konten yang dirender server lebih cepat, dan browser mengerjakan lebih sedikit pekerjaan untuk first paint. Metric seperti Largest Contentful Paint dan waktu menuju interactive biasanya membaik secara signifikan.
Hydration adalah proses menyambungkan aplikasi Angular ke HTML yang sudah dirender server. Aktifkan dengan provideClientHydration:
import { provideClientHydration } from "@angular/platform-browser";
import { ApplicationConfig } from "@angular/core";
export const appConfig: ApplicationConfig = {
providers: [provideClientHydration()],
};Setelah hydration aktif, Angular mengenali DOM yang sudah ada, melekatkan event listener, dan tidak membuat ulang halaman dari nol. Hasilnya tidak ada kedipan layar dan interaksi langsung bisa digunakan.
Server yang mengambil data di awal bisa membagikan hasilnya ke client lewat TransferState, sehingga client tidak perlu mengambil data yang sama dua kali:
import { TransferState, makeStateKey } from "@angular/core";
import { inject } from "@angular/core";
const CATEGORIES_KEY = makeStateKey("categories");
// di server: tulis data
// transferState.set(CATEGORIES_KEY, categories);
// di client: baca data
// const categories = transferState.get(CATEGORIES_KEY, null);Ini mencegah flash of empty content dan double fetch, dua masalah umum pada aplikasi SSR tanpa TransferState.
Inti yang harus dibawa pulang:
Di episode 22 berikutnya kita akan membahas observability dan monitoring — logging error frontend dan metrik performa, monitoring interaksi pengguna, error reporting dengan Sentry atau LogRocket, serta dukungan production dan penanganan insiden.