gpt4 book ai didi

javascript - 何时解析HTML DOM树?

转载 作者:技术小花猫 更新时间:2023-10-29 11:45:58 25 4
gpt4 key购买 nike

我总是看到网页的渲染流程,如下图所示:
enter image description here

因此,绘画仅在解析DOM树并创建CSSOM之后才开始,对吗?另一句话是,最佳做法是将<script>放在<body>的末尾,以便页面在下载脚本之前呈现某些内容。

我的问题是,何时解析DOM树会发生,我们如何说它完成了?以我的理解,最后的<script>也是DOM树的一部分,只有加载脚本后,我们才能调用DOM树。浏览器从上到下读取html文件,创建DOM树,当看到<script>时,它将停止下载并执行它,直到解析遍历整个页面为止。或者,页面是在解析DOM树的同时绘制页面吗?

最佳答案

TL; DR:收到文档后,分析立即开始
解析和绘画
有关更详细的说明,我们需要深入研究渲染引擎的工作方式。
渲染引擎解析HTML文档并创建两棵树:content treerender tree。内容树包含所有DOM节点。渲染树包含所有样式信息(CSSOM),并且仅包含渲染页面所需的DOM节点。
一旦创建了渲染树,浏览器就会经历两个过程:在每个DOM节点上应用layoutpainting。应用布局意味着计算DOM节点应出现在屏幕上的确切坐标。绘画意味着实际渲染像素并应用样式属性。
这是一个循序渐进的过程:浏览器不会等到所有HTML解析完毕后再进行。部分内容将被解析和显示,而该过程将继续处理其余部分内容,这些其余内容始终来自网络。
您可以在浏览器中看到此过程。例如,打开Chrome开发者工具并加载您选择的网站。
Network tab
Network选项卡中记录 Activity 之后,您会注意到在下载文档时开始解析。它识别资源并开始下载。蓝色垂直线表示DOMContentLoaded事件,红色垂直线表示load事件。
Timeline tab
记录时间轴可让您更深入地了解幕后情况。我以上面的屏幕截图为例,以表明在解析文档时会进行绘制。请注意,初始绘制恰好发生在它继续解析文档的另一部分之前。此过程一直持续到到达文档末尾。
单螺纹
呈现引擎是单线程的。除了网络操作之外,几乎所有事情都在此线程中发生。
将其与网络的同步特性结合起来。开发人员希望<script>能够立即解析和执行(即:解析器到达脚本标签后立即执行)。这意味着:

  • 必须从网络中获取资源(由于DNS查找和连接速度,这可能是一个缓慢的过程)。
  • 资源的内容传递给Javascript解释器。
  • 解释器解析并执行代码。

  • 解析文档将暂停,直到此过程完成。通过在文档末尾添加<script>,不会缩短总解析时间。它的确增强了用户体验,因为解析和绘画过程不会被需要执行的<script>中断。
    通过用defer和/或async标记资源,可以解决此问题。 async在HTML解析期间下载文件,并在完成下载后暂停HTML解析器以执行该文件。 defer在HTML解析期间下载文件,并且仅在解析器完成后才执行。
    投机解析
    一些浏览器旨在通过使用所谓的推测性解析来解决<script>的阻塞方面。在下载和执行脚本时,引擎会向前解析(并运行HTML树构造!)。 Firefox和Chrome使用此技术。
    您可以想象,如果推测成功(例如,文档中包含的脚本未更改DOM),则性能会提高。无需等待脚本执行,页面已成功绘制。
    不利的一面是,当猜测失败时,将会有更多的工作丢失。
    对我们来说幸运的是,非常聪明的人正在使用这些技术,因此即使正确使用document.write也不会破坏该过程。另一个经验法则是不要使用document.write。例如,它可能会破坏投机树:
    // Results in an unbalanced tree
    <script>document.write("<div>");</script>

    // Results in an unfinished token
    <script>document.write("<div></div");</script>
    进一步阅读
    以下资源值得您阅读:
  • Web Fundamentals(Google Developers)
  • How browsers work
  • HTML5 Parser上的
  • MDN
  • An introduction to Browser Rendering(视频)
  • 关于javascript - 何时解析HTML DOM树?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34269416/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com