资讯专栏INFORMATION COLUMN

彻底搞懂 defer & async

luckyyulin / 2801人阅读

摘要:彻底搞懂通过浏览器的开发者工具可以直观的看到,图中蓝色的线和蓝色的字使用不同的表现形式表示这个事件触发的时间。当脚本下载完后立即执行,执行顺序不确定。

彻底搞懂 defer & async DOMContentLoaded

通过 chrome 浏览器的开发者工具可以直观的看到,图中蓝色的线和蓝色的字使用不同的表现形式表示 DOMContentLoaded 这个事件触发的时间。

我们先来思考一个问题,如何衡量一个网页的加载速度?

在日常生活中,很多时候因为网络原因我们并不需要等待网页上的所有内容都加载完毕,而是只需要加载主要内容即可,比如你打开这篇博客时,可能并不需要等待所有图片都加载完成,而是看到博客的正文就可以正常阅读。也就是说,用户有时候只需要在空白的网页上看见内容就可以,而不需要等待所有内容都加载出来。

那么如何衡量“计算这个网页从空白到出现内容所花费的时间”呢?HTML5 规范已经帮我们完成相应的工作,即当一个 HTML 文档被加载和解析完成后,DOMContentLoaded 事件便会被触发。

浏览器向服务器请求到 HTML 文档后便开始解析(其产物是 DOM),到这里 HTML 文档就可以说是被加载和解析完成,同时如果有 CSS 文件则会根据 CSS 生成 CSSOM,然后再合并 DOM 和 CSSOM 生成渲染树,至此我们已经知道所有节点的样式,下面便根据这些节点以及样式计算它们在浏览器中确切的大小和位置(即布局阶段),最后得到以上这些信息后,就可以把节点绘制到浏览器上。

下面我们要加入考虑 JavaScript:JavaScript 可以阻塞 DOM 的生成,也就是说当浏览器在解析 HTML 文档时,如果遇到(同步)脚本则停止解析,先去加载脚本并执行,执行结束后继续解析 HTML 文档。

defer

当 HTML 文档被解析时如果遇到 defer 脚本,则在后台加载脚本,文档解析过程不中断,等待文档解析结束之后,defer 脚本执行。

另外,defer 脚本的执行顺序与定义时的位置有关。

如果 script 标签中包含 defer,那么这一块脚本将不会影响 HTML 文档的解析,而是等到 HTML 解析完成后才会执行,而 DOMContentLoaded 只有在 defer 脚本执行结束后才会被触发。

HTML 文档解析不受影响,等 DOM 构建完成之后 defer 脚本执行,但脚本执行之前需要等待 CSSOM 构建完成,在 DOM & CSSOM 构建完毕,defer 脚本执行完成之后,DOMContentLoaded 事件触发。

async

当 HTML 文档被解析时如果遇到 async 脚本,则在后台加载脚本,文档解析过程不中断,脚本加载完成后,文档停止解析并执行脚本,执行结束后文档继续解析。

当脚本下载完后立即执行,执行顺序不确定。

如果 script 标签中包含 async,则 HTML 文档构建不受影响,解析完毕后 DOMContentLoaded 触发,而不需要等待 async 脚本执行、样式表加载等。
其他

我们在 jQuery 中经常使用的 $(document).ready(function() { // ...代码... }); 其实监听的就是 DOMContentLoaded 事件

如果 script 无 src 属性,则 defer, async 会被忽略

动态添加的 script 标签隐含 async 属性

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/93062.html

相关文章

  • 深入前端-彻底搞懂浏览器运行机制

    摘要:当这些异步任务发生的时候,它们将会被放入浏览器的事件任务队列中去,等到运行时执行线程空闲时候才会按照队列先进先出的原则被一一执行,但终究还是单线程。 浏览器是多进程的 showImg(https://segmentfault.com/img/remote/1460000019706956?w=815&h=517); Browser进程: 浏览器的主进程(负责协调、主控),只有一个。 负...

    YPHP 评论0 收藏0
  • 深入前端-彻底搞懂浏览器运行机制

    摘要:当这些异步任务发生的时候,它们将会被放入浏览器的事件任务队列中去,等到运行时执行线程空闲时候才会按照队列先进先出的原则被一一执行,但终究还是单线程。 浏览器是多进程的 showImg(https://segmentfault.com/img/remote/1460000019706956?w=815&h=517); Browser进程: 浏览器的主进程(负责协调、主控),只有一个。 负...

    Youngs 评论0 收藏0
  • 文章彻底搞懂Python类属性和方法的开启

      对python调用类特性方式详细描述检验前提下类开启也经常需要用到的,下面文中重要给大家介绍了相关Python类属性和方法的开启的相关资料,从文中根据实例编号介绍的非常详细,务必的朋友可以参考一下  Python从技术的时候就已经已是一类面向对象语言表述,也正因为如此,在Python中打造一个类和对象是非常简单的。  一、类、总体目标概述  在C语言程序设计中,把数据和信息以及对业务操作流程封...

    89542767 评论0 收藏0
  • 文章彻底搞懂Python类属性和方法的开启

      对python调用类特性方法详细描述检验前提下类开启也经常需要用到的,下面文中重要给大家介绍了相关Python类属性和方法的开启的相关资料,文中依据案例编号介绍的非常详细,务必的朋友可以参考一下  Python从技术的时候就已经已是一类面向对象语言表述,也正因为如此,在Python中建立一个类和对象是非常简单的。  一、类、对方概述  在编程设计设计中,把数据和信息以及对业务操作过程封装类型在...

    89542767 评论0 收藏0
  • 谈谈 <script> 标签以及其加载顺序问题,包含 defer &amp; async

    摘要:标签加载顺序如果要谈标签加载顺序问题,首先要谈的就是标签的位置,因为标签的位置对于加载顺序来说有着很重要的影响。例如标签在以上代码中,可能由于下载时间比较长,由于两个标签都是异步执行,互不干扰,因此可能就会先于执行。 谈谈 标签加载顺序的问题 这篇文章比较长,如果你耐心读完了,我会感谢你愿意在这篇文章上花费时间,也希望你有收获。 其实说起,几乎搞前端的都知道他的作用:引入 JavaS...

    alexnevsky 评论0 收藏0

发表评论

0条评论

luckyyulin

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<