当前位置 : 主页 > 网络编程 > 其它编程 >

浅谈defer和async的区别

来源:互联网 收集:自由互联 发布时间:2023-07-02
当浏览器碰到script脚本的时候没有defer或async浏览器会立即加载并执行指定的 当浏览器碰到 script 脚本的时候 没有 defer 或 async浏览器会立即加载并执行指定的脚本也就是说不等待后续
当浏览器碰到script脚本的时候没有defer或async浏览器会立即加载并执行指定的

当浏览器碰到 script 脚本的时候

  • 没有 defer 或 async浏览器会立即加载并执行指定的脚本也就是说不等待后续载入的文档元素读到就加载并执行。

  • 有 async加载和渲染后续文档元素的过程将和 script.js 的加载与执行并行进行异步。

  • 有 defer加载后续文档元素的过程将和 script.js 的加载并行进行异步但是 script.js 的执行要在所有元素解析完成之后DOMContentLoaded 事件触发之前完成。

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

    接着我们来看一张图咯

    请输入图片描述

    蓝色线代表网络读取红色线代表执行时间这俩都是针对脚本的绿色线代表 HTML 解析。

    此图告诉我们以下几个要点

  • defer 和 async 在网络读取下载这块儿是一样的都是异步的相较于 HTML 解析
  • 它俩的差别在于脚本下载完之后何时执行显然 defer 是最接近我们对于应用脚本加载和执行的要求的
  • 关于 defer此图未尽之处在于它是按照加载顺序执行脚本的这一点要善加利用
  • async 则是一个乱序执行的主反正对它来说脚本的加载和执行是紧紧挨着的所以不管你声明的顺序如何只要它加载完了就会立刻执行
  • 仔细想想async 对于应用脚本的用处不大因为它完全不考虑依赖哪怕是最低级的顺序执行不过它对于那些可以不依赖任何脚本或不被任何脚本依赖的脚本来说却是非常合适的最典型的例子Google Analytics
  •  

     

    这里注意js代码执行线程和渲染线程是串行的只有在js执行完毕后浏览器才能渲染 

     

    总结

  • defer和async的作用
  • 传统方式下在文档中遇到script标签会先加载js脚本后面的文档加载会先停止
  • 如果在script脚本中插入defer和async可以使得js脚本与文档加载异步进行
  • 区别      在于脚本加载完成后何时运行
  • defer 是在浏览器渲染完成之后执行js代码并且按照加载的顺序执行代码
  • async 是在加载完成后立即执行特点是乱序执行因为每个js代码的加载时间不同
  • 上一篇:06_MybatisPlus—自动填充功能
    下一篇:没有了
    网友评论