我知道VDOM只是真实DOM的表示,当某些节点发生更改时,它会与以前的VDOM有所不同。但是毕竟是真正的DOM,它将获取此输出并重新绘制并重新绘制屏幕,据说这很愚蠢,因为它不知道如何仅更改屏幕的一部分。我想知道浏览器或真正的DOM与众不同之处,现在我正在处理VDOM和一些常规内容。
答案 0 :(得分:2)
我想知道浏览器或真正的DOM与现在正在处理VDOM和一些常规内容有何区别。
当您实际调用DOM对象(Node
,Element
等)上的方法时,浏览器知道您正在做一些DOM事情。
DOM对象与您在代码中可能拥有的任何虚拟DOM完全独立,并且完全不知道。虚拟DOM实际上只是常规JavaScript对象的图形。这些对象没有什么特别的。我们以为它们应该代表DOM文档的一部分这一事实已为我们所知,但浏览器却不在乎。只是对象。
区分两个虚拟DOM实例意味着找到两个对象图中的差异。同样,从浏览器(或更广泛地说,是JavaScript执行环境)的角度来看,这与扩散其他两个JavaScript对象没有什么不同。
产生的差异需要转换为DOM API调用。 那是浏览器意识到您正在对DOM做某事的时候,这可能需要在屏幕上重排和重绘文档。
虚拟DOM到底比真实DOM快多少?
虚拟DOM本身没有任何速度。它不比DOM慢,也不快。它只是一个对象。 修改虚拟DOM对象图应该比修改DOM对象快,因为它不会立即自动触发重排和重画,因此您可以将虚拟DOM用作“临时”区域”,您可以在其中准备DOM的将来状态。然后,当您准备就绪时,使用差异查找自上次以来对虚拟DOM进行的整批更改所需的最少数量的更改需要应用于DOM。
(PS:如果您正在寻找原始速度,那么当前框架(React,Vue.js等)中使用的虚拟DOM并不是最快的选择。如果您感到好奇,请参阅Rich Harris' talk at YGLF, "Rethinking reactivity" )