虚拟 DOM 是用 JavaScript 对象模拟真实 DOM 的轻量级抽象,通过创建副本、差异对比(diff)和批量最小化更新三步,只同步实际变化部分,避免频繁重排重绘,提升中大型动态界面的更新效率与开发体验。
虚拟 DOM 是用 JavaScr 直接频繁操作真实 DOM 非常慢:每次增删改都会触发浏览器重排(reflow)和重绘(repaint),还可能打断渲染流水线。尤其在 React、Vue 这类框架中,状态一变就可能引发整块 UI 重新渲染——如果每次都暴力替换整个 DOM 片段,性能很快崩掉。 虚拟 DOM 的核心思路是:先在内存里算出“应该变成什么样”,再集中比对(diff),只把真正有变化的部分同步到真实 DOM 上。 1. 创建轻量副本 2. 差异对比(diff) 3. 批量最小化更新 假设你有一个 100 项的列表,用户只修改了第 5 项的文本: 它适合中大型动态界面,但也有成本:构建虚拟 DOM 树、diff 过程本身要耗 CPU。对静态内容或超简单交互(比如单个按钮点击变色),直接操作 DOM 反而更快。它的优势在于“可预测的更新控制”和“开发体验与运行效率的平衡”,而不是绝对的性能碾压。 基本上就这些。它不是让 JS 更快,而是让 DOM 更新变得更节制、更精准。
ipt 对象模拟真实 DOM 结构的一种轻量级抽象。它本身不是浏览器里的真实节点,而是一层数据描述——比如一个对象表示一个 ,包含标签名、属性、子节点等信息。它不直接操作页面,而是作为“中间层”,帮我们更聪明地更新真实 DOM。
为什么需要虚拟 DOM?
它怎么提升效率?靠三步关键操作
渲染时,框架把组件生成一棵虚拟 DOM 树(纯 JS 对象嵌套)。这一步极快,没有布局计算、不触发渲染,只是构造对象。
新旧两棵虚拟 DOM 树进行逐层比较(通常采用深度优先、同层对比策略)。框架会跳过明显不变的节点(比如 key 相同且类型一致),只聚焦可能变化的分支。
diff 完成后,得到一个“补丁列表”(例如:某个 div 的 class 改了、某个 li 被删了、某个文本节点需要替换)。框架把这些操作聚合成一次或少数几次真实 DOM 修改,避免重复 layout 和 paint。一个小例子帮你理解
的文本变了 → 最终只执行一次 textContent 更新,其余 99 个节点完全复用。注意:虚拟 DOM 不是银弹