前端进阶之旅前端进阶之旅
  • 基础篇HTML/CSS/JS 打底
  • 进阶篇原理与工程化
  • 高频篇面试最常问的那批
  • 精选篇按模块收敛的总结
  • 手写篇常考代码手写实现
  • 面经篇真实面试问题复盘
  • AI 篇NEWAI 时代的前端考点
  • 历年面经NEW按年份追踪真实考点
  • 每日一题每天一道,攒手感
  • 专项自测100 题快速查漏
  • 小程序题库小程序专项刷题
  • 算法题库NEW在线编码即时判题
  • 知识卡片NEW碎片时间过考点
  • 面试题大全常见问题解析
  • AI 答疑NEW随时提问,即时解析
  • AI 模拟面试NEW模拟真实面试 + 报告
  • AI 定制路线NEW按你的简历现排
  • AI 知识地图NEW串起全站知识点
  • 原理篇React / Vue 源码拆解
  • HTTP从报文一路讲到 HTTPS
  • 浏览器渲染、事件循环、进程
  • 计算机基础Linux、网络、操作系统
  • 设计模式23 种模式怎么用
  • Node学习指南从环境搭建到服务端
  • NPM工作流script、依赖与发布
  • Docker容器化部署上手
  • Canvas图形与动画实战
  • 前端系统进阶学习大型项目工程化
  • 前端综合文章长期沉淀的实践文
  • 思维导图知识点全景图
  • 学习路线按图索骥不跑偏
  • AI 热点NEWAI 每日动态
  • 公众号动态公众号历史文章
  • 博客动态站长的技术博客
  • 开发者导航常用工具与文档站
  • 基础篇HTML/CSS/JS 打底
  • 进阶篇原理与工程化
  • 高频篇面试最常问的那批
  • 精选篇按模块收敛的总结
  • 手写篇常考代码手写实现
  • 面经篇真实面试问题复盘
  • AI 篇NEWAI 时代的前端考点
  • 历年面经NEW按年份追踪真实考点
  • 每日一题每天一道,攒手感
  • 专项自测100 题快速查漏
  • 小程序题库小程序专项刷题
  • 算法题库NEW在线编码即时判题
  • 知识卡片NEW碎片时间过考点
  • 面试题大全常见问题解析
  • AI 答疑NEW随时提问,即时解析
  • AI 模拟面试NEW模拟真实面试 + 报告
  • AI 定制路线NEW按你的简历现排
  • AI 知识地图NEW串起全站知识点
  • 原理篇React / Vue 源码拆解
  • HTTP从报文一路讲到 HTTPS
  • 浏览器渲染、事件循环、进程
  • 计算机基础Linux、网络、操作系统
  • 设计模式23 种模式怎么用
  • Node学习指南从环境搭建到服务端
  • NPM工作流script、依赖与发布
  • Docker容器化部署上手
  • Canvas图形与动画实战
  • 前端系统进阶学习大型项目工程化
  • 前端综合文章长期沉淀的实践文
  • 思维导图知识点全景图
  • 学习路线按图索骥不跑偏
  • AI 热点NEWAI 每日动态
  • 公众号动态公众号历史文章
  • 博客动态站长的技术博客
  • 开发者导航常用工具与文档站
首页程序员面试题库Next.js 部署 缓存策略 边缘缓存
NeNext.js数据与缓存

在 Vercel 等部署平台中,Next.js 的缓存策略在构建时与运行时有何不同?哪些数据会进入边缘缓存?

构建时生成的静态 HTML 进入边缘缓存;运行时动态数据由 Data Cache 管理,ISR 页面可通过 revalidate 重新生成并刷新边缘缓存,二者由 revalidate 衔接而非完全分离。

前端进阶之旅 · 一题精讲更新于 2026.09.05
Next.js#数据与缓存#缓存#构建工具
先看核心答案
理解线索

构建与运行的缓存层级

  1. 构建时生成静态HTML和JSON,进边缘缓存
  2. 运行时数据获取由cache和revalidate控制
  3. 边缘缓存静态产物及 ISR 生成的页面,按 revalidate 更新

ISR 页面在首次请求时生成并进入边缘缓存,之后按 revalidate 间隔自动重新生成,而非仅在构建时产生。

核心回答

先记住这个答案

在 Vercel 等平台,Next.js 构建时会将 SSG 生成的静态 HTML 等资产推送到边缘节点缓存,用户请求直接命中。运行时动态请求(如 SSR、API Routes 中的 fetch)的数据获取结果受 Next.js 缓存机制(如 fetch 的 cache 选项)影响,存储在 Vercel Data Cache 中。但启用 ISR(配置 revalidate)的页面会在首次动态访问时生成完整页面并写入 Full Route Cache,使该页面也进入边缘缓存;随后按 revalidate 间隔重验证并更新边缘。因此构建与运行并非完全隔离,而是由 revalidate 衔接。Data Cache 只缓存数据,边缘缓存既服务静态产物,也能缓存 ISR 生成的动态页面。

  • 构建时静态资产进边缘缓存
  • 运行时动态数据走请求级缓存
  • ISR 页面通过 revalidate 进入并更新边缘缓存

分层缓存机制:构建产物与运行数据如何分流

在Vercel部署时,Next.js的构建阶段会执行generateStaticParams和静态渲染,生成纯静态的HTML和RSC payload文件。这些文件被上传至CDN边缘节点,用户请求默认路径时直接返回,无需访问函数。这类资产包括SSG页面、静态图片、预构建的JSON数据等。它们通过Cache-Control头(通常s-maxage=31536000, stale-while-revalidate)在边缘缓存中持久存在。

运行时则处理动态请求,如SSR、ISR的按需重新验证、Server Actions等。这些请求需要执行函数,数据获取逻辑中使用fetch的cache选项(如force-no-store)或revalidate配置。Vercel提供Data Cache来存储跨请求的数据,但它独立于边缘CDN缓存。运行时的缓存键包括URL参数和请求头等,但边缘缓存只基于URL和accept等标准头判断,两者并不共享键空间。

产品详情页的构建与运行时缓存对比

假设一个电商站点有/products/[id]路由,使用generateStaticParams构建前1000个热门产品的页面。构建时,这些页面作为静态资产进入边缘缓存,用户访问/products/123时,Vercel边缘节点直接响应,不触发函数调用。这是构建时缓存的效果,可承受极高并发。

若新增一个非预生成的产品ID为1001且路由启用了revalidate = 60,请求首次触发动态生成:函数执行数据获取,若Data Cache未过期则快速返回,否则回源;渲染出的 HTML 会经 ISR 写入边缘 Full Route Cache。之后在 60 秒内的到期请求直接命中边缘缓存,无需再次执行函数;60 秒后首个请求重新执行并更新缓存。

缓存分层失效与覆盖条件

当产品ID为123的数据更新时,需要同步协调边缘缓存与 Data Cache。对于构建时未配置 revalidate 的纯静态页面,要主动调用 revalidatePath/revalidateTag 消除边缘缓存;对于配置了 revalidate 的 ISR 页面,到期后的首个请求会自动重新生成,若需立即更新仍可主动调用失效函数强制刷新。Data Cache 中的数据按自身 revalidate 过期,但页面重新渲染时若数据缓存命中会直接使用旧值,因此清除边缘缓存时也要注意数据缓存状态。

另一种情况是动态请求路径全部走运行时,边缘缓存不参与,因此无法享受CDN的延迟削减。例如使用cookies()读取用户身份触发动态渲染,整个页面变成动态的,构建时的静态化不生效,必须每次请求执行函数。代价是性能依赖函数冷启动和Data Cache命中,但可以保证个性化数据。

回答前,多想一步

容易答错的地方

认为所有数据都进边缘缓存
只有构建时静态资产和 ISR 按需生成的页面才会进入边缘缓存。运行时通过 fetch 获取的动态数据存在 Vercel Data Cache 中,不直接暴露到边缘,但 ISR 页面生成时会将渲染结果写入边缘 Full Route Cache。
混淆`revalidate`与边缘缓存失效
revalidate 控制 ISR 页面自动重新生成的间隔,到期后的下一次请求会触发重新渲染并更新边缘缓存。revalidatePath/revalidateTag 用于在不等待自然过期时主动强制失效。两者是互补的控制方式,而不是互斥选择。
试着用自己的话回答

面试官还会怎么问?

如何确认某个页面是静态还是动态?

在 next build 输出中,○ 表示静态渲染(含 ISR),ƒ 表示动态渲染;App Router 和 Pages Router 使用相同的符号。静态和 ISR 页面生成后都会进入边缘缓存,动态页面默认不缓存,除非通过 ISR 或显式缓存参与。

使用`fetch`的`cache: 'force-cache'`会进边缘缓存吗?

不会,force-cache只指示Next.js复用Data Cache中的数据,不改变页面本身的静态性。只有页面启用静态生成(无动态API)时才可能将整个页面输出到边缘缓存。

Vercel上的动态页面能使用边缘缓存吗?

可以,但需要显式设置Cache-Control头并处理动态数据。例如在 Route Handler 中设置响应头:return new Response(html, { headers: { 'Cache-Control': 's-maxage=60' } }),但仅适合无个性化且纯 GET 请求的场景。

从一道题,走向一组知识

把知识连起来

数据与缓存

能否只使某个动态页面中的一部分数据失效而不影响整个页面?如何实现?

同属「数据与缓存」专题,接着看 Next.js 部分数据缓存失效 在具体场景中的处理方式。

数据与缓存

在一个 Next.js 页面中,如果需要从多个不同的 API 源获取数据,如何合理设计数据获取流程以避免性能瓶颈?

同属「数据与缓存」专题,接着看 Next.js 多源数据 获取协调 在具体场景中的处理方式。

参考资料

  • App Router

示例用于理解所注明的运行环境与边界;延伸学习可结合原文中的更多案例。

本题目录
  1. 先记住这个答案
  2. 分层缓存机制:构建产物与运行数据如何分流
  3. 产品详情页的构建与运行时缓存对比
  4. 缓存分层失效与覆盖条件
  5. 容易答错的地方
  6. 面试官还会怎么问
  7. 把知识连起来
读懂,再试着讲出来

先看核心答案,再读代码。最后展开追问,检查自己有没有遗漏边界。

试着回答追问
浏览全部面试题理解原理,也关注真实的使用场景。回到顶部 ↑