Yuanfang-fe / Blog-X

https://yuanfang-fe.github.io/Blog-X/
4 stars 0 forks source link

prefetch、dns-prefetch、preload、preconnect、prerender #34

Open Yuanfang-fe opened 3 years ago

Yuanfang-fe commented 3 years ago

在做项目优化的时候,遇到了 prefetchpreload,之前没有总结过,所以今天顺带都总结下。

首先这些属性都是在 link 标签上使用,以前都是拿 link 标签来加载外部css,没想到还有这个妙用。

preload

示例代码

<link href="app.9dad33ea7f9b9e219e85.js" rel="preload" as="script">
<link href="css/app.613f0ba0.css" rel="preload" as="style">

作用 (提前加载)

preload 是一个高优先级的资源加载声明,专注于当前页面。

通过 Chrome devtools 的 network 面板,可以看到带有 <link rel="preload"> 的资源会优先发送加载的请求。

那么到底会优先到啥程度呢? MDN 是这么说的

对于这种即刻需要的资源,你可能希望在页面加载的生命周期的早期阶段就开始获取,在浏览器的主渲染机制介入前就进行预加载。这一机制使得资源可以更早的得到加载并可用,且更不易阻塞页面的初步渲染,进而提升性能。

主渲染机制介入前?有点抽象啊,没关系,我们用 chrome 的Performance 来形象的看一下,如图

image

在下载了文本文档之后,在 parse HTML 之前就开始请求带有 rel="preload" ,好家伙,这个优先级确实够高的,不过要注意,这里只是提前加载,加载完后会将他们存储在浏览器的缓存中,并不会马上执行(js),等 parse HTML 的时候,解析到对应的资源标签,再从缓存中获取。

如果说不用 preload 那文件啥时候加载呢,理论上是在 parse HTML 之后,因 html 是逐行解析的,所以,当解析到 js、 css 对应的 script 和 link 标签时才会去请求加载。为了验证下这个想法,把 html 里面的 preload 都去掉之后,再看下(用anywhere本地起个服务,上张图是用的线上测试环境的,所有有些加载时间会不太一样,这里只是验证想法)

image

通过两张图的对比,应该能很清晰的看出来区别了吧。

支持哪些类型的内容预加载