Nextjs Static Generation SSR ISR Dynamic Rendering
Definisi
Di Next.js App Router, halaman bisa dirender dengan beberapa strategi berbeda:
Static Generation (SSG): HTML dibuat saat build, lalu dipakai ulang untuk banyak request.
Server Side Rendering (SSR): HTML dibuat saat request masuk.
Incremental Static Regeneration (ISR): halaman statis dibangun dulu, lalu diperbarui berkala atau on-demand tanpa rebuild penuh.
Dynamic Rendering: halaman selalu dirender secara dinamis di server karena kontennya bergantung pada request, user, atau data yang harus fresh.
Keempat mode ini bukan label kosmetik. Mereka memengaruhi:
kapan data diambil
kapan HTML dibuat
apa yang boleh di-cache
seberapa cepat halaman pertama tampil
seberapa mudah konten berubah di production
Kalau dipahami sebagai satu sistem, persoalannya bukan “pakai rendering apa?”, melainkan “konten ini boleh basi berapa lama, dan siapa yang menentukan hasilnya?”.
Kapan dipakai
Static Generation
Pakai SSG kalau konten relatif stabil dan aman dibangun di muka.
Cocok untuk:
landing page marketing
dokumentasi publik
halaman about / help yang jarang berubah
artikel blog yang tidak bergantung pada user
halaman katalog yang isinya tidak berubah setiap request
SSG cocok saat kamu ingin:
response sangat cepat
beban server rendah
cache alami dari CDN atau static hosting
SEO yang stabil karena HTML sudah siap sejak awal
Server Side Rendering
Pakai SSR kalau HTML harus selalu dibentuk berdasarkan request terbaru.
Cocok untuk:
dashboard personal
halaman yang bergantung pada cookie atau session
data yang sangat sensitif terhadap waktu
halaman yang harus menyesuaikan header, locale, A/B flag, atau auth state
SSR cocok saat kamu butuh:
data fresh per request
variasi konten berdasarkan user
keputusan yang tidak boleh ditunda ke cache lama
Konsekuensinya:
setiap request membayar biaya render
cache lebih sulit dipakai secara agresif
latency sering lebih tinggi daripada SSG
Incremental Static Regeneration
Pakai ISR kalau kontennya statis sebagian besar waktu, tapi tetap harus bisa berubah tanpa rebuild penuh.
Cocok untuk:
blog post yang kadang diedit
katalog produk
halaman listing yang update periodik
halaman publik yang tidak perlu fresh per detik
konten yang bisa toleran stale window singkat
ISR cocok saat kamu ingin:
performa mirip static
data tetap bisa berubah
pembaruan terjadwal atau on-demand
Dynamic Rendering
Pakai dynamic rendering kalau hasil render benar-benar bergantung pada request runtime.
Cocok untuk:
halaman yang membaca cookies, headers, atau session
konten personalisasi
halaman preview draft
hasil pencarian atau filter yang perlu bereaksi ke request
halaman yang memakai data yang harus selalu fresh dan tidak aman di-cache
Dynamic rendering adalah pilihan default secara praktis ketika App Router melihat sinyal bahwa halaman tidak aman diperlakukan statis.
Cara kerja strategi render di App Router
App Router tidak memilih strategi hanya dari nama file. Ia menyimpulkan strategi dari kombinasi:
penggunaan fetch() dan opsi caching-nya
penggunaan Dynamic APIs seperti cookies(), headers(), atau searchParams tertentu
konfigurasi segment seperti dynamic, revalidate, dan fetchCache
keberadaan generateStaticParams() untuk route dinamis
apakah route perlu membaca data yang hanya tersedia saat request
Artinya, satu page bisa terlihat statis di local, tapi berubah menjadi dinamis di production karena ada satu dependency yang memaksa request-time render.
Aturan besar yang perlu diingat
Kalau semua data bisa diketahui saat build dan tidak ada Dynamic API, halaman cenderung statis.
Kalau ada data yang diberi waktu revalidate, halaman masih bisa statis tetapi punya refresh window.
Kalau ada cookies(), headers(), no-store, atau konfigurasi eksplisit dinamis, halaman cenderung SSR / dynamic.
Route dinamis tanpa generateStaticParams() tidak otomatis statis.
Diagram keputusan render strategy
Loading diagram...
Static Generation (SSG)
SSG membangun HTML saat build. Hasilnya disimpan sebagai output yang bisa disajikan cepat tanpa menjalankan render penuh untuk setiap request.
Karakter utama
HTML siap lebih awal
request user hanya mengambil hasil yang sudah jadi