通常我们在编写网页的时候会在html里面引用script标签来添加一些第三方的脚本,在同步的情况下,html必须要按部就班的向下加载,一但碰到了script标签,也必须要强行把他们加载执行完,哪怕是它们是在一个环境很差的服务器上,所以就可能会出现页面加载缓慢,白屏的现象。
这个时候,我们就有两种解决办法,就是async(异步)和defer(延迟)这两种属性,它们可以使script标签不影响后续DOM的渲染。
1. async
浏览器在加载页面时,如果碰到了async,会将带有async的script标签立即进行加载且执行,与此同时,页面也会同时加载,也就是说他们会在同一时间内互不干扰的运作,这样就避免了阻塞
从上图可以看出,假设在Script标签中我们需要对一些DOM做操作的时候,有可能这个DOM还没加载出来,这个时候就会出错,所以async对第三方的脚本要更加友好一点,当然,为了处理这个问题,defer的出现就很有必要了。
2. defer
在页面加载的时候,碰到了defer,页面不会停止加载,与此同时,脚本会与它一同加载,但是不会执行,直到浏览器将html解析完后才会再去执行这个脚本,也就是说这个脚本的执行被推迟到了最后面,这样我们想去操作DOM也不会有什么问题了。
总结:
async更适合于脚本不依赖于DOM元素的环境下,相反,如果需要依赖脚本,defer相对来说更好一点。
所以一般情况下,defer要更稳定一点