虚拟 DOM 是用轻量 JavaScript 对象树描述真实 DOM 的结构与状态,通过 render→diff→patch 三步实现最小化更新,降低重排重绘开销。
JavaScript 实现虚拟 DOM 的核心,是用轻量的 JavaScript 对象树来描述真实 DOM 的结构和状态,再通过高效的 diff 算法比对新旧虚拟树差异,最后只更新真实 DOM 中真正变化的部分。它不直接提升单次渲染速度,而是显著减少不必要的 DOM 操作——而 DOM 操作恰恰是前端性能瓶颈所在。
虚拟 DOM(Virtual DOM)本质上是一组嵌套的普通 JS 对象,每个对象代表一个 DOM 元素,包含 tag(标签名)、props(属性/事件)、children(子节点数组)等字段。例如:
{
tag: 'div',
props: { className: 'container', onClick: handleClick },
children: [
{ tag: 'span', p
rops: {}, children: ['Hello'] }
]
}
它不持有任何浏览器 API,也不触发重排重绘,创建和遍历成本极低。
每次状态变化时,框架执行以下流程:
appendChild、setAttribute、textContent = 等),批量、精准、最小化执行真实 DOM 操作慢,不只是因为 JS 调用开销,更因每次修改都可能触发:
虚拟 DOM 把这些昂贵操作“收口”到 patch 阶段,并通过以下方式压缩代价:
它适合中高频更新、结构较复杂的 UI 场景(如后台系统、富交互表单)。但对以下情况未必最优:
现代框架也在弱化虚拟 DOM:SolidJS 用编译时响应式替代运行时 diff;Svelte 将模板直接编译为高效 DOM 操作代码——说明虚拟 DOM 是权衡之选,而非终极方案。