vue和react虚拟DOM和diff算法的区别

174 阅读2分钟

React 和 Vue 都使用了虚拟 DOM 来提高前端性能,并采用 diff 算法 来高效更新 DOM。虽然两者在实现细节上有所不同,但核心思想和目标相似:在更新 DOM 时,只修改必要的部分,避免全量操作,从而提升性能

1. 虚拟 DOM 的概念

虚拟 DOM 是一个轻量级的 JavaScript 对象,用于描述 DOM 结构。它是实际 DOM 的抽象表示,不直接操作真实 DOM。

工作流程

  • 使用 JavaScript 构建虚拟 DOM。
  • 比较新旧虚拟 DOM(Diff 算法)。
  • 将变化部分更新到真实 DOM。

2. Diff 算法的核心思想**

Diff 算法的目的是高效比较新旧虚拟 DOM 树之间的差异。其核心优化原则包括:

  • 同层比较:只比较同一层的节点,不跨层比较(树的分层思想)。
  • 标签对比:不同类型的节点(例如 <div><span>)直接替换,无需深度比较。
  • 按需更新:尽量复用 DOM 节点,仅更新有变化的部分(key 用于标识节点,定位变化,提升列表对比性能)。

vue和react区别

1. 虚拟DOM

React 的虚拟 DOM

  • 实现方式:React 使用自己设计的虚拟 DOM 数据结构,每次渲染都会生成一棵新的虚拟 DOM 树,并与旧的虚拟 DOM 树进行 Diff 比较。
  • 目标:React 更注重灵活性和通用性,适用于更广泛的场景(包括 React Native)。
  • 全量 Diff:每次更新会生成一整棵新的虚拟 DOM 树,与旧树进行对比。

Vue 的虚拟 DOM

  • 实现方式:Vue 使用 snabbdom 库实现虚拟 DOM,通过模板编译生成优化后的虚拟 DOM。
  • 目标:Vue 的虚拟 DOM 更加偏向于模板渲染场景,结合静态优化来提升性能。
  • 局部更新:Vue 在模板编译阶段对静态节点进行标记,更新时仅处理动态节点。

2. diff算法

React 的diff算法

  • 全量对比
  1. 每次状态或属性更新,React 会生成一棵新的虚拟 DOM 树。
  2. 新旧虚拟 DOM 树通过 Diff 算法进行逐层对比。

Vue 的diff算法

  • 双端比较(列表优化) :Vue 的 Diff 算法在处理列表时使用双端比较,同时从新旧列表的两端向中间比较,效率更高。
  • 静态节点优化:Vue 在编译模板时,会对静态节点进行标记,更新时跳过这些节点的比较,减少不必要的操作。
  • 基于 snabbdom:Vue 的 Diff 算法实现于 snabbdom 库,更轻量化,但专注于模板渲染场景。

React为什么不用双端diff算法

因为在同一层级的fiber节点没有反向的指针,sibling是单向,只能从左到右遍历,所以双端diff实现不了