什么是虚拟 DOM
本质上是JS
和DOM
之间的映射缓存,在形态上表现为一个能够描述DOM
结构及其属性信息的JS对象
。React
虚拟DOM
的工作流程,
挂载阶段
,React 将结合 JSX 的描述,构建出虚拟DOM
树,然后通过ReactDOM.render
实现虚拟DOM
到真实DOM
的映射。更新阶段
,页面的变化先作用于虚拟DOM
,虚拟DOM
在JS
层借助算法先比较出哪些真实DOM
发生改变,再将改变作用于真实DOM
。
DOM 操作解决方案
JS
操作DOM
时期jQuery
时期
将 DOM 操作变得简单、快速、并且始终保证其稳定和可用。- 模板引擎方案
将 JS 与 HTML 结合,将数据塞入预置好的 HTML 模板中,然后件模板字符串挂载到 DOM 中
1 | <table> |
模板引擎主要做了下面几件事:
- 读取 HTML 模板并解析,分离其中的 JS 信息。
- 将解析出的内容拼接成字符串,生成 JS 代码
- 运行动态生成的 JS 代码,吐出目标 HTML
- 将目标 HTMl 赋值给 innerHTML,触发渲染流水线,完成真是 DOM 渲染。
- 虚拟 DOM
当 DOM 操作(渲染更新)比较频繁时,它会先将前后两次的虚拟 DOM 树进行对比,定位出具体需要更新的部分,生成一个“补丁集”,最后只把“补丁”打在需要更新的那部分真实 DOM 上,实现精准的“差量更新”。这个过程对应的虚拟 DOM 工作流如下图所示:
为什么要使用虚拟 DOM
首先使用虚拟 DOM 不一定会提升性能,性能是一个复杂度比较高的问题,当我们量化性能的时候,往往并不能只追求一个单一的数据,而是需要结合具体的参照物、渲染的阶段、数据的吞吐量等各种要素来作分情况的讨论。
虚拟 DOM 解决的关键问题有以下两个
- 提高研发体验/研发效率
- 跨平台的问题
虚拟 DOM 是对真实渲染内容的一层抽象,如果没有这层抽象,视图层将和渲染平台紧密耦合在一起。有个这层抽象可以实现一次编码,多端运行
。