vlambda博客
学习文章列表

虚拟DOM为什么比直接操作DOM快

先说结论:

虚拟dom为什么性能会比直接操作dom快呢?

因为虚拟dom在更新视图的时候会通过diff算法对比更新前后的数据变化,只更新产生变化的dom。

现在来对比一下原生和虚拟dom两种方式的区别

采用原生innerHTML属性创建页面

通过innerHtml创建页面,需要写html字符串。将html字符串赋值给innerHTML属性。在渲染页面过程中,需要先把字符串解析成dom树,这属于dom层面的计算,其性能远比JavaScript的计算差。


const html = '<div>.......</div>'div.innerHtml = html

innerHTML创建页面的性能消耗:HTML字符拼接的计算量 + innerHTML的DOM计算量。


采用虚拟DOM方式创建页面

通过虚拟DOM方式创建页面

第一步需要创建JavaScript对象,这个对象用来描述真实DOM

第二步需要将虚拟DOM树递归遍历并创建真实DOM。


通过虚拟DOM方式创建页面的性能消耗:创建JavaScript对象的计算量 + 创建真实DOM的计算量。


对比JavaScript层面与DOM层面计算两个差距不大。


innerHTML与虚拟DOM方式更新页面对比

通过innerHTML属性更新页面时,即使只更改了一个字母,也需要重新设置inner HTML的值。这意味着,需要销毁所有DOM元素再重新渲染html字符串的所有内容。


而通过虚拟DOM方式更新页面时,需要重新创建JavaScript对象(虚拟DOM),再通过diff算法比较更新前后的差异。只更新产生变化的DOM元素。


虽然更新页面时虚拟DOM方式需要增加diff算法的性能消耗,但是这也属于JavaScript层面的计算,因此不会产生数量级上的差异。而innerHTML则需要全部更新。


无论页面多复杂,虚拟DOM都只会更新需要更新的部分,而对innerHTML来说,页面越复杂消耗的性能越大。


因此,虚拟DOM、innerHTML和原生JavaScript更新DOM元素的性能消耗比较如下。


  • 原生DOM消耗的性能最少,但是需要手动创建、删除、修改大量DOM元素。可维护性也很差。


  • innerHTML通过拼接HTML方式修改dom元素,其可维护性较高,但是事件绑定仍然需要原生JavaScript处理。在模板很大并且更新很少时,这种方式消耗性能最多。


  • 虚拟DOM方式采用声明式写法,维护起来最方便,性能虽然比不上原生JavaScript方式,但是在可维护性和心智负担小的前提下比innerHTML方式要强很多。