defer和async的区别

先来试个一句话解释仨,当浏览器碰到 script 脚本的时候:

  • 1.<script src="script.js"></script>
    没有 defer 或 async,浏览器会立即加载并执行指定的脚本,“立即”指的是在渲染该 script 标签之下的文档元素之前,也就是说不等待后续载入的文档元素,读到就加载并执行。
  • 2.<script async src="script.js"></script>
    有 async,加载和渲染后续文档元素的过程将和 script.js 的加载与执行并行进行(异步)。
  • 3.<script defer src="myscript.js"></script>
    有 defer,加载后续文档元素的过程将和 script.js 的加载并行进行(异步),但是 script.js 的执行要在所有元素解析完成之后,DOMContentLoaded 事件触发之前完成。


    image.png
为什么 JS 阻塞页面加载 ?

由于 JavaScript 是可操纵 DOM 的,如果在修改这些元素属性同时渲染界面(即 JavaScript 线程和 UI 线程同时运行),那么渲染线程前后获得的元素数据就可能不一致了。
因此为了防止渲染出现不可预期的结果,浏览器设置 GUI 渲染线程与 JavaScript 引擎为互斥的关系。
所以:当浏览器在执行 JavaScript 程序的时候,GUI 渲染线程会被保存在一个队列中,直到 JS 程序执行完成,才会接着执行。
因此如果 JS 执行的时间过长,这样就会造成页面的渲染不连贯,导致页面渲染加载阻塞的感觉。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 先来试个一句话解释仨,当浏览器碰到script脚本的时候: <script src="script.js"></s...
    夏至_9cb4阅读 326评论 0 0
  • 1. <script src="script.js"></script> 没有 defer 或 async,浏览...
    IAm夏花花阅读 1,816评论 0 3
  • 当浏览器碰到 script脚本的时候:1. 没有 defer 或 async,浏览器会立即加载并执行指定的脚本,...
    sicnu_meimei阅读 370评论 0 0
  • 主要记录下defer和async的区别:在没有defer或者async的情况下,会立即执行脚本,所以通常建议把sc...
    chouchou723阅读 7,156评论 0 4
  • 页面的加载和渲染过程 浏览器通过HTTP协议请求服务器,获取HMTL文档并开始从上到下解析,构建DOM; 在构建D...
    小小的白菜阅读 5,488评论 2 9