Banyak developer menganggap caching hanya sebagai cara untuk meningkatkan performa aplikasi. Padahal pada App Router modern, Next.js Cache Components menjadi bagian penting dari proses rendering, data fetching, hingga revalidation yang menentukan kapan data ditampilkan dan kapan harus diperbarui.
Karena melibatkan beberapa layer caching yang saling terhubung, perilaku aplikasi di production sering kali berbeda dengan saat development. Tidak jarang data terlihat terlambat diperbarui, pengguna menerima versi data yang berbeda, atau bug menjadi sulit direproduksi karena cache masih aktif.
Oleh karena itu, memahami cara kerja caching di Next.js tidak hanya penting untuk performa, tetapi juga untuk menjaga konsistensi data dan pengalaman pengguna. Pada artikel ini, kita akan membahas Next.js Cache Components, mulai dari fetch caching, ISR, revalidation, hingga berbagai strategi untuk mencegah data stale pada aplikasi production.
Also Read
Ringkasan Cepat
- Caching di Next.js (App Router) berlapis: request memoization, data cache, full route cache, dan ISR/revalidation.
- “Cache components” biasanya merujuk pada strategi memastikan komponen/route memanfaatkan cache dengan benar tanpa membuat data basi.
- Kunci praktik: paham default caching
fetch,revalidate, tag-based invalidation, dan kapan harusno-store. - Salah caching = bug terselubung: data stale, user lihat informasi beda, dan debugging jadi susah.
Layer caching di Next.js App Router
Caching di Next.js App Router bukan satu mekanisme tunggal yang bisa di-toggle on/off. Ia adalah kombinasi beberapa layer yang bekerja di tingkat yang berbeda dan memahami perbedaannya menentukan apakah aplikasimu cepat atau lambat, fresh atau stale.
Empat Konsep yang Akan Sering Kamu Temui
1. Caching di Level Request fetch Secara default, fetch di App Router tidak dicache. Kamu bisa mengaktifkan cache per request dengan opsi { cache: 'force-cache' } berguna untuk data yang jarang berubah.
2. Caching Hasil Fungsi Async Non-Fetch Untuk query database atau fungsi async lain yang tidak pakai fetch, gunakan unstable_cache. Mendukung tags dan revalidate seconds untuk kontrol yang lebih granular.
3. Perilaku Route: Static vs Dynamic Route segment config seperti dynamic menentukan apakah sebuah route cenderung static atau dynamic:
force-dynamicroute selalu di-render fresh setiap requesterrorsetara dengan perilaku static yang ketat
4. Revalidation Dua mekanisme untuk memperbarui cache:
- Time-based cache diperbarui setelah interval waktu tertentu
- On-demand cache di-invalidate secara eksplisit saat ada perubahan data
BACA JUGA: Apa Itu Edge Caching? Cara Kerja, Manfaat, dan Contohnya
Kenapa fetch dan default caching sering disalahpahami?
Salah satu sumber kebingungan paling umum di Next.js App Router: default caching fetch di sini berbeda dari browser cache yang biasa kamu kenal. Dan perilakunya bisa berubah tergantung apa yang dipakai di render tree.
Kapan Hasil fetch Di-cache, Kapan Tidak
Secara default, fetch di App Router tidak dicache. Kamu harus eksplisit mengaktifkannya:
jContoh (server component):
const data = await fetch('https://...', { cache: 'force-cache' })Di sisi lain, jika Anda menggunakan request-time API seperti cookies/headers, route bisa menjadi lebih dynamic, dan caching jadi lebih terbatas.
cache: 'no-store', revalidate, dan konsekuensinya
Prinsip simpel:
no-store= selalu fresh, tapi lebih mahalrevalidate: N= boleh stale sebentar, lalu refresh
Pada unstable_cache, Next.js docs menunjukkan Anda bisa set:
revalidatedalam detiktagsuntuk on-demand revalidation viarevalidateTag
Sebelum memutuskan caching, tulis dulu SLA freshness. “Data harus update maksimal 5 menit” itu lebih berguna daripada “pengen cepat”.
Kapan cocok menggunakan ISR (Incremental Static Regeneration)?
ISR cocok ketika Anda ingin halaman terasa static (cepat) tapi tetap update berkala, tanpa rebuild penuh untuk setiap perubahan kecil.
Contoh use case:
- halaman blog
- katalog produk yang update tidak real-time
- landing page campaign
Tradeoff:
- user bisa melihat data stale sampai interval revalidate
- Anda butuh strategi invalidation saat ada perubahan penting
Kalau data Anda benar-benar real-time (saldo, stok realtime, dashboard), ISR biasanya bukan pilihan utama.
Revalidation: Time-Based vs Tag-Based vs On-Demand
Di Next.js, revalidation adalah mekanisme untuk menyegarkan cache agar data tidak terus stale.
Secara umum, ada tiga pendekatan yang paling sering dipakai:
- Time-based → cache diperbarui secara berkala
Contoh: refresh setiap 60 detik. - Tag-based → cache diperbarui berdasarkan tag tertentu
Contoh: refresh semua data yang memakai taguseratauproduct. - On-demand → cache diperbarui saat ada event tertentu
Contoh: langsung refresh setelah konten baru dipublish dari CMS.
Next.js mendukung pendekatan tag-based lewat unstable_cache dan invalidation menggunakan revalidateTag, sehingga cache bisa diperbarui lebih terarah tanpa harus me-refresh seluruh halaman.
Untuk aplikasi yang banyak berbagi data antar halaman, pendekatan tag-based biasanya terasa paling membantu karena invalidation jadi lebih rapi dan mudah dikontrol.
Pola praktis untuk “cache components” (anti-stale)
Dalam praktiknya, pola paling aman adalah memisahkan data yang benar-benar dynamic dari bagian yang bisa static, lalu gunakan boundary yang jelas untuk caching dan revalidation.
Pola yang sering dipakai adalah seperti berikut:
1. Static shell + dynamic islands
- layout/presentasi static
- komponen data sensitif fresh
2. Cache expensive query, bukan seluruh halaman
- cache function query DB dengan
unstable_cache - render route tetap dynamic jika perlu
3. Gunakan tag untuk invalidation
- setiap data domain punya tag
- ketika update, trigger
revalidateTag
4. Jangan cache data yang terkait auth di shared cache
- untuk data per user, biasanya
no-storeatau per-user caching yang aman
Troubleshooting caching Next.js
Kalau data tidak update, cek tiga hal yaitu: apakah request dicache, apakah route jadi static, dan apakah revalidation benar-benar terpanggil.
Gejala umum:
- data tidak berubah di production
- dev berbeda dari prod
- perubahan CMS tidak muncul
Diagnosis cepat:
- cek apakah Anda memakai
cache: 'force-cache'di tempat yang seharusnya fresh - cek penggunaan cookies/headers yang membuat route dynamic
- cek apakah tag-based invalidation sesuai tag
- cek cache layer di depan (CDN, reverse proxy)
Pro tip dari tim: selalu log event invalidation. Banyak bug caching bukan bug Next.js, tapi bug “invalidation tidak pernah terjadi”.
Tabel: kebutuhan data → strategi caching yang disarankan
| Kebutuhan data | Contoh | Strategi |
|---|---|---|
| Real-time | dashboard, saldo | no-store + fetch dynamic |
| Near real-time | stok update 1–5 menit | revalidate singkat + tags |
| Periodik | blog, promo | ISR revalidate lebih besar |
| Mahal dihitung | query DB berat | unstable_cache + tag |
Checklist implementasi caching untuk app production
Tentukan freshness SLA, pilih layer caching, uji invalidation, lalu monitor.
Checklist:
- Definisikan freshness per endpoint
- Tentukan mana yang boleh stale
- Pakai
unstable_cacheuntuk query mahal - Pakai tags untuk invalidation terarah
- Pastikan route config tidak “terkunci static” tanpa sengaja
- Uji scenario publish/update
- Monitoring: error, latency, dan mismatch data
Caching dan revalidation butuh infra stabil untuk backend/API
Meskipun caching di Next.js sangat membantu, efektivitasnya tetap bergantung pada stabilitas API Anda. Jika backend utama lambat atau sering tidak stabil, caching hanya akan menyamarkan masalah performa, bukan menyelesaikannya secara tuntas.
Optimalkan seluruh performa backend, worker, queue invalidation, hingga observability stack aplikasi Anda menggunakan VPS murah dari Rumahweb. Dengan pilihan sistem operasi Linux atau Windows serta kapasitas resource yang fleksibel, Anda memiliki kontrol penuh untuk membangun infrastruktur backend yang tangguh, responsif, dan mampu menopang arsitektur Next.js Anda secara maksimal.
FAQ
Istilahnya merujuk pada model caching berbasis komponen/route di App Router, agar hasil render dan data fetching bisa dicache secara tepat.
Karena caching dan revalidation tidak terkonfigurasi sesuai kebutuhan, atau invalidation tidak terpanggil.
fetch di Next.js dicache atau tidak ?Default fetch tidak dicache, dan caching bisa diaktifkan dengan cache: 'force-cache'.
unstable_cache ?API untuk meng-cache hasil fungsi async non-fetch (misalnya query database), dan mendukung tags serta revalidate seconds.
Saat Anda ingin halaman cepat seperti static, tetapi update berkala.
revalidate dan no-store ?revalidate mengizinkan data stale sampai interval tertentu, sedangkan no-store selalu fetch fresh.
Mekanisme mengelompokkan cache berdasarkan tag sehingga Anda bisa meng-invalidate cache secara terarah.
Mengaktifkan cache untuk data yang seharusnya fresh (auth/user-specific) dan tidak menyiapkan invalidation.
Kesimpulan
Caching di Next.js App Router bekerja dengan sistem berlapis. Kalau dirancang dengan benar, aplikasi bisa terasa sangat cepat. Tetapi kalau strategi cache dan revalidation tidak jelas, data yang tampil bisa menjadi stale atau terlambat diperbarui.
Next.js menyediakan beberapa pendekatan caching, seperti force-cache untuk menyimpan hasil fetch, serta unstable_cache untuk meng-cache fungsi non-fetch dengan dukungan tags dan revalidation yang lebih fleksibel.
Pendekatan yang paling aman biasanya dimulai dari menentukan seberapa “fresh” data harus tampil. Setelah itu, pisahkan data yang benar-benar dinamis dari data yang relatif statis, lalu pastikan proses invalidation dan revalidation bisa dipantau dengan jelas agar debugging tidak berubah jadi teka-teki.







