【发布时间】:2016-03-18 17:07:09
【问题描述】:
首先让我简单概述一下它是如何加载的,然后我就问这个问题。
浏览器获取 HTML => 解析 html => 创建节点 => 解析节点并开始将它们转换为 Dom 元素 => 找到样式节点,然后开始创建 CSSOM => 在完成解析时,如果有样式标记,它会等待让它构造 CSSOM 树 => 一次两者都完成了,它合并了 DOM 和 CSSOM,并触发 DOMContentLoaded 事件。
总而言之,只要 CSSOM 准备就绪,浏览器就会开始渲染,并且可以逐步添加 Dom。
这一切都很好,但是当浏览器开始渲染页面而不是整个 html 加载时,流程是如何进行的..(例如在 nodejs 中,您可以部分 html 然后等待 2 秒然后发送更多)
- 如果页面底部有另一个样式标记怎么办。没有收到所有的 html,也没有 css 浏览器会开始渲染,但据我了解,渲染只发生在 cssom 完全构建之后。
- 脚本标签会发生什么,如果 css 未完成,则不会执行处理脚本标签,因此也会停止解析。 JS 在 CSSOM 完成后运行。
【问题讨论】:
-
渲染不必等待所有 CSS 可用。
-
developers.google.com/web/fundamentals/performance/… 根据这个 js,渲染发生在 cssom 完成后,cssom 阻塞一切的全部原因是 css 稍后可以更改输出,而稍后加载的 dom 元素不会改变输出,但只会添加到 dom 树中
-
据我了解:首先..解析和渲染是不同的阶段。 DOM 是增量构建的,这意味着无需加载整个 html 文件,只要字节从连接到达,它就会被解析。不是 CSS,首先获取整个 CSS 文件,然后进行解析。是的,CSS 链接/内联/嵌入会阻止解析。浏览器将等待 CSSOM 完成。在所有阻塞的 css/脚本都被获取执行/解析之后。只有在 DOMContentLoaded 被触发后,DOM/CSSOM 才被构建。现在开始造型和渲染。我在想他们只会阻止渲染,但不会阻止解析。
-
我的理解存在一些误区。构建完所有 CSSOM 后,JS 不会运行。只有 CSSOM 用于遇到的样式标签。脚本和样式标签按照声明的顺序执行(不使用延迟/异步)。
标签: html performance google-chrome dom