[Lv3] Tantangan dan Solusi Implementasi SSR
Proyek SSR nyata biasanya gagal di area batas: konsistensi hydration, perbedaan environment, kompatibilitas pihak ketiga, dan performa saat beban tinggi.
Skenario wawancara
Q: Tantangan SSR apa yang pernah Anda hadapi, dan bagaimana Anda menyelesaikannya?
Jawaban yang kuat seharusnya mencakup mode kegagalan nyata, akar penyebab, dan perbaikan yang terukur.
1. Tantangan: Hydration Mismatch
Gejala
- Peringatan hydration Vue/React
- Click handler rusak setelah render awal
- UI flicker yang tidak terduga saat mount
Akar penyebab
- Output server non-deterministik (
Date.now(), nilai acak) - Browser-only API dieksekusi saat SSR
- Logika kondisional berbeda di server/client
Solusi
- Jaga render pertama tetap deterministik
- Lindungi browser API dengan hook client-only
- Bungkus fragmen browser-only dengan
ClientOnlysaat tepat
2. Tantangan: gap environment server vs client
Masalah umum
- Mengakses
window,document,localStoragedi server - Mengasumsikan konsistensi timezone/locale
- Membaca runtime config secara keliru
Solusi
- Gunakan environment guard (
process.server,process.client) - Standarkan rendering yang sensitif timezone
- Pisahkan private server runtime config dari public client config
3. Tantangan: inkompatibilitas library pihak ketiga
Masalah umum
- Library yang membutuhkan DOM saat import time
- Script tracking yang memodifikasi DOM saat hydration
Solusi
- Dynamic import dalam konteks client-only
- Enkapsulasi integrasi dalam komponen client khusus
- Tunda eksekusi pihak ketiga yang tidak kritis
4. Tantangan: performa SSR dan TTFB
Bottleneck umum
- API waterfall yang serial
- Tidak ada strategi cache untuk endpoint mahal
- Payload yang dikirim ke client terlalu besar
Solusi
- Paralelkan request independen
- Terapkan server caching dengan TTL pendek
- Hindari mengirim state yang tidak diperlukan dalam payload
- Lakukan stream atau defer untuk bagian yang tidak kritis bila memungkinkan
5. Tantangan: caching dan invalidation
Risiko
- Metadata SEO basi
- Konten spesifik pengguna bocor melalui shared cache
Solusi
- Cache hanya response publik yang aman
- Sertakan cache key untuk locale dan route params
- Definisikan event invalidation dan kebijakan TTL yang jelas
6. Tantangan: gap observability
Apa yang perlu dipantau
- TTFB/LCP/CLS per route
- Tingkat error server dan timeout
- Rasio cache hit
- Frekuensi peringatan hydration di log
Hasil
Instrumentasi mengubah "SSR terasa lambat" menjadi angka yang bisa ditindaklanjuti.
9. Tantangan: Server-side Memory Leak
Penyebab umum
- Cache global dengan pertumbuhan tanpa batas
- Timer/subscription tidak dibersihkan saat route churn
- Objek per-request tertahan di module scope yang berumur panjang
Solusi
- Tambahkan kebijakan cache terbatas (ukuran + TTL)
- Pastikan teardown untuk timer/listener/worker
- Hindari menahan request context setelah response selesai
- Lacak tren pertumbuhan heap dan ambil snapshot di staging
11. Tantangan: Arsitektur Deployment (SSR vs SPA)
Perbedaan utama
- SSR membutuhkan runtime server, layer cache, dan perencanaan cold-start
- Static hosting SPA lebih sederhana tetapi lebih lemah untuk halaman dinamis yang kritis SEO
- Rollout SSR membutuhkan observability untuk TTFB, tingkat error, dan perilaku cache
Checklist deployment praktis
- Runtime config spesifik environment
- Strategi CDN dan edge cache
- Health check dan fallback yang graceful
- Rilis blue-green/canary dengan jalur rollback
Ringkasan siap wawancara
Kompleksitas SSR sebagian besar adalah manajemen batas. Saya menstabilkan output server/client, mengisolasi kode browser-only, mengendalikan API waterfall dengan caching, dan melacak metrik per route agar performa serta kualitas SEO tetap andal di produksi.