原生 DOM 真的慢吗?为什么现代框架都迷恋虚拟 DOM?

Last updated on January 10, 2026 pm

这是Vue从入门到精通系列文章的第12篇,今天我们来说说虚拟DOM吧

根据过去该系列文章的阅读数我发现,大家不太爱看有大段代码的文章,所以这次也就不做这一块的代码剖析,有兴趣的读者可下载源码慢慢品味。

什么是虚拟DOM? 怎么出现的?

虚拟DOM也不是什么高大上的东西,它本质上就是个普通的 JavaScript 对象,它既不是什么高深的黑科技,也不是多此一举的冗余设计,而是前端工程师为了解决“原生 DOM 太矫情”的破局方法。

为啥说原生 DOM 矫情?因为直接操作它的成本实在太高了。为什么这么说呢?因为浏览器里的 DOM 不仅是个节点,还关联着布局、样式等一堆资源,每次修改 DOM 都可能触发“重排”或“重绘”这俩操作就像让餐厅重新装修再上菜,耗时又耗力。

在简单页面里还好,一旦遇到复杂应用——比如一个带大量列表、表单和实时更新的后台系统,光是找DOM节点就得写一堆getElementBy方法,不仅容易出错,维护起来更是让人头大。虚拟 DOM 的出现,就是为了帮我们“隔离开”这种繁琐又昂贵的直接操作。

说白了,就是操作原生DOM太费劲了,我直接找中间商来干这活,而虚拟DOM就是这个中间商。

虚拟 DOM 是怎么“干活”的?

虚拟 DOM 的工作流程可以总结为“画稿→对比→修改”三步,逻辑清晰得像流水线作业,咱们一步步拆解:

1. 初始渲染

当页面首次加载或状态发生变更时,框架(比如 React、Vue)会先根据当前状态,生成一棵完整的虚拟 DOM 树。这棵树就是对应最终要渲染的真实 DOM 的“蓝图”,全是 JS 对象组成的节点,因此操作起来毫无压力

2. Diff 算法找出“最小改动点“

Diff 算法可以说是虚拟 DOM 的“灵魂操作”,也是框架最费心思的地方。简单说,当状态变化后,框架会生成一棵新的虚拟 DOM 树,然后通过 Diff 算法对比新旧两棵树,找出“哪里变了、变了多少”,最终只修改有差异的部分——这就像批改作业,只圈出错题,不用把整本书重写。而 Diff 算法能高效找差异,全靠两个关键策略:

深度优先遍历:就像查户口,从根节点开始,一层层往下遍历每个子节点,确保每个节点都被检查到,不遗漏任何一处变化。这种方式逻辑简单,也能保证遍历的完整性,是 Diff 算法的基础操作。

同层比较策略:这是 Diff 算法的“聪明之处”。它不会跨层级对比节点——比如不会拿父节点和子节点比,只会对比同一层级的节点。为啥要这么做?因为在实际开发中,跨层级移动 DOM 节点的场景极少,这种策略能大幅减少对比次数,提高效率,属于“抓大放小”的优化思路。

3. 补丁更新(Patching

Diff 算法找出差异后,不会立刻修改真实 DOM,而是先收集所有差异,生成“补丁包”,最后一次性把补丁应用到真实 DOM 上。这种批处理操作,能最大限度减少浏览器的重排和重绘。如果没记错的话,Vue中有道面试题目每次都会考到这里–Vue组件多次更新状态值,为什么视图只更新一次?

虚拟 DOM 到底好在哪?

性能优化:核心优势就是通过“最小化 DOM 操作”和“批处理”,降低浏览器的渲染负担。虽然虚拟 DOM 多了 Diff 这一步,但相比频繁、零散的原生 DOM 操作,这种“先计算再修改”的模式,在复杂应用中能显著提升性能

声明式编程:有了虚拟 DOM,我们不用再手动操作 DOM 节点(比如 appendChildremoveChild),只需关注“状态应该是什么样”,框架会自动帮我们把状态映射到 DOM 上。这种模式就像点餐,你只需说“我要一份汉堡”,不用管厨房怎么做、怎么端上来,既提高了开发效率,也让代码更简洁、更容易维护——毕竟谁也不想在几百行代码里找一处 DOM 操作的 Bug。

跨平台性: 因为虚拟 DOM 本质是 JS 对象,不依赖任何浏览器 API,所以它能轻松映射到不同平台。除了浏览器 DOM,它还能映射到原生移动端(比如 React Native 用虚拟 DOM 生成原生组件)、服务器端(比如 Next.js 用虚拟 DOM 做服务端渲染),甚至桌面应用。这种“一次编写、多端运行”的能力,极大降低了跨平台开发的成本,这个绝对是非常Hack的特性了,尤其是对于需要跨平台的开发者来说更是福音。

虚拟 DOM 一定比原生 DOM 快?

答案是:不一定。在简单场景下,比如只修改一个 DOM 节点的文本,原生 DOM 操作可能比虚拟 DOM 更快——因为虚拟 DOM 还要走“生成新树→Diff 对比→补丁更新”的流程,多了一层开销。

虚拟 DOM 的优势不在于“绝对速度”,而在于“大规模应用中的性能与可维护性平衡”。当页面复杂度提升、状态变更频繁时,手动优化原生 DOM 会变得异常困难,而虚拟 DOM 能在保证性能的同时,让代码保持清晰,这才是它的核心价值。

写在最后

虚拟 DOM 看似只是一个对真实DOM复刻的小想法,实则是前端工程化的一次重大突破。但它改变了开发者操作 DOM 的思维模式——从“命令式操作”转向“声明式编程”。开发者从我应该怎么做,变成我需要什么,在编程时能够心安理得的当“懒汉”了。

还是那句老话,代码和人,有一个能跑就行。

【往期精彩】


原生 DOM 真的慢吗?为什么现代框架都迷恋虚拟 DOM?
https://www.jvxiao.cn/posts/virtrual-dom/
Author
jvxiao
Posted on
January 4, 2026
Licensed under