【发布时间】:2015-03-27 15:46:13
【问题描述】:
我现在正在研究 virtual-dom,我想知道 virtual-dom 是否真的比手动操作视图更快。现在我明白了 virtual-dom 和 diff 算法可以防止不必要的重新流动,例如当我们想要改变这个时:
<div>
<div>a</div>
<div>b</div>
</div>
到这个:
<div>
<div>c</div>
<div>d</div>
</div>
因此,当我们使用直接操作时,我们可能会有 4 次重排:2 次用于删除每个 div 并用于创建新的。我们还将对 dom 进行更多操作,因为我们应该创建新元素(也许从 dom 中删除 -> 创建新 dom -> 设置属性 -> 安装到文档比直接编辑 dom 属性更快?)。另一方面,我们有快速漂亮的差异算法,它生成 2 个补丁来替换我们的 div 的内容,可能我们将有 1 个重流。 (如果我在写re-flows的时候写错了,请告诉我)
在这种情况下 virtual-dom 可能规则,但是当我们有 2 棵完全不同的树时,我们不会从 diff 中获得很多好处,所以我们可能会防止一些回流,但是生成新树的时间和运行差异和补丁要长得多。这是我的第二个问题。例如,在 https://github.com/Matt-Esch/virtual-dom 库的动机中,他们说:“因此,当您的应用程序状态发生变化时,无需更新 DOM,您只需创建一个虚拟树或 VTree”。每当我需要更改视图上的某些内容时,构建一个新的虚拟树真的很好吗?
当然,我会尝试做一些测试来评估性能,但我想知道更多的技术方面和为什么 virtual-dom 真的更好,或者,也许不是?
【问题讨论】:
-
请谨慎选择您的标签。这与git 完全无关。
-
谁说手动 DOM 操作需要替换 div?如果我关心速度,我只会为两个文本节点分配新值。
-
Bergi,这只是一个例子,我们可以拥有包含各种 DOM 项的非常深的树,我们应该能够替换 DOM 树的每个部分。我们还可以为每个 DOM 元素附加很多样式和类。
标签: javascript html dom dom-manipulation