发布于 2026-01-06 0 阅读
0

是否需要 Virtual-DOM?一个简化的示例

是否需要 Virtual-DOM?一个简化的示例

在开始之前,让我们看看浏览器 DOM 是否比在 JavaScript 引擎上执行的所有 JavaScript 代码慢。

与其使用大量的虚拟 DOM 代码,不如我们来看一段非常简短的 JavaScript 代码片段,其中使用一个数组在一个循环中收集递增的数字。循环结束后,它将该数字数组添加到 DOM 中。

在第二种情况下,让我们在每次循环递增时更新循环内的 DOM。

这是 jsperf 的截图,其中编写了一个用于比较的小型测试用例。结果如下所示:

替代文字

结果清楚地表明,每次递增都更新 DOM比执行 javascript 代码片段并仅更新一次 DOM慢 100% 。

我们来看看为什么速度慢了100%?

回顾基础知识,JavaScript 引擎会先执行所有代码,然后 DOM 和 CSSOM 才能准备就绪。只有在此之后,屏幕上的第一个像素才会被绘制出来。

DOM 之于浏览器引擎,JavaScript 之于 JavaScript 引擎。每当 DOM 更新时,这两个引擎都需要通信,这就导致了延迟。

由于在首次绘制之前会执行一些工作流程,每次通过 JavaScript 代码更新 DOM 时domElement.innerHTML = "someValue",CSSOM 也需要完成。这会进一步增加延迟。然后,下一行 JavaScript 代码又会被执行。除非使用 defer 或 async 标签,否则这需要在 JavaScript 引擎和浏览器引擎之间切换执行。

虚拟 DOM 的帮助

虚拟 DOM 拥有一个由 JavaScript 引擎自身存储和执行的树状结构,这使得运行速度大大提升。

  • 两台发动机通信的次数减少。
  • 由于样式不需要在虚拟 DOM 中应用,因此无需完成 CSSOM。
  • 每次虚拟 DOM 更新时,都不会发生执行切换,因为它仅由 Javascript 引擎运行。
  • 虽然在不需要的时候不更新虚拟 DOM 是一种好做法,但这样做会造成相当大的性能损失,从而影响应用程序的性能。
  • 这意味着流畅的用户交互、更快的首次渲染时间,从而带来更好的搜索引擎排名。
  • 我们甚至还没讨论如何高效地编写虚拟 DOM。然而,即使只考虑少数几种情况,它也是有益的。

就目前来看,虚拟 DOM 的优势显而易见。除非浏览器能找到解决 DOM 更新延迟问题的策略,否则这种情况将持续下去。

如果您能对以上文章提出一些评论,将对我进一步提升写作水平大有裨益。谢谢!

文章来源:https://dev.to/svaani/is-virtual-dom-needed-1lo7