Skip to content

Next.js 原理与运行时

Next.js Draft Mode 如何实现 CMS 预览而不污染正式缓存?

预览要求用户看到未发布内容,同时不能让草稿响应进入公共 CDN、Router Cache 或正式 SEO 页面。

适合阶段:资深前端 / CMS 项目核心能力:Preview · Cookie · Cache Isolation

面试官想考什么

  • 预览链接如何鉴权? 考察 token 和权限。
  • Draft Mode 为什么会影响缓存? 考察请求上下文。
  • CMS 发布后正式页面如何失效? 考察 webhook 和 revalidation。
  • 预览内容如何避免被搜索引擎收录? 考察 SEO 风险。

一句话回答

text
Draft Mode 用受保护的预览凭证设置请求级状态,使页面读取草稿数据并绕开公共缓存;预览入口、cookie、CMS webhook、robots/noindex 和退出机制都必须独立治理。

面试回答详解

1. 预览链路

text
CMS preview URL + signed token -> preview route
-> verify editor permission -> set draft cookie
-> dynamic draft read -> no-store/private response

预览 token 应短期、单用途或可撤销,不能只靠一个可猜的 query 参数。

2. 缓存隔离

预览 cookie 会改变页面输入,预览响应不得进入公共 CDN 或共享 Data Cache。客户端导航也可能复用 Router Cache,进入和退出预览时要刷新相关路由状态。

3. 发布失效

CMS 发布成功后发送签名 webhook,Next.js 验证签名和事件版本,再按内容 id/tag 失效。Webhook 重试必须幂等,不能因为重复事件触发无界刷新。

4. SEO 与安全

草稿页设置 noindex、避免 sitemap/OG 对外暴露,预览域名和正式域名可以分开。编辑者权限、租户范围和内容版本要在服务端校验;不能把草稿全文放到 URL。

5. 退出和观测

提供明确 disable draft route,清 cookie 并重新导航。记录 preview success、权限拒绝、webhook 重复、失效延迟和草稿/正式版本差异。

可直接背诵的 30 秒回答

text
Draft Mode 的核心是用受保护的预览状态让服务端读取草稿,同时让响应保持动态和 private,不能污染 CDN、Data Cache 或 Router Cache。预览入口要验证短期签名 token 和编辑权限,CMS 发布通过签名、幂等 webhook 做按内容失效,并给预览页 noindex 和退出机制。

扩展知识

预览与 staging 的区别

  • Draft Mode:同一应用内按请求查看草稿。
  • Staging 环境:完整隔离的部署和数据环境。
  • 高风险内容和权限变更可能需要 staging,不应只依赖 draft cookie。

面试官追问链

  • 考察点:凭证暴露面。
  • 回答方向:URL 只用于一次性引导并尽快换成 HttpOnly cookie,避免被 Referer、日志和分享链接传播。

追问二:为什么发布后还看到旧内容?

  • 考察点:失效链路。
  • 回答方向:检查 CMS webhook、Data/Full Route/Router/CDN 多层缓存和客户端导航,确认失效标签一致。

追问三:预览页能否复用正式域名?

  • 考察点:隔离策略。
  • 回答方向:可以但风险更高,必须严格 cookie、noindex、缓存和权限隔离;独立预览域名通常更容易治理。

推荐阅读

基于 MIT 协议开源