提起Virtual DOM,总是给人一种高深莫测的感觉,大家都知道它比DOM快。那么Virtual DOM到底是何方神圣呢?在深入理解Virtual DOM之前,先让我们回顾一下DOM。
一、什么DOM?
所谓DOM,就是HTML、XML、XHTML的一种抽象描述,它会把这些文档抽象成树类型的数据结构,即DOM tree。树的每一个节点,即一个DOM节点。浏览器提供了众多的DOM API,让它拥有了DOM操作的神奇魔力。
dom操作.png二、Virtual DOM出现的背景
由于SPA类型项目的出现,DOM tree的结构变得越来越复杂,它的改变也变得越来越频繁,大量的DOM操作产生了,对DOM节点的增删改,还有许多的事件监听、事件回调、事件销毁需要处理。由于DOM tree结构的频繁变化,会导致大量的reflow从而影响性能。于是Virtual DOM就出现了。
三、什么是Virtual DOM?
DOM结构是一系列的属性和方法的集合。所谓Virtual DOM,就是用轻量级的JavaScript对象来代替庞杂的DOM结构。下面代码就展示了HTML结构和Virtual DOM之间的关系。
2-真实DOM结构.png 3-虚拟DOM.png四、用JSX语法表示Virtual DOM
JSX是一种创建ReactElement的便捷写法。ReactElement是一种轻量级的、无状态的、不可改变的、DOM元素的虚拟表示。实际上也是用一个JavaScript对象来描述DOM结构。
4-jsx.png五、render方法
在第四步中,我们看到使用render方法,可以把Virtual DOM渲染到真实的DOM中,那么render方法中到底做了什么呢?
5-render.png六、Diff算法
通过以上步骤,我们大致理解了Virtual DOM和真实DOM之间的关系,以及render方法是如何把Virtual DOM渲染到真实的DOM中。所谓Virtual DOM只不过就是DOM结构的JavaScript对象描述而已。那么它为什么会比DOM更高效、速度更快呢?
有了Virtual DOM,当发生任何更新的时候,这些变更都会发生在Virtual DOM上,即发生在一种轻量级的JavaScript对象上。当任何变更发生后,就会生成一颗新的Virtual DOM树。Diff算法,即是对这新旧两颗Virtual DOM进行计算,从而计算出它们之间的差异。最后再把这些差异渲染到真实的DOM中。通过这种方式,大大地减少了真实DOM操作,所以更高效、速度更快。
现在用伪代码来总结一下整个流程。
6-diff.png从上述代码看,基于Virtual DOM的DOM渲染之所以更快,就在于Diff算法的强大之处。Diff算法,比较的是两个JavaScript对象的差异。
七、Virtual-DOM库
使用Virtual-DOM库,实现一下第六步中提到的整个流程。
7-virtual-dom.png八、小结
1、Virtual DOM是真实DOM的JavaScript对象描述。这种使用JSON数据结构的形式描述,更加轻量级。
2、Diff算法是Virtual DOM操作更快更高效的核心。每当有变化发生时,都会创建新Virtual DOM,使用Diff算法比较出新旧Virtual DOM之间的差异,再把这部分差异渲染到真实DOM中去。这大大地减少了真实DOM的操作。
3、React中推荐的JSX语法,即是一种快捷创造ReactElement的方法。ReactElement即是Virtual DOM。
参考资源:
1、张轩《React全栈 整合开发》
2、Virtual-DOM:https://github.com/Matt-Esch/virtual-dom
XiaBiBi.jpg
网友评论