详解JavaScript 中defer和async异步加载的区别

原创
小哥 3年前 (2022-10-21) 阅读数 9 #js教程
文章标签 JavaScriptasyncdefer

内部和外部脚本

向HTML页面插入JavaScript主要的方法是使用 script 元素,则有两种方法

  • 内联脚本 :直接嵌入到页面中JavaScript代码

  • 外联脚本 :参照外部JavaScript文件

在浏览器中加载HTML过程中,HTML 解析器在主线程中运行,并且遇到。 </script> 在标签被阻止之后,直到从网络获取并执行脚本。也就是说 <script> 标记中的脚本会阻止浏览器呈现,也称为“呈现阻止”。

阻塞的解决方案

script 标签提供两个属性: deferasync ,作为异步加载的解决方案。

async

Boolean属性指示浏览器是否在允许的情况下异步执行脚本。此属性对内联脚本没有影响。 (即没有src属性的脚本)。那是,async该属性告诉浏览器首先下载文件,并在时间成熟时执行。异步脚本肯定会出现在页面上load在事件之前执行,但可能是DOMContentLoaded在触发事件之前或之后执行。更重要的是要注意到这个标记。async该脚本不保证按指定的顺序执行。因此,确保每个异步脚本不相互依赖是非常重要的。

defer

此布尔属性设置为通知浏览器在分析文档后将触发脚本。 DOMContentLoaded 事前执行。如果丢失 src 属性(即内联脚本),不应该使用它,因为它在这种情况下不起作用。用于动态嵌入的脚本 async=false 以达到类似的效果。

区别

从上图可以看出,defer和async可以达到异步加载的目的,他们都告诉浏览器应该立即下载,但下载后 执行时间不同

  • async下载完成后,将执行浏览器空间,但仍可能导致渲染阻塞。
  • 而defer会在HTML在所有资源解析完成之前,它不会执行。

总结

  • defer和async都是 异步 加载 外部 JS文件
  • defer和async显然,不同之处在于下载完成后执行脚本的时间。defer更接近需求
  • async不能保证脚本执行的顺序。
  • async在外部JS加载后,当浏览器空闲时触发执行。
  • defer是在外部JS加载后,在解析完整个文档后触发执行。
  • defer更像是将 <script> 标签放在 <body> 但它是异步加载的,节省了时间。
版权声明

所有资源都来源于爬虫采集,如有侵权请联系我们,我们将立即删除