Skip to content

如何更细粒度控制web资源加载的优先级?

一、链接类型:prefetch

关键字 prefetch 作为元素 的属性 rel 的值,是为了提示浏览器,用户未来的浏览有可能需要加载目标资源,所以浏览器有可能通过事先获取和缓存对应资源,优化用户体验。

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

二、链接类型:preload

当在 元素上设置了 rel="preload" 时,link 的 as 属性为必填属性

当设置了 rel="modulepreload"时,as 属性为可选属性,否则不应使用。

as

它指定了 正在加载的内容类型,这对于匹配请求、应用正确的内容安全策略和设置正确的 Accept 请求标头都是必要的。

此外,rel="preload" 将其用作请求优先级的信号。下表列出了该属性的有效值及其适用的元素或资源。

三、script标签的defer和async属性

defer和async属性都是script标签的属性,它们都是控制script标签加载的优先级,但是它们有区别。

defer这个布尔属性

  • 属性的设置是为了向浏览器表明,该脚本是要在文档被解析后,但在触发 DOMContentLoaded 事件之前执行的

  • 包含 defer 属性的脚本将阻塞 DOMContentLoaded 事件触发,直到脚本完成加载并执行。

本属性不应在缺少 src 属性的情况下使用(也就是内联脚本的情况下),这种情况下将不会生效。defer 属性对模块脚本也不会生效——它们默认是 defer 的。

async这是个布尔属性

  • 对于普通脚本,如果存在 async 属性,那么普通脚本会被并行请求,并尽快解析和执行。

  • 对于模块脚本,如果存在 async 属性,那么脚本及其所有依赖都会在延缓队列中执行,因此它们会被并行请求,并尽快解析和执行。

该属性能够消除解析阻塞的 Javascript。解析阻塞的 Javascript 会导致浏览器必须加载并且执行脚本,之后才能继续解析。defer 在这一点上也有类似的作用。

四、importance 属性

你可以使用一个 importance 属性来更细力度的控制资源加载的优先级,包括 link、img、script 和 iframe 这些标签。

importance 属性可以指定三个值:

  • high:你认为该资源具有高优先级,并希望浏览器对其进行优先级排序。
  • low:你认为该资源的优先级较低,并希望浏览器降低其优先级。
  • auto:采用浏览器的默认优先级。

Released under the MIT License.