Vue3虚拟 DOM

Vue3 用虚拟 DOM 描述界面结构,并通过差异比较把状态变化映射到最小化的真实 DOM 更新。

#tech / dev / frame #resource / vue3 #type / concept #status / growing

[!info] related notes

Vue3虚拟 DOM

虚拟 DOM 是 Vue3 用来描述界面结构的一层中间表示。它不是为了“完全不操作 DOM”,而是为了让框架能在状态变化后更有组织地比较新旧界面,并把必要差异更新到真实 DOM。

一句话定义

虚拟 DOM 是真实 DOM 的 JavaScript 结构化描述,用来承接渲染计算和差异更新。

它解决什么问题

  • 让框架先在内存里计算新旧界面差异
  • 避免开发者手工管理大量 DOM 细节
  • 为组件化、条件渲染、列表渲染提供统一更新模型

Vue3 更新时它处在什么位置

  1. 响应式状态变化
  2. 组件重新执行渲染逻辑
  3. 生成新的虚拟 DOM
  4. 和旧虚拟 DOM 比较差异
  5. 把差异应用到真实 DOM

和 React 的共同点与区别

共同点是:

  • 都有虚拟 DOM 这层中间表示
  • 都不会把 rerender 直接等同于真实 DOM 全量重建

更值得注意的区别是:

  • Vue3 还会在编译阶段做更多静态分析和动态节点标记
  • 所以它的更新效率不只是运行时 diff,还受编译优化影响

这条主线可和 vue-render-and-update-flow 一起理解。

最小理解方式

一个节点在虚拟 DOM 里可以理解成“标签名 + 属性 + 子节点”的对象化表示,而不是浏览器里的真实节点本身。

为什么 key 会影响更新结果

列表更新时,Vue 需要判断“哪个节点还是原来的那个节点”。key 提供的就是节点身份信息。

如果 key 不稳定:

  • 节点可能被错误复用
  • 局部状态可能错位
  • 列表更新行为会更难预测

这部分可继续看 vue-conditional-and-list-rendering

Vue3 相比旧思路更值得注意的点

  • Vue3 仍然使用虚拟 DOM 作为通用更新模型
  • 同时也在编译阶段做了更多静态分析和动态节点标记
  • 所以性能不只来自 diff,本质是“编译优化 + 运行时更新模型”共同作用

常见误解

虚拟 DOM 不等于完全更快

它的价值是提供统一、可预测的更新模型,而不是任何场景都绝对更快。

虚拟 DOM 不等于每次整树重建

状态变化后会重新计算渲染结果,但真实 DOM 更新通常只落在差异部分。

理解虚拟 DOM 不能脱离更新流程

单独背“diff 算法”意义不大,更重要的是把它放回 vue-render-and-update-flow 的主线里看。

最短记忆方式

虚拟 DOM 是 Vue 在“状态变化”和“真实 DOM 更新”之间的中间层。

创建于 2025/1/1 更新于 2026/5/27