vue 虚拟dom实现
Vue 虚拟DOM的实现原理
Vue 的虚拟DOM(Virtual DOM)是一种优化手段,通过JavaScript对象模拟真实DOM结构,减少直接操作真实DOM带来的性能开销。以下是Vue虚拟DOM的核心实现机制:
虚拟DOM的创建
Vue 通过 createElement 函数(通常简写为 h)创建虚拟节点(VNode)。每个VNode对象包含标签名、属性、子节点等信息,例如:

{
tag: 'div',
props: { id: 'app' },
children: [
{ tag: 'span', props: {}, children: ['Hello'] }
]
}
Diff算法与更新策略
Vue 采用高效的Diff算法比较新旧虚拟DOM树的差异,仅更新必要的真实DOM节点。其核心策略包括:

- 同层比较:只对比同一层级的节点,不跨层级比较。
- Key优化:通过
key标识节点身份,避免不必要的重新渲染。 - 双端比较:在列表对比时,同时从新旧列表的首尾开始比较。
Patch过程
虚拟DOM的更新通过 patch 函数完成:
function patch(oldVnode, newVnode) {
if (sameVnode(oldVnode, newVnode)) {
patchVnode(oldVnode, newVnode)
} else {
const parent = oldVnode.parentNode
const elm = createElm(newVnode)
parent.insertBefore(elm, oldVnode)
parent.removeChild(oldVnode)
}
}
响应式系统集成
Vue 的虚拟DOM与响应式系统紧密结合:
- 数据变化触发
setter通知。 - 组件执行
render函数生成新虚拟DOM。 - 通过
patch比较新旧虚拟DOM并更新真实DOM。
性能优化手段
- 异步更新队列:多次数据变化合并为一次DOM更新。
- 静态树提升:标记静态节点避免重复Diff。
- 事件缓存:缓存事件处理函数减少重复创建。
Vue 3 进一步优化了虚拟DOM的实现,引入了编译时优化(如静态提升、PatchFlag标记),使得Diff过程更加高效。






