Speculation Rules:浏览器自己的预渲染
前端约 4 分钟阅读

Speculation Rules:浏览器自己的预渲染

Next 16.3 Instant Navigations 之外,Chrome Speculation Rules 用 JSON 做 prefetch/prerender。对照框架内导航,谈副作用、eagerness 与落地顺序。

cover

Next.js 16.3 刚把 Instant Navigations 和 dev 内存回收推到台前。站外还有一条更“浏览器原教旨”的路:Chrome 的 Speculation Rules。一边是框架帮你 partial prefetch 共享壳,一边是浏览器按 JSON 规则直接 prefetch / prerender 下一页。两条线常被混着吹,落地却不是一回事。

我更想谈后者:它不绑 React,适合内容站、文档站、营销站,也适合 Next 应用里“确定会点到的列表项”。用错了,你会白白烧带宽,甚至提前打到鉴权接口。

它到底预取了什么

Speculation Rules 用 <script type="speculationrules"> 塞一段 JSON。常见两档:

  • prefetch:先拉下一页 HTML(及部分子资源),点击时少等一截网络。
  • prerender:在隐藏上下文里接近完整渲染,点击时接近“已经打开过”。

比老的 <link rel="prerender"> 可控:可以按 eagerness、选择器、URL 模式收紧范围,也能和视口启发式配合(移动端锚点进视口后稍等再触发)。文档在 Chrome 的 prerender 指南 和 MDN Speculation Rules API。

和 Next 16.3 的 Instant Navigations 对比:框架侧偏 App Router 内部的壳共享与流式数据;Speculation Rules 偏“整页文档级”的浏览器原生投机。SPA 客户端路由主导时,你更该先看框架导航;多入口、多 HTML 文档、或跨路径硬跳转时,原生规则更直接。

一段够用的规则

列表页只预取“视口里可见、且用户可能点”的详情,比全站 prerender 靠谱:

html
<script type="speculationrules">
{
  "prefetch": [{
    "source": "document",
    "where": {
      "and": [
        { "href_matches": "/posts/*" },
        { "not": { "selector_matches": ".no-spec" } }
      ]
    },
    "eagerness": "moderate"
  }],
  "prerender": [{
    "source": "document",
    "where": { "selector_matches": "a.primary-cta" },
    "eagerness": "conservative"
  }]
}
</script>

moderate / conservative 是在赌点击概率。热门文章链、搜索结果第一条,可以更积极;后台设置页、退出登录、带一次性 token 的链接,直接加 .no-spec 或排除模式。

图:浏览器在后台悄悄“猜”下一页

inline

prerender 不是免费的。页面若在加载时:

  1. 写 analytics 事件;
  2. 刷新 CSRF;
  3. 扣一次“预览配额”;
  4. 把“已读”记进库;

那用户还没点,副作用已经发生了。内容站常见坑是把“进入详情 = 记一次 PV”写在 document 顶层。投机加载一开,列表一滚,PV 就飘。

更稳的做法:

  • 真正的副作用放到 pageshow 且判断 event.persisted / 文档是否来自 prerender 激活(按平台 API 检测“是否仍在投机中”)。
  • 鉴权接口不要仅因为 HTML 被 prerender 就发敏感 cookie 写操作;读可以,写要等激活。
  • 对个性化强的页面优先 prefetch 而不是 prerender,或干脆排除。

Next 里若详情是 Server Components 流式页,原生 prerender 拉到的是“该 URL 的完整文档响应”。它和 cacheComponents 的部分预取不是同一条管道。不要假设开了 16.3 Instant Navigations 就自动拥有浏览器级 prerender,反之亦然。

我怎么决定开不开

先问三个问题:

  1. 下一跳是否高度可预测? 文章列表 → 详情、分页 → 下一页、向导第 2 步,值得。全局导航上十个平等入口,别全 prerender。
  2. 预取是否会撞到计费或限流? 搜索 API、AI 摘要接口、按次计费的边缘函数,要从规则里剔除。
  3. 指标怎么验? 看 LCP/INP 不够。给“列表点击到详情可用”打一个 soft navigation 或自己的 performance.mark。Chrome 对投机加载有相关观测入口,但业务上更有用的是:点击后首屏字是否已经在,以及误触发率(预取次数 / 真实点击)。

实践里我常先上 prefetch + moderate,跑一周看带宽和点击命中,再对 Top 入口升 prerender。一上来全站 prerender,账单和后端 QPS 会先教你做人。

小结

Speculation Rules 把“让下一页感觉瞬间到达”从框架特性下放成浏览器能力。它不取代 Next 16.3 的 Instant Navigations,而是补了文档式多页和硬导航的那一截。规则写得越像产品漏斗(高意图链接积极,低意图保守),收益越稳。先排除副作用路径,再谈 eagerness——顺序反了,你优化的是幻影流量,不是体感。

相关文章