解释1:用js模拟一颗DOM树,放在浏览器的内存中,当须要变动时,虚拟DOM进行diff算法进行新旧虚拟DOM的对比,将变动放入到队列中。反应到实际的DOM上,减小DOM的操做。 html
解释2:虚拟DOM将DOM转换为一颗js树。diff算法逐级的进行比较、删除、新增操做。可是若是存在多个相同的元素可能比浪费性能,因此React和Vue引用key值进行区分。 web
所谓DOM渲染,即浏览器将HTML字符串转换成网页视图并渲染视图的过程。算法
为了理解这一过程的复杂性,咱们能够对HTML解析器的处理作一个特写:在HTML解析器中,有两个程序交替执行:分词程序和解析程序;分词程序负责将HTML字符串划分红合法的DOM标签字符串,而后将它们交给用于处理的解析器,解析器将它们添加到正在构建的DOM树中;当分词器解析全部字符串时,将构建DOM树。 浏览器
您能够理解为何DOM呈现如此缓慢:这个过程真的太复杂了。在web页面交互中添加和删除DOM将大大下降视图呈现和交互的效率。服务器
框架的虚拟 DOM 须要适配任何上层 API 可能产生的操做,它的一些 DOM 操做的实现必须是普适的,因此它的性能并非最优的;可是比起粗暴的 DOM 操做性能要好不少,所以框架的虚拟 DOM 至少能够保证在你不须要手动优化的状况下,依然能够提供还不错的性能,即保证性能的下限;weex
例如比较 innerHTML vs. Virtual DOM 的重绘性能消耗:框架
Virtual DOM render + diff 显然比渲染 html 字符串要慢,可是!它依然是纯 js 层面的计算,比起后面的 DOM 操做来讲,依然便宜了太多。布局
能够看到,innerHTML 的总计算量无论是 js 计算仍是 DOM 操做都是和整个界面的大小相关,但 Virtual DOM 的计算量里面,只有 js 计算和界面大小相关,DOM 操做是和数据的变更量相关的。性能
前面说了,和 DOM 操做比起来,js 计算是极其便宜的。这才是为何要有 Virtual DOM:它保证了无论你的数据变化多少,每次重绘的性能均可以接受。保证了性能的下线。测试
这里直接看看尤大大在知乎的一个解释。
虚拟 DOM 本质上是 JavaScript 对象,而 DOM 与平台强相关,相比之下虚拟 DOM 能够进行更方便地跨平台操做,例如服务器渲染、weex 开发等等。