rel=prefetch

可用性有限

此特性不是基线特性,因为它在一些最广泛使用的浏览器中不起作用。

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

结果会保留在硬盘的 HTTP 缓存中。因此,它对于预取子资源很有用,即使它们不被当前页面使用。您也可以使用它来预取用户可能访问的网站上的下一个文档。但是,您需要注意请求头——例如,某些 Cache-Control 请求头可能会阻止预取(例如 no-cacheno-store)。

注意: 由于这些限制,建议您在支持 Speculation Rules API 的情况下,优先使用该 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"> 对于不同顶级站点 intended 的资源无效。这包括跨站点导航时的主要文档。因此,例如,以下预取

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

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

规范

规范
HTML
# link-type-prefetch

浏览器兼容性

另见

  • 投机性加载,用于比较 <link rel="prefetch"> 和其他类似的性能改进功能。