浅谈Vue2和Vue3的虚拟dom和diff算法

288 阅读1分钟

Vue 2 和 Vue 3 都使用了虚拟 DOM 和 diff 算法来提升性能和开发体验,但在实现细节和性能优化上有所不同。以下是对 Vue 2 和 Vue 3 中虚拟 DOM 和 diff 算法的详细比较:

一、Vue 2 中的虚拟 DOM 和 diff 算法

1. 虚拟 DOM

  • 基于 Object.defineProperty 的响应式系统:Vue 2 使用 Object.defineProperty 来实现数据的响应式,这种方式有一些局限性,比如无法检测数组索引对象属性的添加或删除
  • VNode:Vue 2 使用 VNode(虚拟节点)来表示虚拟 DOM 树。VNode 是一个普通的 JavaScript 对象,包含了节点的标签、属性、子节点等信息。

2. Diff 算法

  • 同层比较:Vue 2 的 diff 算法只比较同一层的节点,不跨层比较。
  • 双端比较:Vue 2 的 diff 算法使用了双端比较策略,从两端同时进行比较,尽量减少节点的移动和更新。
  • Key 属性:在列表渲染中,使用 key 属性可以帮助 diff 算法更高效地比较和更新节点。

二、Vue 3 中的虚拟 DOM 和 diff 算法

1. 虚拟 DOM

  • 基于 Proxy 的响应式系统:Vue 3 使用 Proxy 来实现数据的响应式,解决了 Vue 2 中的一些局限性(如无法检测数组索引和对象属性的添加或删除)。
  • 优化的 VNode:Vue 3 对 VNode 进行了优化,使其更加轻量和高效。

2. Diff 算法

2.1 静态提升
2.1.1 静态节点提升

image.png

image.png

2.1.2 静态属性的提升

image.png

2.2 预字符串化

image.png

image.png

image.png

2.3 缓存事件处理函数

image.png

2.4 Block Tree

image.png

image.png

image.png

2.5 Patch Falg

image.png

image.png