NextLab
首页01 渲染模型02 路由03 RSC04 缓存05 Server Actions06 性能07 登录状态

CHAPTER 04

数据获取与缓存

fetch 策略、四层缓存、revalidate、静态 vs 动态。核心问题:哪一层缓存了什么、谁能让谁失效。

不缓存:每次请求新数据

force-dynamic + 裸取数,对应 Next 15+ fetch 默认不缓存。

看什么:pnpm build 后本页标记为 ƒ(动态);每次刷新时间戳都变。

数据缓存:跨请求复用

unstable_cache 包住取数(无 revalidate),对应 fetch 的 force-cache。

看什么:pnpm build 后本页标记为 ○(静态);刷新时间戳冻结在构建时刻。

时间重新验证

unstable_cache(..., { revalidate: 10 }) 基于时间的 SWR 刷新。

看什么:过期后首次请求返回旧值并后台重建;约 10 秒后时间才变。

标签失效 revalidateTag

unstable_cache 打 tags,配合 Server Action 里 revalidateTag 按需清缓存。

看什么:点按钮触发 Server Action 后,数据立刻更新(数据缓存 + 路由器缓存被清)。

unstable_cache 缓存非 fetch 数据

对比裸函数(每次变)与 unstable_cache(跨请求复用)。

看什么:pnpm build 后刷新,右侧缓存值不变(命中数据缓存),左侧裸函数值每次变。

静态 vs 动态 对比

同一数据源,一边裸取数(动态),一边走缓存(静态)。

看什么:build 日志一个 ƒ 一个 ○;刷新时左侧时间变、右侧不变。