浏览器如何部分加载DOM和CSSOM?

时间:2015-12-12 23:48:20

标签: html performance google-chrome dom

首先让我简单介绍一下它是如何加载的,然后就此提出问题。

浏览器抓取HTML => 解析HTML => 创建节点 => 解析节点并开始将它们转换为Dom元素 => 找到样式节点,然后开始创建CSSOM => 完成解析,如果有样式标记,则等待它构建CSSOM树 => 一旦完成,它会同时合并DOM和CSSOM,并触发DOMContentLoaded事件

总而言之,一旦CSSOM准备就绪,浏览器就会开始渲染,并且可以逐步添加Dom。

这一切都很好,但是当浏览器开始渲染页面时,如果没有加载整个html,流程是如何进行的...(例如在nodejs中你可以部分html然后等待2s再发送更多)

  1. 如果页面底部有另一个样式标记,该怎么办?没有收到所有的html,也没有css浏览器会开始渲染,但从我的理解渲染只发生在cssom完全构建之后。
  2. 脚本标记会发生什么,如果css未完成,则不会执行处理脚本标记,因此也会停止解析。 CSS在CSSOM完成后运行。

3 个答案:

答案 0 :(得分:1)

事情可能会阻止DOMContentLoaded事件,但这并不会阻止呈现不完整的页面。这对于从慢速服务器流式传输的很长页面来说非常重要。

浏览器可以并且执行交错脚本执行,重新样式化,使用文档解析进行渲染。这可以通过在<head>中执行javascript并查询DOM来简单地显示,您将看到文档在DOMContentLoaded事件之前不会拥有其所有节点(可能甚至不是body元素)烧成。

您必须将文档构造更多地视为流,而不是在下一个块开始之前运行完成的顺序执行的块。

答案 1 :(得分:0)

CSSOM停止解析。因此执行后续脚本标签,也延迟了渲染。

样式标签之前的脚本标签将在CSS从样式标签加载到CSSOM中之前执行。

脚本标签后面的样式标签会更改CSSOM。而且,如果脚本访问的样式已被更改,则其读取的内容已过时。订单很重要。

不仅停止渲染,而且停止解析。

  

JavaScript阻止分析,因为它可以修改文档。的CSS   无法修改文档,因此似乎没有理由   阻止解析,对吧?

     

但是,如果脚本要求提供尚未提供的样式信息怎么办?   解析了吗?浏览器不知道脚本要做什么   执行-它可能会要求类似DOM节点的背景色   这取决于样式表,或者可能期望访问CSSOM   直接。

     

因此,CSS可能会根据以下顺序阻止解析   外部样式表和文档中的脚本。如果有   外部样式表放置在文档中脚本之前,   DOM和CSSOM对象的构造可能会相互干扰。   当解析器到达脚本标签时,无法进行DOM构建   直到JavaScript完成执行,并且JavaScript不能   执行,直到下载,解析CSS,并且CSSOM为   可用

https://hacks.mozilla.org/2017/09/building-the-dom-faster-speculative-parsing-async-defer-and-preload/

答案 2 :(得分:0)

一些重要的事实:

  • 事件 DOMContentLoaded 在文档被 main 解析器完全解析并且 DOM 已经完全构建时被触发。
  • 任何普通脚本(非异步或延迟)都会有效地阻止 DOM 构建。原因是脚本可能会改变 DOM。
  • 引用样式表既不是解析器阻塞程序,也不是 DOM 构造阻塞程序。
  • 如果在引用 CSS 后添加 <script>(无论是外部的还是内联的),脚本的执行(不获取)会延迟,直到 CSS 的获取和解析完成即使脚本的获取更早完成,也已完成。原因是脚本可能依赖于要加载的 CSS 规则。所以浏览器必须等待。 仅在这种情况下,CSS 会间接阻止文档解析器和 DOM 构建。
  • 当浏览器被脚本阻塞时,第二个轻量级解析器会扫描标记的其余部分以寻找其他资源,例如样式表、脚本、图像等,也需要检索。这称为“预加载”。