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 表示等技术,减少了虚拟节点的遍历次数,降低了组件更新的开销,从而提高了性能。同时也为未来的更多优化做好了准备。

相关推荐
子兮曰3 天前
jev-ultrafast 深度解析:7 秒订机票的浏览器 Agent 是如何炼成的
前端·后端·agent
子兮曰3 天前
Jev 爆发一周:7 秒 Agent 背后的 System One 生态与三场争议
前端·后端·ai编程
前端小万3 天前
写公众号赚了 3000 块后,我做了一款叫 "一键成稿" 的软件
前端·微信小程序
爱勇宝3 天前
ZCode 开源 24 小时:一份没有历史的账本,回答不了"有没有偷代码"
前端·后端·chatglm (智谱)
A黄俊辉A3 天前
uniapp webview中实现 app和内嵌的H5双向通信
vue.js·json
三十而立洋3 天前
Cookie 详解:从产生到安全,一次讲透
前端·javascript
卡布鲁3 天前
把一个 Vite + Vue3 应用塞进 qiankun (React + Umi3) 主站:十个坑的复盘
前端·javascript·react.js
李少兄3 天前
JavaScript 隐式全局变量解析
javascript
honkun63 天前
vue 表格组件 vxe-table 配置 ajax 请求自动加载数据与表单查询
vue.js·vxe-table
kybs19913 天前
全球灾害数据分析可视化 毕业设计-附源码66794
vue.js·spring boot·mysql·安全·django·c#·asp.net