React相比其他框架的优点:
- 组件的组合模式
- 高效的性能
- 单向响应数据流
- 分离的框架设计
组件的组合模式
- 在dom树上的节点被称为元素。在这里则不同,Virtaul DOM上称为component,Virtaul DOM的节点就是一个完整抽象的组件,它是由components组成。
- 组合模式:组合模式有时候又叫做部分-整体模式,它使我们树形结构的问题中,模糊了简单元素和复杂元素的概念,客户程序可以像处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素的内部结构解耦。
- React就是基于组合模式,无论是应用等级还是一个表单亦或是一个按钮都视为一个组件,然后基于组件的组合构建整个应用,这样的结构一直是前端想要却迟迟不来的web component。
React里写的所有东西都是一个组件,最小的组件就是一个元素
基于组合模式的优点:
- 构建可重用组件:组建的开发能够形成公司的组件库,每个业务的开发都能积累可重用的组件。
- 无学习障碍:天然符合html的结构,对前端开发者来说,几乎没有学习障碍。
- 具有弹性的架构:组合模式很简单却很有效,能够构建简单的页面也能构建大型的前端应用。
- 源码可维护性高:开发只是工作中的一部分,应用的上线才是噩梦的开始,很多大型应用因为复制业务逻辑无法快速响应业务需求,可维护性低。
单向数据流
组件之间数据传递是单向的,只能由父组件向子组件传递数据。 我们都知道JavaScript是脚本语言,不像静态语言一样通过编译定位问题,想要清晰的定位到应用中的bug需要深入了解业务代码,对于大型前端应用来说,因为业务代码量很大且复杂,很难定位到bug。然后React的单项数据流的设计让前端bug定位变得简单,页面的UI和数据的对应是唯一的,我们可以通过定位数据变化就可以定位从而展现问题。
高效的性能(这一段要背下来)
React实现的原理:Virtual DOM(虚拟DOM)
传统的web应用,操作DOM一般都是直接更新操作,但是我们知道DOM更新通常是比较昂贵的。而React为了减少对DOM的操作,提供了一种不同的而又强大的方式来更新DOM,代替直接的DOM操作。就是Virtual DOM,一个轻量级的虚拟的DOM,就是React抽象出来的一个对象,描述DOM应该是什么样子,应该如何呈现。通过这个Virtual DOM去更新真实的DOM,由这个VDOM管理真实DOM的更新。
分离的框架设计
- React.js现在的的版本已经将源码分开为ReactDOM和React.js,这就意味着React不仅仅能够再web端工作,甚至可以在服务器(node.js),Native端运行。
- 与此同时,我们可以自定义自己的渲染器,实现比如Three.js,Pixi.js,D3.js的React方式渲染。
什么是虚拟DOM?
就是React里的一个对象,虚拟对象可以被渲染为真实DOM,它是一个轻量级的dom,占据内存空间小。
diff算法:(背下来)
diff算法如何实现高效?
- 主要解决渲染真实DOM的效率低问题。
- diff算法的作用:计算出VDOM中真正变化的部分,并只针对该部分进行原生DOM操作,而非重新渲染整个页面。
传统diff算法:
通过循环递归对节点进行依次对比,算法复杂度达到O(n^3),n是树的节点数,这个有多可怕呢?——如果要展示1000个节点,得执行上一次比较。即便是CPU快能执行30亿条命令,也很难在一秒内计算出差异。
React的diff算法
将VDOM树转化成成actual DOM树的最少操作的过程称为调和。diff算法是调和的具体实现。
diff算法策略(背下来)
React用三大策略,将O(n^3)复杂度转化为O(n)复杂。
- 策略一(tree diff):
- Web UI中的DOM节点跨层级的移动操作特别少,可以忽略不计(基本都是同级之间操作)
- 策略二(component diff)
- 拥有相同类的两个组件,生成相似的树形结构
- 拥有不同类的两个组件,生成不同的树形结构
- 策略三(element diff)
- 对于同一级的一组子节点,通过唯一key区分。
diff算法的三大策略总结:先找一整层(大范围)哪个地方一样,找到以后看哪个组件不一样,找到具体哪一个组件不一样。就再看这个组件里的哪个标记不一样。
tree diff
- React通过updateDepth对Virtual DOM进行层级控制
- 对树分层比较,两棵树只对同一层次节点进行比较。如果该节点不存在时,则该节点及其子结点会被完全删除,不会再进一步比较。
- 只需遍历一次,就能完成整棵DOM树的比较。 注意:diff之间但考虑同层级的节点位置变换,如果是跨层级的话,只有创建节点和删除节点的擦欧总。因此官方建议不要进行DOM节点跨层级操作,可以通过CSS隐藏、显示节点,而不是真正的移除,添加DOM节点。
React的应用范围
web端应用 原生应用——IOS、Android、Native应用 Node.js服务端渲染html