async / defer
共同点:
使用 async/defer 属性在加载脚本时,异步下载文件,不会阻塞页面解析;
async/defer 仅适用于外链( 内联的 script 标签是不起作用的 ),async规定脚本异步执行;
不同点:
执行时间:
async:脚本加载完成后就马上执行,脚本执行时会阻塞 HTML 解析;
defer:在 HTML 解析完成后, DOMContentLoaded 触发之前执行;整个页面在内存中正常渲染结束(DOM 结构完全生成,以及其他脚本执行完成),在window.onload 之前执行;
defer 用途其实跟 preload 十分相似。可以使用 defer 加载脚本在 head 末尾,这比将脚本放在 body 底部效果来的更好。
执行顺序:
defer:脚本保证是按顺序依次执行的。
async:在下载后尽快执行,不能保证脚本会按顺序执行。先下载完哪个就先执行哪个;脚本执行时会阻塞 HTML 解析。async是HTML5新增的,作用和defer类似;
defer 与 preload 差异
1、defer 相比于 preload 加载的优势在于浏览器兼容性好;
2、不足之处在于:defer 只作用于脚本文件,对于样式、图片等资源就无能为力了,并且 defer 加载的资源是要执行的,而 preload 只下载资源并不执行,待真正使用到才会执行文件。
3、对于页面上主/首屏脚本,可以直接使用 defer 加载,而对于非首屏脚本/其它资源,可以采用 preload/prefeth 来进行加载。