一、说一下Vue和React的区别
一、架构不同
1. MVC
首先MVC指的是Model-View-Controller,分别代表着模型层、视图层、控制器。
- Model(模型层),主要管理的是业务模型的数据和处理数据的逻辑。
- View(视图层)主要是接收用户的交互请求并展示数据信息给用户。
- Controller(控制器层)主要担任的是Model和View之间的桥梁,用于控制程序的流程。
2. MVVM
MVVM架构指的是Model-View-ViewMode,分别代表
- M 表示模型层(存储数据)
- V 表示视图层(显示数据)
- VM 表示视图模型控制层(Vue 框架自带,开发时无需关注具体实现)
二、核心思想不同
Vue
Vue的核心思想是尽可能的降低前端开发的门槛,双向数据流
React
React的核心思想是声明式渲染和组件化、单向数据流,React既不属于MVC也不属于MVVM架构。
单向数据
单向数据流指只能从一个方向来修改状态。
当
Model
中的data
发生变化的时候会单向修改View
中的值,而View
中的值发生变化的时候,Model
不会感知。实际应用就是v-bind
单向数据。
双向数据流
在双向数据流中,Model(可以理解为状态的集合) 中可以修改自己或其他Model的状态, 用户的操作(如在输入框中输入内容)也可以修改状态。(双向数据流也可以叫双向数据绑定)
Diff算法不同
Diff算法是一种对比算法,主要是对比旧的虚拟DOM和新的虚拟DOM,找出发生更改的节点,并只更新这些接地那,而不更新未发生变化的节点,从而准确的更新DOM,减少操作真实DOM的次数,提高性能。
Vue
双端对比算法
React
React 不能通过双端对比进行 Diff 算法优化是因为目前 Fiber 上没有设置反向链表,
二、Vue 和 React 相似的地方
声明式是什么意思?
- 命令式指的是通过DOM操作一步步把网页变成想要的样子
- 声明式则是只需要通过状态去形容最后的网页长什么样子即可。
组件化是什么意思?
- 组件化指的是尽可能的将页面拆分成一个个较小的、可以复用的组件,这样让我们的代码更加方便组织和管理,并且拓展性页更强。
三、为什么Vue中不需要使用Fiber
- 首先时间分片是为了解决 CPU 进行大量计算的问题,因为 React 本身架构的问题,在默认的情况下更新会进行过多的计算,就算使用 React 提供的性能优化 API,进行设置,也会因为开发者本身的问题,依然可能存在过多计算的问题。
- 而 Vue 通过响应式依赖跟踪,在默认的情况下可以做到只进行组件树级别的更新计算,而默认下 React 是做不到的(据说 React 已经在进行这方面的优化工作了),再者 Vue 是通过 template 进行编译的,可以在编译的时候进行非常好的性能优化,比如对静态节点进行静态节点提升的优化处理,而通过 JSX 进行编译的 React 是做不到的。
- React 为了解决更新的时候进行过多计算的问题引入了时间分片,但同时又带来了额外的计算开销,就是任务协调的计算,虽然 React 也使用最小堆等的算法进行优化,但相对 Vue 还是多了额外的性能开销,因为 Vue 没有时间分片,所以没有这方面的性能担忧。
- 根据研究表明,人类的肉眼对 100 毫秒以内的时间并不敏感,所以时间分片只对于处理超过 100 毫秒以上的计算才有很好的收益,而 Vue 的更新计算是很少出现 100 毫秒以上的计算的,所以 Vue 引入时间分片的收益并不划算