defer和async属性的区别

摘要

我们知道,网页的加载顺序是由上到下的。由于解释器在解析执行JavaScript代码期间会阻塞页面其余部分的渲染,对于存在大量JS代码的页面来说会导致浏览器出现长时间的空白、延迟、甚至浏览器假死现象。基于这个原因,很多文章都建议我们把JavaScript脚本放在页面底部,之前。

我们知道,网页的加载顺序是由上到下的。由于解释器在解析执行JavaScript代码期间会阻塞页面其余部分的渲染,对于存在大量JS代码的页面来说会导致浏览器出现长时间的空白、延迟、甚至浏览器假死现象。基于这个原因,很多文章都建议我们把JavaScript脚本放在页面底部,</body>之前。

虽然很多人都知道这个,但是真正能做到的人却寥寥无几。也许开发界的大佬们正是看到这个现象,所以为了适应大家的习惯,特意为script标签引进了defer和async属性来解决脚本阻塞页面问题。

对于这两个属性,很多人见过,但是却知之甚少。

下面我们看一个例子,当浏览器碰到script脚本的时候,大致分为如下三种情况:

1、没有defer或async,浏览器会立即加载并执行指定的脚本,“立即”指的是在渲染该script标签之下的文档元素之前,也就是说不等待后续载入的文档元素,读到就加载并执行。

2、有async,加载和渲染后续文档元素的过程将和script脚本的加载与执行并行进行。

3、有defer,加载后续文档元素的过程将和script脚本的加载并行进行,但是script脚本的执行要在所有元素解析完成之后,DOMContentLoaded事件触发之前完成。

综上所述:从实用角度来说呢,所有脚本都丢到之前是最佳实践,因为对于旧浏览器来说这是唯一的优化选择,此法可保证非脚本的其他一切元素能够以最快的速度得到加载和解析。

下面,笔者就来深度剖析一下defer和async属性的区别

1、defer和async在网络加载过程是一致的,都是异步执行的;

2、有defer属性的脚本,它是按照加载顺序执行脚本的;

3、有async属性的脚本,它的加载和执行是紧紧挨着的,无论声明顺序如何,只要加载完成就立刻执行。

4、当我们的脚本之间有依赖关系,请添加defer属性按照依赖关系,由上到下依次书写;对于没有任何依赖关系的脚本,请使用async属性。

shaw

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: