rel=prefetch

对于 rel 属性的 <link> 元素,prefetch 关键字为浏览器提供了一个提示,表明用户可能需要在将来的导航中使用目标资源,因此浏览器可以通过抢先获取和缓存资源来改善用户体验。<link rel="prefetch"> 用于同站点导航资源,或同站点页面使用的子资源。

结果会被保存在磁盘上的 HTTP 缓存中。因此,即使子资源没有被当前页面使用,预取它们也很有用。你也可以用它来预取用户可能在站点上访问的下一个文档。但是,因此你需要小心处理头部——例如,某些 Cache-Control 头部可能会阻止预取(例如 no-cacheno-store)。

注意:由于存在此类限制,建议您在支持的情况下使用 Speculation Rules API 来进行文档预取。

<link rel="prefetch"> 在功能上等效于带有 priority: "low" 选项的 fetch() 调用,只不过前者通常具有更低的优先级,并且在请求中设置了 Sec-Purpose: prefetch 头部。请注意,通常情况下,浏览器会赋予预取资源比预加载资源(例如,通过 <link rel="preload"> 请求)更低的优先级——当前页面比下一个页面更重要。

prefetch 操作的获取请求会生成一个包含 HTTP 头部 Sec-Purpose: prefetch 的 HTTP 请求。服务器可以使用此头部更改资源的缓存超时时间,或执行其他特殊处理。请求还将包含 Sec-Fetch-Dest 头部,其值设置为 empty

请求中的 Accept 头部将匹配用于普通导航请求的值。这允许浏览器在导航后找到匹配的缓存资源。

示例

基本预取

js
<link rel="prefetch" href="main.js" />

预取可以用来获取 HTML 和可能的下一次导航的子资源。一个常见的用例是在一个简单的网站登陆页面上获取网站其余部分使用的更多“重量级”资源。

html
<link rel="prefetch" href="/app/style.css" />
<link rel="prefetch" href="/landing-page" />

缓存分区的的影响

许多浏览器现在都实现了某种形式的 缓存分区,这使得 <link rel="prefetch"> 对旨在供不同顶级站点使用的资源变得无用。这包括跨站点导航时的主文档。因此,例如,以下预取

html
<link rel="prefetch" href="https://news.example/article" />

将无法从 https://aggregator.example/ 访问。

规范

规范
HTML 标准
# link-type-prefetch

浏览器兼容性

BCD 表格仅在启用 JavaScript 的浏览器中加载。

另请参阅

  • 推测性加载,以比较 <link rel="prefetch"> 和其他类似的性能改进功能。