【浏览器性能优化】优化关键渲染路径——各种对象模型(DOM,CSSOM 等)

浏览器开始渲染网页之前,需要构建 “DOM” 和 “CSSOM” 两棵树。

简述

  1. 字节 → 字符 → 符号 → 节点 → 对象模型
  2. HTML 将会被翻译成 “文档对象模型(Document Object Model,DOM)”;CSS 将会被翻译成 “样式表对象模型(CSS Object Model,CSSOM)”
  3. CSSOM 和 DOM 二者无关联,是两颗独立的树
  4. Chrome 的开发者工具可以让我们很轻松的地捕捉并检查构建 DOM 和 CSSOM 时的花销。

文档对象模型(DOM)

<html>
  <head>
    <meta name="viewport" content="width=device-width,initial-scale=1">
    <link href="style.css" rel="stylesheet">
    <title>Critical Path</title>
  </head>
  <body>
    <p>Hello <span>web performance</span> students!</p>
    <div>![](awesome-photo.jpg)</div>
  </body>
</html>

试一试吧

让我们从一个简单的例子开始:一个简单的 HTML 文件,里面包含了一行文字和一张图片。浏览器是如何渲染这个页面的?

浏览器渲染过程
  1. 转换:浏览器从网络或者磁盘中读取网页的字节内容,并且根据标注的编码(比如 UTF-8)将这些内容转换成字符。
  2. 标记化(Tokenizing):浏览器将会根据HTML 的标准把上一步的结果转换成 “标记(Token)”。比如 <html> 或者 <body> 这种被尖括号包住的 "标记(Token)" 均有特殊的意义
  3. 词法分析:上一步的结果将会被转换成对象(Object),其中包含了节点的各种属性和规则。
  4. 生成 DOM 树:最后,由于在 HTML 中每一个标签之间都有联系(比如子父级关系),上一步创建的对象将会形成一个树状的结构,如下图:
DOM 的树状结构

本过程最终的产物是文档对象模型(DOM),浏览器将会用这棵树来进行页面的相关操作。

以上过程总是会发生在浏览器解析 HTML 时——将字节转换为字符,将字符转换为标记,将标记转换成节点(nodes),最后将 DOM 树创建出来。整个过程可能需要一些时间,尤其是在页面比较大的情况下。

从 Chrome 捕获的时间线
从 Chrome 捕获的时间线(译者)

打开 Chrome,并在页面加载的时候开始一个性能分析,观察时间线,你会看到解析 DOM 的花费时间——在这个例子中,从 HTML 到 DOM 树大约需要 5ms(译者这里是0.8ms)。页面内容越多,该时间将会被显著延长。由此可见,如果我们想让自己的网页有平滑的体验,那么这将是一个性能瓶颈。

DOM 只是描述了文档节点之间的结构和属性,并没有告诉我们每个节点应该如何渲染——这就是 CSSOM 的事情了。

CSS Object Model (CSSOM)

当浏览器构建 示例页面 的 DOM 时,它在 页面的 head 区域发现了一个 link 标签,该标签引用了一个外部的 CSS:style.css。

浏览器内心想:
我必须要这个文件才能开始页面的渲染呀!

于是它发送了一个事件,用于请求style.css。返回的内容是这样的:

body { font-size: 16px }
p { font-weight: bold }
span { color: red }
p span { display: none }
img { float: right }

我们也可以将 CSS 写到 HTML 的 style 标签中,但是将 CSS 和 HTML 分开有助于我们将设计和开发的工作分开:设计师专注于写 CSS,开发者专注于 HTML。
CSS 的解析过程和 HTML 的解析过程类似,同样是 字节 → 字符 → 符号 → 节点 → 对象模型,如下图:

CSS 解析流程

经过以上过程的解析,CSS将会被解析成下图的样子:

CSSOM

为什么 CSSOM 也会有树状结构呢?当 CSSOM 生成完毕时,浏览器将会从上层的元素(比如body)开始应用 CSS。比如如果在 body 上设置了 font-size:8px,那么所有的 body 节点下所有子元素的字体大小均会变为 8px。由此开始,浏览器将会根据 CSSOM 从上到下渲染每一层的元素,这就是我们说的 “层叠样式表(Cascading Style Sheets)”

上图的 CSSOM 将会这样渲染:所有 body 下面的 span 标签将会有红色的字体,并且字体为
16px(从 body 继承)。然而,如果 span 是 p 的子元素,它应该会被隐藏(display: none)。

需要注意的是,上图的这棵树并不完整。每一个浏览器都会有一个 “浏览器自定义样式(user agent styles)”,也就是说如果我们不提供自定义样式的话,我们的页面将会按照浏览器提供的样式来渲染。

Recalculate Style 截图
Recalculate Style 截图(译者)

在 Chrome 的开发者工具中,我们可以找到一个名为 “Recalculate Style” 的事件。和 DOM 不同的是,它并没有一个叫 “Parse CSS” 的事件。CSS 解析,CSSOM 构建,递归计算 “计算属性(Computed Style)” 的所有的时间消耗全部在一个 “Recalculate Style” 事件中。

我们这点 CSS 的计算消耗了大约0.6ms(译者 0.7ms),不多,但毕竟还是需要消耗时间。但是你可能会发现,那受影响的8个元素(Elements Affected)是哪来的?不是说 DOM 和 CSSOM 是分离的吗?那下篇文章,我们将会介绍一颗将 DOM 和 CSSOM 关联到一起的树:渲染树。

译者注:

我们可以在 Parse HTML 中发现一个事件,用于请求 style.css。如下图


触发 “Send Request” 事件

注意此时请求还未发出,只是触发了一个事件。

原文的 Chrome 开发者工具版本较老,译者更新了部分图片,请自行参照最新版本的 Chrome 开发者工具文档 来进行操作。

原文链接:
https://developers.google.com/web/fundamentals/performance/critical-rendering-path/constructing-the-object-model

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,636评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,890评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,680评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,766评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,665评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,045评论 1 276
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,515评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,182评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,334评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,274评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,319评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,002评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,599评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,675评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,917评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,309评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,885评论 2 341

推荐阅读更多精彩内容

  • 大家都知道万维网的应用层使用了HTTP协议,并且用浏览器作为入口访问网络上的资源。用户在使用浏览器访问一个网站时需...
    SylvanasSun阅读 2,129评论 1 12
  • 问答题47 /72 常见浏览器兼容性问题与解决方案? 参考答案 (1)浏览器兼容问题一:不同浏览器的标签默认的外补...
    _Yfling阅读 13,721评论 1 92
  • 浏览器指的是Chrome系浏览器【Firefox大同小异,IE未知】以下提到的“节点”、“标签”和“元素”不做区分...
    Yieiy阅读 4,089评论 4 26
  • 累 二个孩子,真心累。当妈累,当爸累,所有的人都会累。你会面临很多问题。衣食住行,最重要的是陪伴。二个孩子还是会有...
    长弓心悦阅读 458评论 2 3
  • 我是一个非常不合格的组长,并没有阅读每个小组成员的每一篇文章!也没有起到一个好的督促作用。群里的督促发文,也更...
    柚米阅读 426评论 0 0