Skip to content

Next.js 原理与运行时

Next.js 16 的 Cache Components 和 use cache 如何工作?

这道题重点考察候选人能否把缓存函数、静态外壳、动态请求和失效策略组合起来,而不是只记一个 directive。

适合阶段:高级前端 / 架构面核心能力:缓存模型 · PPR · 失效

面试官想考什么

  • use cache 缓存的到底是数据、组件还是整个页面? 考察缓存对象边界。
  • 动态用户信息能否放进缓存函数? 考察请求上下文和隐私。
  • cacheLifecacheTag 分别解决什么问题? 考察生命周期和主动失效。
  • 启用 Cache Components 后如何验证收益? 考察指标和回滚。

一句话回答

text
Cache Components 允许把可缓存的组件或数据与动态部分组合成静态 Shell,use cache 决定缓存边界,cacheLife 控制生命周期,cacheTag 支持按业务标签失效;用户和请求特定数据必须留在动态边界之外。

面试回答详解

1. 解决的问题

传统静态/动态二选一容易让页面因为一小块动态内容失去整体缓存收益。Cache Components 的目标是把页面拆成可缓存部分和请求时才计算的部分,再通过 Suspense/流式输出组合。

text
静态 Shell + 缓存组件/数据 + 动态请求内容

2. 关键 API 关系

  • use cache:标记可缓存的函数或组件边界。
  • cacheLife:声明缓存的新鲜度和生命周期策略。
  • cacheTag:为缓存结果绑定业务标签,便于 mutation 后失效。
  • Suspense:为动态或异步部分提供流式边界和 fallback。

实际项目还要结合部署平台的缓存实现,不应假设所有缓存都在单个进程内。

3. 不能缓存什么

依赖 cookies、headers、当前用户、权限、随机数或实时请求上下文的内容不能不加区分地放进公共缓存。若缓存函数接受用户身份作为 key,也要评估 key 数量、敏感数据生命周期和跨租户风险。

4. 失效设计

写操作成功后按资源标签失效,并同步更新客户端 Router Cache 或触发重新导航。标签要与领域资源绑定,例如 product:42,不能只做全站清空。失效是传播过程,CDN、Next 缓存和浏览器缓存可能有不同延迟。

5. 验证和风险

测量命中率、TTFB、首个可见内容、动态片段延迟、缓存体积和错误率。灰度启用,准备按路由或标签关闭缓存。最危险的错误是把个性化数据缓存成公共响应。

可直接背诵的 30 秒回答

text
Cache Components 的核心是把页面拆成可缓存和请求时动态计算的部分。use cache 标记缓存边界,cacheLife 控制生命周期,cacheTag 支持按资源失效,Suspense 负责动态片段的流式展示。用户身份、权限和 cookies 相关数据不能随意进入公共缓存,必须通过缓存 key、权限和线上命中率验证。

扩展知识

缓存决策四问

text
缓存对象是什么? -> key 是否包含必要上下文?
多久失效? -> 谁触发失效? -> 哪些客户端仍可能持有旧数据?

面试官追问链

追问一:use cache 和 React cache 是一回事吗?

  • 考察点:命名相似概念。
  • 回答方向:不是。React cache 主要是请求/渲染期间的函数记忆,Next.js use cache 属于框架缓存模型,生命周期和持久性不同。

追问二:为什么 tag 失效后用户还看到旧页面?

  • 考察点:多层缓存。
  • 回答方向:可能是 Router Cache、CDN、浏览器或不同部署节点仍有旧内容,需要明确失效传播和重新验证路径。

追问三:动态组件还能和静态 Shell 一起返回吗?

  • 考察点:流式渲染。
  • 回答方向:可以通过 Suspense/流式边界先返回可缓存外壳,再补动态内容,但要设计 loading、错误和 SEO 语义。

推荐阅读

基于 MIT 协议开源