Lompat ke konten
Kembali ke modul

Next.js: Fullstack dalam Satu Proyek · 7/9

Caching dan revalidation

Bagian yang membingungkan semua orang. Apa yang di-cache, di mana, dan cara menyegarkan data usang.

Baca 32 menit

Setelah pelajaran ini kamu bisa

  • Menyebutkan apa yang di-cache secara default dan apa yang tidak
  • Memilih antara revalidation berbasis waktu dan on-demand
  • Menjelaskan apa yang membuat sebuah route jadi dinamis
  • Men-debug halaman yang menampilkan data usang

Caching adalah bagian Next.js yang membingungkan semua orang, karena dua alasan: default-nya berubah antar versi major, dan ada dua model berbeda di Next 16. Mulailah dengan mengetahui kamu berada di model yang mana.

ModelDiaktifkan olehCaching-nya
Model sebelumnyaDefault — tidak perlu diaturAktifkan per fetch, atau lewat unstable_cache
Cache ComponentscacheComponents: true di next.configAktifkan dengan direktif "use cache"

Apa yang di-cache secara default

HalDi-cache secara default?
Halaman tanpa input dinamisYa — di-prerender saat build
fetch()Tidak. Ini berubah; dulu jawabannya ya.
Query databaseTidak — Next tidak bisa tahu kapan ia berubah
GET Route HandlerTidak, kecuali kamu mengatur force-static
Halaman yang membaca cookie atau headerTidak — ia jadi dinamis

Apa yang membuat route jadi dinamis

Sebuah route di-prerender sampai ia membutuhkan sesuatu yang hanya bisa disediakan request sungguhan. Sentuh salah satu dari ini dan ia jadi dinamis — di-render segar setiap request.

ts
await cookies()          // whose cookies? only a request knows
await headers()
await searchParams       // ?query=... comes from the request
await connection()

export const dynamic = "force-dynamic";   // or say so explicitly
Inilah sebabnya halaman pelajaran proyek ini di-prerender tapi dashboard-nya tidak: dashboard-nya memanggil getSessionUser(), yang membaca sebuah cookie.

Revalidation

ts
// --- time-based: refresh at most every N seconds ---
export const revalidate = 3600;            // whole route, in a page or layout

const data = await fetch(url, { next: { revalidate: 60 } });   // one request

// --- on-demand: refresh when something actually changed ---
import { revalidatePath, revalidateTag, updateTag } from "next/cache";

// tag data when you cache it...
const venues = await fetch(url, { next: { tags: ["venues"] } });

// ...then invalidate it from an action
revalidateTag("venues");     // stale-while-revalidate: fast, briefly stale
updateTag("venues");         // immediate: for the user's own write. Actions only.
revalidatePath("/venues");   // by route instead of by tag

Berbasis waktu tepat untuk konten yang berubah menurut jadwalnya sendiri — kurs mata uang, feed berita. On-demand tepat saat *kamu* yang menyebabkan perubahannya dan tahu persis apa yang sekarang salah.

Coba sendiri

Sebuah cache dengan kedaluwarsa berbasis waktu dan invalidasi berdasarkan tag, dibuat dari nol. Kedua strategi revalidation, terlihat.

Hasil

Tekan Jalankan untuk melihat hasilnya.

Ini jalan di browser kamu, di dalam sandbox. Apa pun yang kamu tulis di sini tidak bisa merusak situs.

  1. Apakah halamannya di-prerender? Cek bun run build untuk ● atau ƒ.
  2. Apakah mutasinya memanggil revalidatePath atau updateTag?
  3. Apakah kamu sedang melihat fetch dengan force-cache tanpa revalidate?
  4. Apakah itu cache milik browser sendiri? Coba hard reload.
  5. Di dev, apakah kamu cuma sedang dibingungkan oleh render ganda mode dev React?

Tugas praktik

Di proyek ini, jalankan bun run build dan hitung route ● dan ƒ-nya. Lalu tambahkan await cookies() di bagian atas app/[lang]/page.tsx, build ulang, dan lihat halaman berandanya berpindah dari ● ke ƒ. Hapus lagi. Kamu baru saja melihat persis apa arti "membuat route jadi dinamis", secara terukur.

Hasil yang diharapkan

Halaman berandanya berubah simbol, dan jumlah yang di-prerender berkurang dua — satu per bahasa.

Cek pemahaman

Di Next.js 16, apakah await fetch(url) biasa di-cache secara default?

Pilih jawaban dulu