Selami lebih dalam Incremental Static Regeneration (ISR) Next.js. Kuasai revalidasi berbasis waktu, on-demand, dan tag untuk memastikan kesegaran konten dan performa puncak bagi audiens global.
Revalidasi ISR Next.js: Panduan Global untuk Strategi Kesegaran Konten
Dalam lanskap digital modern, tuntutan pada aplikasi web adalah tindakan penyeimbangan yang konstan. Pengguna di seluruh dunia mengharapkan waktu muat secepat kilat, namun tim konten memerlukan kemampuan untuk memperbarui informasi secara instan. Secara historis, pengembang terpaksa memilih antara kecepatan mentah dari Static Site Generation (SSG) dan data real-time dari Server-Side Rendering (SSR). Dikotomi ini sering kali mengarah pada kompromi baik dalam performa maupun dinamisme konten.
Hadirilah Incremental Static Regeneration (ISR), sebuah fitur revolusioner di Next.js yang menawarkan yang terbaik dari kedua dunia. ISR memungkinkan Anda untuk membangun situs statis yang dapat diperbarui, atau direvalidasi, setelah dideploy, tanpa memerlukan pembangunan ulang penuh. Ini memberikan manfaat performa dari Content Delivery Network (CDN) global sambil memastikan konten Anda tidak pernah menjadi basi.
Panduan komprehensif ini dirancang untuk audiens pengembang global. Kami akan menjelajahi konsep inti ISR dan menyelami lebih dalam strategi revalidasi canggih, dari mekanisme berbasis waktu hingga pendekatan on-demand dan berbasis tag yang kuat. Tujuan kami adalah membekali Anda dengan pengetahuan untuk mengimplementasikan strategi kesegaran konten yang kuat, berperforma tinggi, dan sadar secara global dalam aplikasi Next.js Anda.
Apa itu Incremental Static Regeneration (ISR)? Tinjauan Mendasar
Pada intinya, ISR adalah evolusi dari SSG. Dengan SSG tradisional, seluruh situs Anda di-pra-render menjadi file HTML statis pada waktu build. Meskipun sangat cepat dan tangguh, ini berarti setiap pembaruan konten memerlukan build dan deployment baru yang lengkap, sebuah proses yang bisa lambat dan merepotkan untuk situs web besar yang padat konten.
ISR mendobrak batasan ini. Ini memungkinkan Anda untuk menentukan kebijakan revalidasi per halaman. Kebijakan ini memberitahu Next.js kapan dan bagaimana meregenerasi halaman statis di latar belakang sambil terus menyajikan versi yang ada dan di-cache kepada pengguna. Hasilnya adalah pengalaman pengguna yang mulus tanpa downtime atau penurunan performa, bahkan saat konten diperbarui.
Cara Kerja ISR: Model Stale-While-Revalidate
ISR beroperasi pada konsep yang dikenal luas dalam caching sebagai "stale-while-revalidate". Berikut adalah rincian langkah demi langkah:
- Build Awal: Pada waktu build, Next.js melakukan pra-render halaman seperti SSG standar.
- Permintaan Pertama: Pengguna pertama yang meminta halaman menerima HTML yang dihasilkan secara statis secara instan dari CDN.
- Pemicu Revalidasi: Ketika sebuah permintaan masuk setelah periode revalidasi yang ditentukan telah berlalu, pengguna masih dilayani halaman statis yang basi (di-cache) dengan segera.
- Regenerasi Latar Belakang: Secara bersamaan, Next.js memicu regenerasi halaman di latar belakang. Ia mengambil data terbaru dan membuat file HTML statis baru.
- Pembaruan Cache: Setelah regenerasi berhasil, cache CDN diperbarui dengan halaman baru.
- Permintaan Berikutnya: Semua pengguna berikutnya sekarang menerima halaman yang segar dan baru dibuat sampai periode revalidasi berikutnya berakhir.
Model ini brilian karena memprioritaskan pengalaman pengguna. Pengguna tidak pernah harus menunggu data diambil; mereka selalu mendapatkan respons instan dari cache.
Dua Pilar Revalidasi ISR
Next.js menyediakan dua metode utama untuk memicu revalidasi, masing-masing cocok untuk kasus penggunaan yang berbeda. Memahami keduanya adalah kunci untuk merancang strategi konten yang efektif.
1. Revalidasi Berbasis Waktu: Pendekatan Otomatis
Revalidasi berbasis waktu adalah bentuk ISR yang paling sederhana. Anda mendefinisikan time-to-live (TTL) dalam detik untuk halaman tertentu di dalam fungsi getStaticProps
-nya. Ini adalah strategi ideal untuk konten yang diperbarui pada interval yang dapat diprediksi atau di mana kesegaran yang mendekati instan bukanlah persyaratan yang ketat.
Implementasi:
Untuk mengaktifkan revalidasi berbasis waktu, Anda menambahkan kunci revalidate
ke objek yang dikembalikan oleh getStaticProps
.
// pages/posts/[slug].js
export async function getStaticProps(context) {
const res = await fetch(`https://api.example.com/posts/${context.params.slug}`)
const post = await res.json()
if (!post) {
return { notFound: true }
}
return {
props: { post },
// Validasi ulang halaman ini paling banyak sekali setiap 60 detik
revalidate: 60,
}
}
export async function getStaticPaths() {
// ... pra-render beberapa path awal
return { paths: [], fallback: 'blocking' };
}
Dalam contoh ini, halaman posting blog akan dianggap basi setelah 60 detik. Permintaan berikutnya setelah jendela 60 detik itu akan memicu regenerasi di latar belakang.
- Kelebihan:
- Sederhana untuk diimplementasikan: Hanya satu baris kode.
- Dapat diprediksi: Menjamin konten akan diperbarui dalam interval yang ditentukan.
- Tangguh: Jika sumber data Anda sedang tidak aktif selama upaya revalidasi, Next.js akan terus menyajikan halaman lama yang basi, mencegah kesalahan situs.
- Kekurangan:
- Tidak instan: Pembaruan konten tidak segera dan bergantung pada lalu lintas pengguna untuk memicu revalidasi.
- Potensi konten basi: Pengguna mungkin melihat konten yang sudah usang selama periode revalidasi.
Kasus Penggunaan Global: Situs web berita global yang menerbitkan berita utama setiap jam dapat mengatur revalidate: 3600
. Ini mengurangi panggilan API ke backend mereka sambil memastikan konten diperbarui pada jadwal yang wajar untuk pembaca di semua zona waktu.
2. Revalidasi On-demand: Pendekatan Pemicu Manual
Untuk banyak aplikasi, menunggu timer bukanlah pilihan. Ketika seorang editor menerbitkan koreksi penting, harga produk berubah, atau berita terkini diposting, pembaruan harus tayang sekarang. Di sinilah revalidasi on-demand bersinar.
Revalidasi on-demand memungkinkan Anda untuk secara manual memicu regenerasi halaman tertentu dengan memanggil rute API khusus. Ini paling umum diintegrasikan dengan webhook dari Headless CMS (seperti Contentful, Sanity, atau Strapi), platform e-commerce, atau sumber data lainnya.
Implementasi:
Prosesnya melibatkan pembuatan rute API yang aman yang memanggil fungsi res.revalidate()
dari Next.js.
Langkah 1: Siapkan rute API yang aman
Sangat penting untuk mengamankan endpoint ini untuk mencegah permintaan revalidasi yang tidak sah. Metode umum adalah menggunakan token rahasia.
// pages/api/revalidate.js
export default async function handler(req, res) {
// 1. Periksa token rahasia untuk mencegah akses tidak sah
if (req.query.secret !== process.env.REVALIDATION_TOKEN) {
return res.status(401).json({ message: 'Token tidak valid' });
}
try {
// 2. Dapatkan path untuk direvalidasi dari body permintaan
const pathToRevalidate = req.body.path;
if (!pathToRevalidate) {
return res.status(400).json({ message: 'Path untuk revalidasi diperlukan' });
}
// 3. Panggil fungsi revalidate
await res.revalidate(pathToRevalidate);
// 4. Kembalikan respons sukses
return res.json({ revalidated: true });
} catch (err) {
// Jika terjadi kesalahan, Next.js akan terus menampilkan halaman terakhir yang berhasil dibuat
return res.status(500).send('Kesalahan saat melakukan revalidasi');
}
}
Langkah 2: Hubungkan sumber data Anda
Anda kemudian akan mengonfigurasi Headless CMS Anda untuk mengirim permintaan POST ke `https://your-site.com/api/revalidate?secret=YOUR_SECRET_TOKEN` setiap kali konten diperbarui. Body dari permintaan harus berisi path yang akan diperbarui, misalnya: `{"path": "/posts/my-updated-post"}`.
- Kelebihan:
- Pembaruan instan: Konten tayang saat Anda memicu webhook.
- Efisien: Anda hanya meregenerasi halaman persis yang terpengaruh oleh perubahan konten, menghemat sumber daya server.
- Kontrol granular: Memberikan perintah yang tepat atas kesegaran konten situs Anda.
- Kekurangan:
- Pengaturan lebih kompleks: Memerlukan pembuatan endpoint API dan konfigurasi webhook di sumber data Anda.
- Pertimbangan keamanan: Endpoint harus diamankan dengan benar untuk mencegah penyalahgunaan.
Kasus Penggunaan Global: Toko e-commerce internasional dengan inventaris yang berfluktuasi. Ketika sebuah produk di gudang Eropa mereka habis, sebuah webhook ditembakkan, secara instan memanggil `res.revalidate('/products/cool-gadget')`. Ini memastikan bahwa pelanggan dari Asia hingga Amerika melihat status stok yang benar segera, mencegah penjualan berlebih.
Strategi Lanjutan dan Praktik Terbaik Modern
Menguasai ISR lebih dari sekadar memilih antara berbasis waktu dan on-demand. Aplikasi Next.js modern, terutama yang menggunakan App Router, membuka strategi yang lebih kuat dan efisien.
Strategi 1: Pendekatan Hibrida - Ketahanan Sejak Awal
Anda tidak harus memilih hanya satu metode revalidasi. Faktanya, strategi yang paling kuat sering kali merupakan kombinasi keduanya.
Gabungkan revalidasi berbasis waktu sebagai cadangan dengan revalidasi on-demand untuk pembaruan instan.
// pages/posts/[slug].js
export async function getStaticProps(context) {
// ... ambil data
return {
props: { post },
// Revalidasi on-demand adalah metode utama kami melalui webhook.
// Tapi sebagai cadangan, kami akan merevalidasi setiap jam jika webhook gagal.
revalidate: 3600, // 1 jam
}
}
Model hibrida ini memberi Anda yang terbaik dari kedua dunia. Webhook CMS Anda menyediakan pembaruan instan, tetapi jika karena alasan apa pun webhook itu gagal atau CMS Anda tidak mendukungnya, Anda memiliki ketenangan pikiran bahwa konten Anda tidak akan pernah lebih dari satu jam kedaluwarsa. Ini menciptakan arsitektur konten yang sangat tangguh dan dapat memulihkan diri sendiri.
Strategi 2: Revalidasi Berbasis Tag - Pengubah Permainan (App Router)
Tantangan umum dengan revalidasi berbasis path (`res.revalidate('/path')`) muncul ketika satu bagian data digunakan di beberapa halaman. Bayangkan biografi seorang penulis muncul di halaman profil mereka dan di setiap posting blog yang telah mereka tulis. Jika penulis memperbarui bio mereka, Anda perlu mengetahui dan merevalidasi setiap URL yang terpengaruh, yang bisa jadi kompleks dan rawan kesalahan.
Next.js App Router memperkenalkan revalidasi berbasis tag, solusi yang jauh lebih elegan dan kuat. Ini memungkinkan Anda untuk mengasosiasikan, atau "menandai," pengambilan data dengan satu atau lebih pengidentifikasi. Anda kemudian dapat merevalidasi semua data yang terkait dengan tag tertentu sekaligus, terlepas dari halaman mana yang menggunakannya.
Implementasi:
Langkah 1: Tandai pengambilan data Anda
Saat menggunakan `fetch`, Anda dapat menambahkan properti `next.tags` untuk mengasosiasikan permintaan dengan sebuah tag.
// app/blog/[slug]/page.js
async function getPost(slug) {
const res = await fetch(`https://.../posts/${slug}`,
{
next: { tags: ['posts', `post:${slug}`] }
}
);
return res.json();
}
// app/components/AuthorBio.js
async function getAuthor(authorId) {
const res = await fetch(`https://.../authors/${authorId}`,
{
next: { tags: ['authors', `author:${authorId}`] }
}
);
return res.json();
}
Langkah 2: Buat Rute API revalidasi (Route Handler)
Alih-alih `revalidate()`, Anda menggunakan `revalidateTag()` dari `next/cache`.
// app/api/revalidate/route.js
import { NextRequest, NextResponse } from 'next/server';
import { revalidateTag } from 'next/cache';
export async function POST(request: NextRequest) {
const secret = request.nextUrl.searchParams.get('secret');
if (secret !== process.env.REVALIDATION_TOKEN) {
return NextResponse.json({ message: 'Invalid secret' }, { status: 401 });
}
const body = await request.json();
const tag = body.tag;
if (!tag) {
return NextResponse.json({ message: 'Tag is required' }, { status: 400 });
}
revalidateTag(tag);
return NextResponse.json({ revalidated: true, now: Date.now() });
}
Sekarang, ketika seorang penulis memperbarui bio mereka, CMS Anda dapat mengirim webhook ke API Anda dengan tag `author:123`. Next.js kemudian akan secara cerdas merevalidasi setiap halaman yang mengambil data menggunakan tag itu—halaman profil penulis dan semua posting blog mereka—dalam satu operasi yang sederhana dan efisien.
Strategi 3: Mendukung Pratinjau Konten dengan Mode Draf
Alur kerja penting bagi tim konten adalah kemampuan untuk melihat pratinjau konten sebelum ditayangkan. Karena halaman ISR di-cache secara statis dan bersifat publik, bagaimana Anda dapat melihat draf yang belum dipublikasikan?
Next.js menyediakan solusi bawaan yang disebut Mode Draf. Saat diaktifkan, ia melewati cache statis untuk pengguna tertentu (melalui cookie browser) dan merender halaman yang diminta secara on-demand, mengambil konten draf terbaru langsung dari CMS Anda.
Menyiapkan Mode Draf melibatkan:
- Rute API untuk mengaktifkan Mode Draf, yang menetapkan cookie aman. Rute ini biasanya ditautkan ke tombol "Pratinjau" di Headless CMS Anda.
- Logika di komponen halaman atau fungsi pengambilan data Anda untuk memeriksa cookie Mode Draf dan mengambil konten draf alih-alih konten yang dipublikasikan jika ada.
- Rute API untuk menonaktifkan Mode Draf, yang menghapus cookie dan mengembalikan penyajian statis.
Ini memungkinkan tim konten global Anda, baik di Tokyo maupun Toronto, untuk dengan percaya diri melihat pratinjau pekerjaan mereka di infrastruktur produksi langsung sebelum mempublikasikannya.
Merancang Arsitektur untuk Audiens Global: ISR dan Edge
Kekuatan sejati ISR terwujud sepenuhnya ketika dideploy pada platform dengan Edge Network global, seperti Vercel. Begini cara mereka bekerja sama untuk memberikan performa tak tertandingi di seluruh dunia:
- Caching Global: Halaman yang dihasilkan secara statis tidak hanya disimpan di satu server; mereka direplikasi di puluhan pusat data di seluruh dunia. Pengguna di India mendapatkan halaman dari server di Mumbai, sementara pengguna di Brasil mendapatkannya dari SĂŁo Paulo. Ini secara drastis mengurangi latensi.
- Revalidasi Edge: Saat Anda memicu revalidasi (baik berbasis waktu maupun on-demand), prosesnya terjadi di server asal. Setelah halaman baru dibuat, Edge Network diinstruksikan untuk membersihkan versi lama dari semua cache-nya secara global.
- Propagasi: Pembersihan cache ini menyebar ke seluruh dunia dengan sangat cepat. Meskipun tidak instan di setiap node, CDN modern dirancang untuk membuat proses ini sangat cepat, memastikan bahwa konten baru tersedia untuk semua pengguna dalam hitungan detik.
Model "stale-while-revalidate" sangat penting dalam konteks global ini. Bahkan jika revalidasi sedang berlangsung, tidak ada pengguna yang dibiarkan menunggu. Pengguna di Australia mungkin memicu regenerasi, dan saat itu terjadi, pengguna di Jerman akan tetap mendapatkan respons instan dari cache (yang basi) di node edge lokal mereka. Beberapa saat kemudian, kedua node akan memiliki konten segar yang siap untuk pengunjung berikutnya.
Kesimpulan: Memilih Strategi Revalidasi yang Tepat
Incremental Static Regeneration di Next.js adalah paradigma kuat yang memecahkan konflik lama antara performa dan kesegaran konten. Dengan memahami berbagai strategi revalidasi, Anda dapat membangun aplikasi yang tidak hanya sangat cepat tetapi juga dinamis dan mudah dikelola untuk tim konten di seluruh dunia.
Berikut adalah panduan keputusan sederhana untuk membantu Anda memilih pendekatan yang tepat untuk proyek Anda:
- Untuk blog sederhana atau situs dokumentasi dengan pembaruan yang jarang: Mulailah dengan revalidasi berbasis waktu. Nilai antara 60 detik dan beberapa jam sering kali merupakan titik awal yang bagus dan tidak memerlukan banyak usaha.
- Untuk situs yang didukung Headless CMS di mana publikasi instan adalah kunci: Terapkan revalidasi on-demand melalui webhook. Gabungkan dengan revalidasi berbasis waktu yang lebih lama (misalnya, 1 hari) sebagai cadangan yang tangguh.
- Untuk aplikasi kompleks dengan data bersama (mis., e-commerce, publikasi besar) yang menggunakan App Router: Gunakan revalidasi berbasis tag. Ini akan secara dramatis menyederhanakan logika invalidasi cache Anda, mengurangi kesalahan, dan meningkatkan efisiensi.
- Untuk setiap proyek dengan tim konten: Selalu terapkan Mode Draf untuk menyediakan alur kerja editorial yang mulus dan profesional.
Dengan memanfaatkan strategi ini, Anda dapat memberikan pengalaman pengguna yang superior kepada audiens global Anda—yang konsisten cepat, andal, dan selalu terkini. Anda memberdayakan pembuat konten Anda dengan kebebasan untuk mempublikasikan sesuai jadwal mereka, yakin bahwa perubahan mereka akan tercermin secara instan di seluruh dunia. Itulah janji sejati dari web modern yang inkremental.