Vue和React的区别

124 阅读9分钟

Vue和React这两个前端框架都是比较主流的,用户也都比较多,但是我们在使用这些框架的时候,是否对这两个框架之间的区别有所了解呢?

Vue

  • Vue官网说:Vue是用于构建用户界面的Javascript渐进式框架。

Vue是渐进式JavaScript框架。“渐进式框架”和“自底向上增量开发的设计”是Vue开发的两个概念。Vue可以在任意其他类型的项目中使用,使用成本较低,更灵活,主张较弱,在Vue的项目中也可以轻松融汇其他的技术来开发。特点:易用(使用成本低),灵活(生态系统完善,适用于任何规模的项目),高效(体积小,优化好,性能好)。

React

  • React官网说:React是用于构建用户界面的Javascript库。

React主张是函数式编程的理念, 实现了前端界面的高性能高效率开发,react很擅长处理组件化的页面。React的官方网站提到了“学习一次,随处写作”这个关键功能,可以使用React框架在JavaScript中构建移动应用程序。在 React 中,所有的组件的渲染功能都依靠 JSX,它是JavaScript的语法扩展,它在创建UI组件和调试时非常简单有用。

image.png

Vue优点

  • 易于使用: Vue.js包含基于HTML的标准模板,可以更轻松地使用和修改现有应用程序。
  • 更顺畅的集成:无论是单页应用程序还是复杂的Web界面,Vue.js都可以更平滑地集成更小的部件,而不会对整个系统产生任何影响。
  • 更好的性能,更小的尺寸:它占用更少的空间,并且往往比其他框架提供更好的性能。
  • 精心编写的文档:通过详细的文档提供简单的学习曲线,无需额外的知识; HTML和JavaScript将完成工作。
  • 适应性:整体声音设计和架构使其成为一种流行的JavaScript框架。它提供无障碍的迁移,简单有效的结构和可重用的模板。

Vue 缺点

  • 生态系统相对较小: 尽管Vue.js的生态系统在不断增长,但与React相比,社区和第三方库的数量可能相对较少。
  • 大型应用管理:在处理非常大的应用时,Vue.js的状态管理可能需要更多的努力,Vuex并不像Redux那样被广泛使用。

React优点

  • 灵活性和响应性:它提供最大的灵活性和响应能力。
  • 丰富的JavaScript库:来自世界各地的贡献者正在努力添加更多功能。
  • 可扩展性:由于其灵活的结构和可扩展性,React已被证明对大型应用程序更好。
  • 不断发展: React得到了Facebook专业开发人员的支持,他们不断寻找改进方法。
  • web或移动平台: React提供React Native平台,可通过相同的React组件模型为iOS和Android开发本机呈现的应用程序。

React 缺点

  • 学习曲线较陡: 对于初学者来说,理解React的概念,以及虚拟DOM等复杂概念可能需要一些时间。
  • 过于灵活: React的灵活性可能会导致团队在架构和模式选择上出现分歧,需要更多的决策。
  • 模块化设置: React并没有内置的路由和状态管理库,这意味着需要从外部选择适合的库,这可能需要一些额外的配置和学习。

相同点

1.数据驱动视图

在jquery时代,我们需要频繁的操作DOM来实现页面效果与交互;而Vue和React解决了这一痛点,采用数据驱动视图方式,隐藏操作DOM的频繁操作。所以我们在开发时,只需要关注数据变化即可,但是二者实现方式不尽相同。

2.组件化

React与Vue都遵循组件化思想,它们把注意力放在UI层,将页面分成一些细块,这些块就是组件,组件之间的组合嵌套就形成最后的网页界面。所以在开发时都有相同的套路,比如都有父子组件传递,都有数据状态管理、前端路由、插槽等。

3.Virtual DOM

Vue与React都使用了 Virtual DOM + Diff算法,不管是Vue的Template模板+options api写法,还是React的Class或者Function写法,最后都是生成render函数,而render函数执行返回VNode(虚拟DOM的数据结构,本质上是颗树)。

当每一次UI更新时,总会根据render重新生成最新的VNode,然后跟以前缓存起来老的VNode进行对比,再使用Diff算法(框架核心)去真正更新真实DOM(虚拟DOM是js对象结构,同样在js引擎中,而真实DOM在浏览器渲染引擎中,所以操作虚拟DOM比操作真实DOM开销要小得多)。

不同点

Vue和React两者虽然都是用于构建用户界面的框架,但是也有很大的差异,首先二者核心的思想就不同。

1.核心思想不同

Vue开发的定位就是尽可能的降低前端开发的门槛,让更多的人能够更快地上手开发。这就有了vue地主要特点:灵活易用地渐进式框架,进行数据拦截/代理,它对侦测数据地变化更加敏感、更精准。

React从一开始地定位就是提出UI开发的新思路。背靠大公司Facebook的React,从开始起就不缺关注和用户,而且React想要做的是用更好的方式去颠覆前端开发方式。所以React推崇函数式编程(纯组件),数据不可变以及单向数据流,当然需要双向的地方也可以手动实现,比如借助onChangesetState来实现。

由于两者核心思想的不同,所以导致Vue和React在后续设计产生了许多差异。

2.组件写法差异

React推荐的做法是JSX + inline style,也就是把 HTML 和 CSS 全部写进 javascript中,即all in js;Vue推荐的做法是 template 的单文件组件格式(简单易懂,从传统前端转过来易于理解),即 html,css,js写在同一个文件(vue也支持JSX写法)。这个差异一定程度上也是由于二者核心思想不同而导致的。

3.diff算法不同

传统diff算法是循环递归每一个节点。将两棵树中所有的节点一一对比需要O(n²)的复杂度,在对比过程中发现旧节点在新的树中未找到,那么就需要把旧节点删除,删除一棵树的一个节点(找到一个合适的节点放到被删除的位置)的时间复杂度为O(n),同理添加新节点的复杂度也是O(n),合起来diff两棵树的复杂度就是O(n³)。传统Diff算法复杂度太高,vue2.x加入了 Virtual Dom 和react拥有相同的diff优化原则(将算法复杂度降为O(n))。

两者流程思路上是类似的:

不同的组件产生不同的DOM结构。当style不相同时,对应DOM操作就是直接销毁老的DOM,创建新的DOM。同一层次的一组子节点,可以通过唯一的key区分。

React的Diff算法核心实现

react首先对新集合进行遍历,for(name in nextChildren),通过唯一的key来判断老集合中是否存在相同的节点。如果没有的话就创建,如果有的话,if(preChild === nextChild)会将节点在新集合中的位置和老集合中lastIndex进行比较,如果 if(child._mountIndex < lastIndex)进行移动操作,否则不进行移动操作。如果遍历的过程中,发现在新集合中没有,但在老集合中有的节点,会进行删除操作。

vue的Diff算法核心实现

updateChildren是vue diff的核心,过程可以概括为:

children和新children各有两个头尾的变量StartIdxEndIdx,它们的两个变量相互比较,一共有四种比较方式。如果四种方式都没匹配,如果设置了key,就会用key进行比较,在比较的过程中,变量会往中间靠,一旦StartIdx > EndIdx表明旧children和新children至少有一个已经遍历完了,就会结束比较。

Vue2的核心Diff算法采用了双端比较的算法,同时从新旧children的两端开始进行比较 ,借助key值找到可复用的节点,再进行相关操作。相比React的Diff算法,同样情况下可以减少移动节点次数,减少不必要的性能损耗,更加的优雅。

Vue对比节点。当节点元素相同,但是className不同,认为是不同类型的元素,删除重建。而React认为是同类型节点,只是修改节点的属性。
Vue的列表对比,采用的是两端到中间对比的方式,而React采用的是从左到右依次对比的方式。
当一个集合只是把最后一个节点移到了第一个,React会把前面的节点依次移动,而Vue只会把最后一个节点移到第一个。总体来说,Vue的方式比较高效。

4.响应式原理不同

Vue

vue:vue会遍历data数据对象,使用Object.definedProperty() 将每个属性都转换为getter和setter,每个Vue组件实例都有一个对应的watcher实例,在组件初次渲染的时候会记录组件用到了那些数据,当数据发生改变的时候,会触发setter方法,并通知所有依赖这个数据的watcher实例调用update方法去触发组件的compile渲染方法,进行渲染数据。

React

React基于状态机,手动优化,数据不可变,需要setState驱动新的state替换老的state。当数据改变时,以组件为根目录,默认全部重新渲染,所以React中会需要shouldComponentUpdate这个生命周期函数方法来进行控制

应用场景

React

1、构建一个大型应用项目时:React的渲染系统可配置性更强,和React的测试工具结合起来使用,使代码的可测试性和可维护性更好。大型应用中透明度和可测试性至关重要。

2、同时适用于Web端和原生APP时:React Native是一个使用Javascript构建移动端原生应用程序(iOS,Android)的库。 它与React.js相同,只是不使用Web组件,而是使用原生组件。

Vue

1、构建数据简单中小型应用时:vue提供简单明了的书写模板、大量api、指令等等,可快速上手、开发项目。

2、应用尽可能的小和快时:随着vue3.0的发布,vue的体积进一步缩小,远小于react的体积,也配合diff算法,采用proxy去实现双向绑定,渲染大幅度提升。

总结

Vue的优势包括: 模板和渲染函数的弹性选择, 简单的语法及项目创建, 更快的渲染速度和更小的体积;

React的优势包括: 更适用于大型应用和更好的可测试性,同时适用于Web端和原生App, 更大的生态圈带来的更多支持和工具 。

而实际上,React和Vue都是非常优秀的框架,它们之间的相似之处多过不同之处,并且它们大部分最棒的功能是相通的。