什么是虚拟DOM
对真实 DOM 的一种抽象描述。本质上是JavaScript对象,这个对象就是更加轻量级的对DOM的描述。
好处
性能优化:
减少频繁的JavaScript 操作真实 DOM 的带来的性能消耗。DOM 发生变化的时候,通过 diff 算法比对 JavaScript 原生对象,计算出需要变更的 DOM,然后只对变化的 DOM 进行操作,而不是更新整个视图。无需手动操作DOM
保证程序性能;提高开发效率实现了跨平台的能力
抽象了原本的渲染过程,而不仅可以是浏览器的 DOM,也可以是安卓和 IOS 的原生组件等。
实现关键
标签代码转成虚拟 DOM
主流的虚拟 DOM 库(snabbdom、virtual-dom),通常都有一个 h 函数。将HTML 代码被转译成 h 函数的渲染形式。h 函数接受是三个参数,分别代表是 DOM 元素的标签名、属性、子节点,最终返回一个虚拟 DOM 的对象。虚拟 DOM 映射到真实 DOM
虚拟 DOM 可以渲染到多个平台,将虚拟 DOM 渲染成真实 DOM 后,只需要插入到对应的根节点即可.diff 算法
比对新老 VDOM 的变化,然后将变化的部分更新到视图上。对应到代码上,就是一个 diff 函数,返回一个 patches (补丁)。更新DOM
在拿到了 VDOM 的 diff 结果后,需要将得到的 patches 更新到视图上。
参考资料:
https://mp.weixin.qq.com/s/oAlVmZ4Hbt2VhOwFEkNEhw
https://juejin.im/post/5d3f3bf36fb9a06af824b3e2
https://juejin.im/post/5c8e5e4951882545c109ae9c
https://ustbhuangyi.github.io/vue-analysis/v2/data-driven/virtual-dom.html