返回

script标签中的async、defer——同台竞技,谁胜谁负?

前端

一、执行顺序:并行与串行之争

1. async属性:并行之王

async属性允许脚本在页面解析时就开始加载和执行,也就是说它与页面的其他资源(如HTML、CSS、图像等)是并行加载的。当脚本加载完成后,它将立即执行,而不会等待其他资源加载完成。因此,async属性非常适合那些对页面加载速度至关重要的脚本,例如加载跟踪代码、统计代码等。

2. defer属性:串行执行者

defer属性要求脚本在整个页面解析完成之后再加载和执行。也就是说,脚本的加载和执行是串行的,必须等到页面中的所有HTML和CSS资源都加载完成后才会开始加载和执行脚本。因此,defer属性适用于那些对页面加载速度影响不大的脚本,例如加载第三方库、插件等。

二、加载条件:时机与优先级

1. async属性:时机优先

async属性的脚本加载没有特定的条件限制,只要页面开始解析,它就会立即开始加载。因此,async属性的脚本加载速度是最快的。

2. defer属性:优先级靠后

defer属性的脚本加载必须等到整个页面解析完成之后才会开始。因此,defer属性的脚本加载速度要比async属性的脚本加载速度慢一些。

三、同时存在时的执行优先级

如果页面中同时存在async和defer属性的脚本,那么它们的执行优先级如下:

1. async属性的脚本优先执行

2. defer属性的脚本按照其在页面中的顺序依次执行

四、兼容性:浏览器支持情况

async和defer属性都得到了所有现代浏览器的支持,包括IE9+、Firefox、Chrome、Safari等。因此,您可以放心地在您的网页中使用它们。

五、最佳实践:合理使用,优化性能

在使用async和defer属性时,您需要根据脚本的重要性合理使用它们。对于那些对页面加载速度至关重要的脚本,可以使用async属性来提高加载速度。对于那些对页面加载速度影响不大的脚本,可以使用defer属性来减少对页面加载速度的影响。

六、示例代码:亲自动手,体验差异

以下是使用async和defer属性的示例代码:

<!-- 使用async属性的脚本 -->
<script async src="async.js"></script>

<!-- 使用defer属性的脚本 -->
<script defer src="defer.js"></script>

<!-- 使用async和defer属性的脚本 -->
<script async defer src="async-defer.js"></script>

您可以将这些代码复制到您的网页中,然后观察脚本的加载和执行顺序。

七、结语:大道至简,灵活运用

async和defer属性都是非常有用的工具,可以帮助您优化网页的性能。但是,您需要根据脚本的重要性合理使用它们,才能达到最佳的优化效果。希望本文对您理解和使用async和defer属性有所帮助。