答疑:浏览器为什么不优化 DOM 操作的性能

知乎上有人提问:

现在前端这么繁荣,为什么大家在扎堆在 JS 上做文章,搞什么 TypeScript,Deno 什么的。DOM 操作不是开销最大的么,为什么大家不把精力放到优化浏览器交互而是 JS 技术的革新上?

浏览器一直在优化 DOM 的性能啊。

框架的目标是提高开发效率,而非运行效率。况且 DOM 的性能(或者延伸到浏览器的性能)这个确实不是由社区驱动的,虽然主流几大浏览器都是开源的,但这些浏览器的开发者几乎都是商业公司。

相比 JS 而言,开发者们对于浏览器布局和渲染的关注更少。毕竟大家对 JavaScript 的关注比较多,但是对于 CSS(3) 的性能关注就比较少了。

例如 V8 的新 JS 编译器 Turbofan 以及新的解释器 Ignition 很多开发者都听说过,甚至 QuickJS,Hermes 的发布都引起了开发者们的强烈关注。但是对于 DOM 操作或者 CSS 引擎则很少有开发者关注。

其实浏览器一直在努力。如果你不信,你可以下载一个 2 年前的 Chrome 来访问一下当前页面 。


2005 年 HTML 规范大概 100 页。

2020 年 HTML 规范大概 800 页。

DOM 重绘

贴一张动图来看看 Chrome 对 DOM 重绘的改进。

当 Chrome 准备在屏幕上绘制像素时,它必须首先确定页面上的哪些元素需要重绘,哪些可以从上一帧的缓存中复制。在具有频繁 DOM 更改的动态页面上,会导致严重的性能问题。

Chrome 怎么改进的呢?Chrome 为每个元素生成绘制命令,通过跟踪分析这些绘制命令,以此来识别视觉上不重叠的子集。如果未修改其中一个子集,则可以直接从缓存中复制整个块,而无需进行任何其他工作。这就显著了提升了 DOM 改变后的重绘性能。

LayoutNG

我们都知道 V8 发布新的 Turbofan 编译器之后,很多原本不能优化的 js 语句也可以优化了,更重要的是 es6 发布后可能被认为是 js 非常重大的一次变革,与其在原引擎上修修补补,不如直接换新的。

同理 CSS 也随着 web 的发展而快速变更,于是 Chrome 也开发了新的布局引擎 LayoutNG。

推荐看一下 LayoutNG 的设计文档(英文)。

Composite(合成)算法也更新为了增量 CompositeAfterPaint 和 BlinkGenPropertyTrees。

结语

其实浏览器一直都在优化 DOM 的操作性能。原文链接较多,但是公众号无法链接外部文章,所以你可以点击左下角的阅读原文来阅读。

相关推荐

猜你喜欢

转载自blog.csdn.net/vCa54Lu0KV27w8ZZBd/article/details/105547938