带你玩转defer和async, dns-prefetch, prefetch, preload

1,540 阅读2分钟

defer: 页面渲染的时候遇到script文件会立刻下载,下载过程是异步的, script.js 的执行会在所有元素解析完成之后,DOMContentLoaded 事件触发之前进行

async: 页面渲染的时候遇到script文件会立刻下载,下载过程是异步的,下载完成后会自动执行,他执行的时候会阻塞dom解析,但是他执行时间不一定,可能在DTL事件之前,也可能之后,但一定在load事件之前,所以,async不能保证js文件的执行顺序

dns-prefetch:  

<link rel="dns-prefetch" href="//example.com">

提前进行域名解析,对于taobao这种网站,它的网页中引用了大量很多其他域名的资源,适合这个属性,如果网站的所有的资源基本都在本域名下,那么这个基本没有什么作用。因为Chrome在访问你的网站就帮你缓存了。

Preload:

<link rel="preload" href="/main.js" as="script">

浏览器会在遇到如上link标签时,立刻开始下载main.js(异步加载),并放在内存中,但不会执行。只有当遇到script标签加载的也是main.js的时候,浏览器才会将预先加载的JS执行掉。如果这个时候JS仍然没有下载完,浏览器不会重新发请求,而是等待此文件的加载。不仅是JS文件,字体和图片图片等资源也可以用这个属性,不过记得用as属性标明资源类型,否则这个设置会失效

Prefetch:

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

浏览器会在空闲的时候,下载main.js,当有页面使用的时候,直接从缓存中读取。其实是把决定是否和什么时间加载这个资源的决定权交给浏览器。如果在prefetch还没下载完的时候,浏览器发现script标签也引用了同样的资源,浏览器会再次发起请求,这样会造成加载了两次,所以不要在当前页面马上就要用的资源上用prefetch,要用preload。



Preload预加载技术

github.com/lanjingling…