【译】shadow DOM 真的能提高样式性能吗

罗秦

共 6497字,需浏览 13分钟

 · 2021-10-25

原文链接Does shadow DOM improve style performance[1],翻译在2021年10月9日。

我的一个简短的回答是:能提高一点。虽然它可能还不足以在一般的 Web APP 中产生很大的差异,但我们值得去理解为什么它能提高样式性能。

首先,让我们回顾一下浏览器的渲染流程[2](rendering pipeline),以及为什么我们可以推测 shadow DOM 能提高样式性能。我们知道,浏览器渲染过程的两个基本部分是样式计算(style calculation)和布局计算(layout calculation),或者简称为“样式”和“布局”。前者的工作是:确定哪些 DOM 节点具有哪些样式(基于 CSS),后者则是:确定这些 DOM 节点实际放置在页面上的位置(使用上一步中计算出的样式)。

83b3315771f5fc7dbf00d138b422a77e.webpChrome DevTools 中的性能跟踪,显示了基本的 JavaScript → 样式(Style) → 布局(Layout) → 绘制(Paint)流程

浏览器很复杂,但一般来说,页面上的 DOM 节点和 CSS 规则越多,运行样式和布局步骤所需要的时间就越长。提高此过程性能的一个方法是将工作分解为更小的块,即封装(encapsulation)——这是 shadow DOM 能提高样式性能的原因。

对于布局(Layout)的封装,我们有 CSS Containment[3]。这个在其他文章[4]里已经讲过了,这里就不赘述了。可以这么说,我认为有足够的证据表明 CSS containement可以提高性能,所以如果你还没有尝试将 contains: content 置放在 UI 里面以查看它是否可以提高布局性能,那么你绝对应该去试一试。

至于样式(Style)的封装,我们有一些新奇玩意儿:shadow DOM[5]。就像 CSS Containment能提高布局性能一样,shadow DOM理论上 应该也能提高样式性能。让我们考虑一下原因:

什么是样式计算

如前文所述,样式计算不同于布局计算。布局计算与页面的几何布局有关,而样式计算则更明确地与 CSS 相关。这是采用如下规则的过程:

div > button {
color: blue;
}

还有一个 DOM 树:

<div>
<button>button>
div>

...例子如上,我们可以确定