在script标签中加上defer属性效果是不是等同于把script放在</body>前,async异步加载js文件,加载完成后立即执行,那么async会不会在dom加载完之前就执行了,如果是这样的话,那么它的适用场景是什么
在script标签中加上defer属性效果是不是等同于把script放在</body>前,async异步加载js文件,加载完成后立即执行,那么async会不会在dom加载完之前就执行了,如果是这样的话,那么它的适用场景是什么
defer 和 async 在网络下载这块儿是一样的,相较于 HTML 解析都是异步的。不同点在于脚本下载完之后何时执行,defer是在HTML完全解析后再最后执行,async是下载完立即执行
之前写了一篇介绍 <script> 标签的 defer
与 async
属性 的文章,只需要 10 分钟即可看完,可以详细的了解他们的「区别」与「最佳实践」,建议阅读。
这里把总结列出来,可以看一下,快速了解:
defer
HTML
,等解析完 HTML
之后,才会执行 script
。JavaScript
资源。HTML
中的相对顺序执行脚本。DOMContentLoaded
事件。HTML
中已有的元素。defer
属性对模块脚本无效。src
引用的 script
)。async
HTML
,但是 script
下载完成后,会立即中断浏览器解析 HTML
,并执行此 script
。JavaScript
资源。DOMContentLoaded
事件和 script
脚本无相关性,无法确定他们的先后顺序。另外:async
和defer
之间最大的区别在于它们的执行时机。
还有就是这张非常经典的图:
8 回答4k 阅读✓ 已解决
6 回答2k 阅读✓ 已解决
5 回答5.8k 阅读✓ 已解决
4 回答1.9k 阅读✓ 已解决
3 回答2.1k 阅读
5 回答2k 阅读✓ 已解决
4 回答2.5k 阅读✓ 已解决
1.
defer
的延迟加载确实十分类似把script
放在</body>
前,不过不能说是等同,因为defer
属性的script
外部文件的下载是与html
解析线程同时进行的,而最后的执行时放在html
解析的最后面,所以说效果类似,但是区别在于节省了外部script
下载的时间。2.
async
是加载完成后立即执行,所以会在dom
加载完之前执行,在async
执行完之后,html
再继续解析。3.我理解的两者的适应场景其实都主要在于“异步下载”这个点,所以当有多个外部脚本时可以节省很多下载时间,两者的区别体现在因为多个带
async
属性的外部脚本下载后的执行顺序不确定,所以适合没有相互依赖关系的多个外部脚本使用,而多个defer
属性的外部脚本一般来说会按照顺序进行执行。4.还有一些具体的可以参考下之前sf里面的一篇博客和一个问答,说得都挺好
浅谈script标签的defer和async
defer和async的区别