prefetch不是加速跳转的银弹,仅将静态资源存入http缓存,不预渲染、不发api、不保留状态;必须满足路径固定、资源静态、点击概率高、无动态nonce/token才有效,且as属性必须正确指定。

prefetch 在电商转化页根本不是“加速跳转”的银弹
它只存静态资源到 HTTP 缓存,不预渲染、不发 API、不保留表单状态。用户从商品列表页点进详情页,link rel="prefetch" 能做的仅是提前把 /product/123.js 和 /product/123.css 下好——但页面 mount 后仍要重新 fetch 接口、校验库存、跑 JS 逻辑。真正卡顿的地方它一个都碰不到。
哪些转化环节能用,哪些写了也白写
能用的场景必须同时满足:路径固定、资源静态、用户点击概率高、无服务端动态 nonce/token。
- ✅ 列表页可对历史点击率 Top 3 的商品详情页 HTML 做
as="document":比如<link rel="prefetch" href="/p/98765.html" as="document"> - ✅ 下单流程中“确认订单页”若为纯静态模板(无 URL query 参数、无 CSR 渲染),可 prefetch 其 JS/CSS
- ❌ 商品详情页里带
?utm_source=xxx或&token=abc的动态链接,无法静态写死 href,prefetch 失效 - ❌ 含服务端渲染 CSRF token 或一次性 nonce 的页面,缓存后校验失败,白下还可能触发安全拦截
- ❌ 预取
/api/cart/add这类接口地址——prefetch根本不发 fetch 请求,也不解析响应体
as 属性写错等于没写,且容易引发降级
浏览器靠 as 决定请求头、缓存分区和 MIME 处理方式。漏掉或写错,请求大概率被当成 as="document" 甚至静默忽略。
- JS 文件必须用
as="script":<link rel="prefetch" href="/js/detail.8a2b.js" as="script"> - HTML 页面必须用
as="document":<link rel="prefetch" href="/p/456.html" as="document"> - CSS 必须用
as="style":<link rel="prefetch" href="/css/product.css" as="style"> -
as="fetch"、as="json"是无效值,浏览器不识别,也不报错,只是当普通链接处理 - 跨域资源(如 CDN 上的 JS)在 Safari/Firefox 中基本被无视,即使写了
as也发不出请求
动态注入比硬编码更可控,但有硬限制
把 link 硬塞进模板 head 里,等于让所有用户无差别下载一个可能永远用不到的资源。尤其在移动端,流量和缓存空间都很敏感。
- 推荐用
IntersectionObserver或mouseenter触发后延迟 200ms 注入:prefetchResource('/js/detail.js') - 但注意:动态插入的
link在多数浏览器中不满足“HTML 解析时已存在 DOM”条件,触发成功率远低于静态写法 - Chrome 94+ 会结合导航预测信号提升 prefetch 触发率,但纯 JS 注入无法获得该信号支持
- 验证是否生效:Network 面板必须手动勾选
prefetch类型,看 Initiator 是否为prefetch,Priority 是否为Low,跳转后资源状态码是否为200 (from memory cache)或304
prefetch 可能根本没发请求,不是因为代码错,而是用户刚点开页面就划走了,或者 Chrome 还没空闲下来——它连尝试都没开始。前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











