link rel="prefetch" 不能“取数据”,它仅在浏览器空闲时下载资源存入HTTP缓存,不执行脚本、不触发API、不提供JS可读接口;需同源、置于head、页面未卸载且空闲时才生效。
link rel="prefetch",它真能“取数据”吗不能。link rel="prefetch" 不会执行脚本、不触发 API 请求、不解析 HTML 或 JSON,它只做一件事:在浏览器空闲时,把指定的资源(通常是 JS、CSS、HTML 文档)下载并存入 HTTP 缓存。后续导航或资源加载时,若匹配缓存键,就能复用——但它不会主动“取数据”供 JS 直接读取,也不提供回调或 Promise。
link rel="prefetch" 的正确写法和生效条件必须满足三个前提才可能触发预取:
中,且在首次渲染前已存在 DOM(动态插入的 link 大多无效)典型写法:
as 属性必须准确标注资源类型,否则可能降级为低优先级 fetch,甚至被忽略;as="fetch" 是无效值,不要写。
prefetch 却没看到 network 请求常见原因包括:
)时才提升 prefetch 优先级,纯静态 prefetch 可能延迟数秒甚至跳过prefetch 或取消所有过滤器才能看到Cache-Control: immutable 或 max-age 很大),浏览器直接从磁盘缓存读取,不发新请求rel="preload" 混淆概念——preload 是高优先级强制加载,prefetch 是低优先级投机加载,二者不可互换如果目标是提前获取 JSON、API 响应等可被 JS 使用的数据,prefetch 不适用。可行路径有:
fetch() + cache.put() 手动存入 Cache API,后续通过 cache.match() 读取fetch() 预加载下一页所需数据,配合 Suspense 或 loading 状态管理rel="prerender"(仅 Chromium 支持)预渲染整个页面,但开销大、兼容性差,且不适用于数据驱动场景真正容易被忽略的是:预取的价值高度依赖用户行为预测。没有点击流分析或埋点反馈支撑的 prefetch,往往只是往缓存里塞了一堆没人用的字节。