React 的伟大之处就在于,提出了Virtual DOM这种新颖的思路,而且这种思路衍生出了React Native,有可能会统一Web/Native开发。javascript
在性能方面,因为用到了Virtual DOM技术,React只在调用setState时会更新dom,并且仍是更新virtual DOM,而后和实际的DOM比较,最后再更新实际的DOM。java
Virtual DOM的核心思想是:批量操做DOM和做用最少的diff算法
你一个接一个地去修改30个节点的时候,就会引发30次(潜在的)布局重算,30次(潜在的)重绘,等等。浏览器
以后,一旦你要把这些改动传递给真实DOM,以前全部的改动就会整合成一次DOM操做。这一次DOM操做引发的布局计算和重绘可能会更大,可是相比而言,整合起来的改动只作一次,减小了(屡次)计算。缓存
这就是所谓的Virtual DOM算法,包括几个步骤:数据结构
1.用javascript对象结构表示DOM树的结构,而后用这个树构建一个真正的DOM树,插入到文档流中dom
2.当文档变动时,从新构造一颗新的对象树,而后用新的对象树和旧的对象树对比,记录两棵树的差别布局
3.把2所记录的差别应用到1所构建的真正的DOM树上,就实现变动了性能
Virtual DOM本质上就是在JS和DOM之间作了一个缓存。能够类比CPU和硬盘,既然硬盘这么慢,咱们就在他们之间加一个缓存。既然JS这么慢,咱们就在JS和DOM之间加一个缓存。CPU只操做内存,最后把变动写入硬盘。JS只操做Virtual DOM,最后把变动写入DOM。spa
其思想的关键是:
1.相对于 DOM 对象,原生的JS对象处理起来更快更简单。
2.比较两棵DOM树的差别是 Virtual DOM算法最核心的部分,这也是所谓的Vritual DOM的diff算法。
为何快不少?
固然若是真的这样大面积的操做 DOM,性能会是一个很大的问题,因此 React 实现了一个虚拟 DOM,组件 DOM 结构就是映射到这个虚拟 DOM 上,React 在这个虚拟 DOM 上实现了一个 diff 算法,当要更新组件的时候,会经过 diff 寻找到要变动的 DOM 节点,再把这个修改更新到浏览器实际的 DOM 节点上,因此实际上不是真的渲染整个 DOM 树。这个虚拟 DOM 是一个纯粹的 JS 数据结构,因此性能会比原生 DOM 快不少