Senior #caching#data-cache#full-route-cache#router-cache#revalidate
Giải thích 4 tầng cache của Next.js App Router và cách revalidate
⚡ Trả lời nhanh
Request Memoization (dedupe fetch trong một lần render), Data Cache (kết quả fetch, bền qua request/deploy), Full Route Cache (HTML + RSC payload của route static, trên server) và Router Cache (RSC payload trong bộ nhớ browser). Revalidate bằng revalidateTag/revalidatePath hoặc next.revalidate.
| Tầng | Ở đâu | Tồn tại | Làm mới bằng |
|---|---|---|---|
| Request Memoization | server, React | trong một lần render | tự hết sau request |
| Data Cache | server | bền, qua request và deploy | revalidateTag, revalidatePath, next.revalidate, cache: 'no-store' |
| Full Route Cache | server | bền đến khi revalidate hoặc redeploy | revalidate Data Cache liên quan |
| Router Cache | client (memory) | theo phiên/thời gian | router.refresh(), Server Action gọi revalidate |
// Gắn tag + TTL cho Data Cache
const res = await fetch("https://api.x.com/posts", {
next: { tags: ["posts"], revalidate: 3600 },
});
// Server Action sau khi mutate
import { revalidateTag, revalidatePath } from "next/cache";
revalidateTag("posts"); // làm mới mọi fetch gắn tag
revalidatePath("/posts"); // làm mới route (Data + Full Route Cache)
Khác biệt phiên bản (quan trọng):
- Next 14:
fetchmặc địnhforce-cache; Router Cache giữ page dynamic 30s, static 5 phút. - Next 15:
fetchmặc định không cache (nhưno-store); Router CachestaleTimecủa page segment là 0 (layout/loading vẫn dùng lại khi back/forward); GET Route Handler không cache mặc định. Tùy chọn có thể bật lại quaexperimental.staleTimes. - Request Memoization chỉ áp dụng cho
GETfetch; truy vấn DB bọc bằngcache()của React, hoặcunstable_cacheđể lưu vào Data Cache.