基础
众所周知,Dom操作是非常耗费性能的,以前用JQuery可以自行控制dom操作的时机,而vue和react都是数据驱动视图,该如何有效控制dom操作?
出现了vdom,用js模拟don结构,计算出最小的变更去操作dom。模拟如下:
通过snabbdom学习vdom
snabbdom
是一个简洁强大的vdom的库,Vue参考它实现的vdom和diff。我们用github上snabbdom
的例子来学习vdom:
通过新旧vnode对比,得出最小的更新范围,最后更新dom。
diff算法
diff算法是vdom中最核心、最关键的部分。也能在vue、react、日常使用中体现出来。
时间复杂度为O(n^3), 不可用。
经过前辈的努力将时间复杂度优化到O(n):
patch函数
- key和sel都相等,则不进行比较,优化
- 不相等则删掉重建,优化
patchVnode函数
updateChild
当patchVnode
时,如果新旧node都有Child时,就会进行updateChild:
虚拟DOM的作用
- 兼容性好。因为Vnode本质是JS对象,所以不管Node还是浏览器环境,都可以操作;
- 减少了对Dom的操作。页面中的数据和状态变化,都通过Vnode对比,只需要在比对完之后更新DOM,不需要频繁操作,提高了页面性能;
那么虚拟DOM和真实DOM的区别
- 虚拟DOM不会进行回流和重绘;
- 真实DOM在频繁操作时引发的回流重绘导致性能很低;
- 虚拟DOM频繁修改,然后一次性对比差异并修改真实DOM,最后进行依次回流重绘,减少了真实DOM中多次回流重绘引起的性能损耗;
- 虚拟DOM有效降低大面积的重绘与排版,因为是和真实DOM对比,更新差异部分,所以只渲染局部;