react-深入浅出 React 虚拟 DOM

54 阅读2分钟

前言

在现代前端开发中,直接操作 DOM 就像是“昂贵的体力活”。React 引入了虚拟 DOM (Virtual DOM) ,在 JavaScript 与浏览器之间搭建了一座“缓冲桥梁”。本文将带你拆解虚拟 DOM 的底层逻辑及其优劣权衡。

一、 什么是虚拟 DOM?

虚拟 DOM 是用普通的 JavaScript 对象来描述真实 DOM 结构的内存映射

1. 产生背景:昂贵的 DOM 操作

由于真实 DOM 是树形结构且属性极其庞大,每次修改元素都可能触发浏览器的重绘(Repaint)和回流(Reflow) 。操作次数越多,页面响应就越卡顿。

2. 解决方案

虚拟 DOM 位于 JavaScript 和原生 HTML 之间。它不直接操作屏幕,而是先在内存中进行“演习”,计算出最优的更新方案,最后再统一执行。


二、 虚拟 DOM 的工作原理

虚拟 DOM 的运行可以分为三个核心步骤:

  1. 模拟与渲染:用 JavaScript 对象模拟出 DOM 树结构。
  2. Diff 算法对比:当状态改变时,生成新的虚拟 DOM 树,并与旧树进行对比,计算出最小差异对象(Patches)。
  3. 补丁应用:将计算出的差异对象通过渲染器(Renderer)一次性应用到真实 DOM 上。

三、 深度对比:真实 DOM vs 虚拟 DOM

我们可以通过一个具体的场景来理解两者的差异:连续更新 10 个 DOM 节点。

特性真实 DOM虚拟 DOM (React)
执行机制收到更新请求立即执行。如果连续更新 10 次,会触发 10 次完整的渲染流程。不立即操作 DOM,而是将 10 次更新合并到本地一个 JS 对象中。
渲染效率频繁操作会导致严重的重绘与回流。差异性增删改。一次性将最终结果渲染到屏幕,避免冗余计算。
更新方式对 DOM 进行完全的、机械的更新。针对性的、按需的 Patch 更新。

四、 优缺点全解析

1. 虚拟 DOM

  • 优点

    • 性能优化:有效减少真实 DOM 的更新频率,极大降低重绘与回流。
    • 内存友好:操作内存中的 JS 对象远比操作 DOM 属性轻量。
    • 跨平台(额外补充) :由于虚拟 DOM 是纯 JS 对象,它不仅能渲染到浏览器(ReactDOM),还能渲染到移动端(React Native)。
  • 缺点

    • 首屏压力:首次渲染大量节点时,由于多了一层虚拟 DOM 的计算逻辑,速度会比直接操作原生 DOM 稍慢。

2. 真实 DOM

  • 优点:使用方便,对于极其简单的交互,直接更新 HTML 的路径最短。
  • 缺点:效率低、内存消耗大,在复杂交互下容易引起性能瓶颈。