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 日志一个 ƒ 一个 ○;刷新时左侧时间变、右侧不变。