rel="prerender"在现代浏览器中已基本弃用:Chrome/Edge自v110起默认禁用,Firefox/Safari完全忽略;实际仅做DNS/TCP预连接,不获取HTML、不执行JS、不渲染;应改用speculationrules API(Chromium)或rel="prefetch" as="document"(全兼容)。

rel="prerender" 在现代浏览器里基本不支持了——不是写法错了,是浏览器主动关掉了它。
Chrome/Edge 从 v110 起默认禁用 rel="prerender"
Chromium 内核在 2023 年 M94 后重构为 Prerender2.0,旧的 rel="prerender" 标签被降级为兼容层,仅在极少数内部导航中可能残留响应。Chrome v110+(2026 年所有稳定版均在此列)已默认关闭该行为,需手动打开 chrome://flags/#prerender2 才可能触发,且仅限前台空闲、同源、无参、无 hash 的页面。Edge 同步弃用;Firefox 和 Safari 完全忽略该属性,连解析都不做。
常见错误现象包括:
- Network 面板查不到目标 HTML 请求
- Application → Rendering 面板看不到 prerendered page 实例
- 点击跳转后 Performance 面板仍显示常规 Navigation Start 流程,无 “Prerender” 阶段
即使强制启用,rel="prerender" 也不下载 HTML
现代 Chrome 实际只执行 DNS 预解析或 TCP 预连接,不会 fetch HTML、不执行 JS、不构建 DOM、不渲染任何内容。它和 SEO 场景常说的“预渲染”完全无关——后者指构建时生成真实 /product/123/index.html 文件,前者只是个空壳提示。
立即学习“前端免费学习笔记(深入)”;
容易踩的坑:
- 误以为写了
<link rel="prerender" href="/product/123">就等于做了预渲染 - 依赖它提升 LCP 或解决白屏,结果首屏指标毫无改善
- 用它做 GA 统计或服务端日志埋点,发现完全没触发(它本就不发请求)
真正可用的替代方案是 speculationrules + prefetch
要实现“悬停即预渲染”,必须用 Chromium 支持的 speculationrules API(Chrome/Edge 110+),而不是旧 rel 属性:
<script type="speculationrules">
{
"prerender": [
{
"source": "document",
"eagerness": "moderate"
}
]
}</script>
这个声明会自动对当前页所有 <a> 链接在 hover/focus 时启动轻量预渲染(只建 DOM/CSSOM,不加载图片、不执行 JS)。同时,对无法支持的浏览器(如 Safari、Firefox),应 fallback 到 <link rel="prefetch" href="/product/123" as="document">,它被所有主流浏览器支持,只下载 HTML 不执行,可控性高。
关键差异:
-
prefetch必须加as="document",否则会被当成as="fetch"处理,缓存策略异常 -
speculationrules只在 Chromium 系列生效,需用HTMLScriptElement.supports('speculationrules')检测后再注入 - 路径不能带查询参数(
/product?id=123会失效),动态路由需服务端配合生成静态路径
真正落地的预渲染,从来不在 HTML 标签里靠猜,而在构建流程里靠生成——rel="prerender" 是个过时的幻觉,而 generateStaticParams、vite-plugin-prerender 或 prerender-spa-plugin 输出的真实 HTML 文件,才是能被 curl 直接返回 200 的硬指标。



















