Vue2 和 Vue3 的 Diff 算法的区别

虚拟 DOM 表示形式

  • Vue2 使用全树的虚拟 DOM 表示形式
  • Vue3 使用基于块树的虚拟 DOM 表示形式,通过 vnode.dynamicChildren 来存储动态节点

diffProps 方式

  • Vue2 在新旧两个虚拟节点的 props 发生变化时,会通过 patchProps 函数重新设置新节点的 props
  • Vue3 采用对比新旧两个虚拟节点 props 的方式,对变化的 props 执行 hostPatchProp 函数即可

diff 过程

  • Vue2 是全量对比,逐层比对虚拟节点树
  • Vue3 是静态提升,源码缓存了静态节点的位置信息,在 diff 的时候只对动态节点进行比较,减少了虚拟节点的遍历次数

diff 策略

  • Vue2 在新旧两个节点都是组件的情况下,会判断他们是否是同一个组件,如果不是则销毁重建
  • Vue3 会对比组件的 props,如果 props 相同则会保留组件实例,并触发组件的更新流程

key 的使用

  • Vue2 在 diff 算法中只是借助 key 值来判断是否可以最大程度的复用和更新现有节点
  • Vue3 会对使用 key 值得节点做源码缓存,并追踪动态节点,使得可以在集中某个区间的节点变化时只对该区间的节点应用最小化操作

总结:

Vue3 在 diff 算法方面相比 Vue2 有了很大的优化,通过静态提升、源码缓存和基于块树的虚拟 DOM 表示等技术,减少了虚拟节点的遍历次数,降低了组件更新的开销,从而提高了性能。同时也为未来的更多优化做好了准备。

相关推荐
kill5221 小时前
useRef
前端·javascript·react.js
蓝悦无人机1 小时前
从“摸形状“到“点到线面的距离“——聊聊 SLAM 前端(激光雷达篇)
前端·loam·数据关联·激光slam·点云特征提取·点到线面距离·icp/ndt
米多科技1 小时前
我做了一个 3D 虚拟世界基底,在上面再搭 3D 世界或元宇宙,事半功倍
javascript·人工智能·github
flash俊杰1 小时前
工程约束怎么不拖后腿
前端
霍营_托尼2 小时前
纯前端播 40GB 本地视频?我把浏览器改造成了「磁盘流式」播放器
前端·javascript·音视频开发
溪语流沙2 小时前
【Web全栈进阶】FastAPI工程化:APIRouter拆分 + 配置 + 依赖注入
java·前端·fastapi
Shirley~~2 小时前
Three.js的基础概念
前端·3d
deli0072 小时前
黏菌没有大脑,3000 个 Physarum 粒子跑 12973 步自己铺出了迷宫最短路
前端
凌云若寒2 小时前
BarTender提示#807错误:无法在拥有其他许可证的Licensing Service上激活节点锁定的 Professional 版许可证 的解决办法
运维·服务器·前端·学习·软件需求
嘟嘟同学和妮妮同学2 小时前
用原生 JS 做了一个中国历史帝皇梳理的可视化站(7 朝 77 帝 + Leaflet 地图)
前端