DOM diff

270 阅读1分钟

什么是虚拟DOM

一个能代表DOM树的对象,通常含有标签名,标签上的属性、事件监听和子元素,以及其他属性

虚拟DOM的优点

1. 能减少不必要的DOM操作

例如添加你需要添加1000个DOM元素,你可能会一个接一个的添加。而虚拟DOM就可以将所有添加操作合并为一次。

2. 减少操作的范围

虚拟DOM可以借助DOM diff把多余的操作省掉,比如你添加1000个节点,其实只有10个新增的。

3. 跨平台

虚拟DOM本质就是js对象,它还可以使用在其他的平台中:小程序、ios应用、安装应用。

虚拟DOM的缺点

需要额外的创建函数,如createElement或h,但可以通过JSX来简化成XML写法。同时也导致了严重依赖打包工具的问题,React使用babel解析,Vue使用Vue-loader解析。

DOM diff

DOM diff就是一个对比虚拟DOM的操作。

Tree diff

  • 将新旧的两颗树逐层对比,找出那些需要更新的节点

  • 如果节点是组件就看Component diff 如果是节点是标签就看Element diff

Component diff

  • 查看组件类型,类型不同直接替换

  • 类型相同只更新相应的属性

  • 然后深入组件做Tree diff(递归)

Element diff

  • 看标签名,标签名不同直接替换,相同则更新属性

  • 然后进入后代标签做Tree diff(递归)

总而言之DOM diff就是对比出两颗树不同的地方做修改