浏览器在解析HTML的过程中,遇到了script元素是不能继续构建DOM树的
为什么要这样做呢?
但是这个也往往会带来新的问题,特别是现代⻚⾯开发中:
为了解决这个问题,script元素给我们提供了两个属性(attribute):defer和async。
在HTML中的
<script>
标签,defer
和async
这两个属性用于控制脚本的加载和执行方式,以优化页面的渲染速度和脚本的执行顺序。
defer
属性的脚本会在文档解析过程中异步加载,这意味着它们不会阻塞页面的解析,从而允许浏览器继续处理HTML和渲染页面。这有助于加快页面的初步渲染。defer
属性的脚本会在HTML文档解析完成后,DOMContentLoaded事件触发之前,按照它们在文档中的顺序逐个执行。这样可以确保脚本之间的依赖关系得到维护。async
属性使得脚本的加载和执行完全独立于页面的解析,包括其他脚本的加载和执行。这意味着脚本加载时不会阻塞页面渲染,而且一旦脚本加载完毕就会立即执行,无论文档解析是否完成。async
的脚本不保证按照在HTML中出现的顺序执行。每个脚本独立加载并尽快执行,因此如果有多个async
脚本,它们的执行顺序不确定。总结来说,defer
适合那些需要维持执行顺序的脚本,而async
则更适合那些独立执行、无需考虑执行顺序的脚本。两者都能有效减少脚本对页面渲染速度的影响,但具体选择取决于脚本的执行需求。