Virtual DOM
如果数据绑定将开发者从操作 DOM 中解放了出来,那虚拟 DOM 则为数据绑定提供了性能保证,还有分层设计、跨平台以及服务端渲染等特性。
原理
虚拟 DOM 本质上就是在 JS 和 DOM 之间做了一个缓存。可以类比 CPU(JS) 和硬盘(DOM),直接操作硬盘(DOM)很慢,我们就在它们之间加个内存(Virtual DOM),CPU(JS)只操作内存(Virtual DOM),最后再把变更写入硬盘(DOM)。
并且虚拟 DOM 还会使用 Diff 算法来计算出真正需要更新的节点,从而最大限度地减少 DOM 操作,提升性能。
虚拟 DOM 的实现主要包括三个部分:
1.用 JavaScript 对象模拟真实 DOM 树,对真实 DOM 进行抽象;
2.diff 算法 — 比较两棵虚拟 DOM 树的差异;
3.pach 算法(打补丁) — 将两个虚拟 DOM 对象的差异应用到真正的 DOM 树。
例如,一个 Vue 组件的 HTML 结构为:
<template><div id="app" class="container"><h1>hello</h1></div>
</template>
Vue 在编译时会将 template 模板转换成 VNode 对象并缓存下来:
{type:'div',props:{ id:'app', class:'container' },children: [{ type: 'h1', children:'hello' }]
}
这样当组件状态数据发生变化时,会触发虚拟 DOM 数据的变化,然后 Vue 会通过 D