Skip to content

vue3和react的区别

https://segmentfault.com/a/1190000043837947

Vue3 和 React 是现代前端开发中常用的两个框架,它们在设计理念、语法和使用场景上既有相似之处,也有显著差异

在说不同之前,可以先简单说下相同点

  • 两者都支持组件化开发,允许将 UI 拆分为可复用的组件
  • 都支持响应式数据绑定,数据变化时自动更新视图
  • 都使用虚拟 DOM 来提高性能,通过高效的 DOM 更新机制减少直接操作真实 DOM 的开销
  • 完善生态系统

不同点

  1. 核心思想和设计理念有区别
  • React的定位偏向于前端UI的开发库,关注于自身的实现,上层生态环境更多由社区提供,写法上jsx,html和js的混合,更灵活
  • Vue的定位偏向于完整的前端框架,生态主要由官方主导,且SFC的方式更类似原始的HTML\css\js的组织,相对入门门槛较低
  1. 数据管理的不同

虽然之前说他们都是数据驱动视图的思想,但实际实现方式上大有不同,这也导致了整体的框架差异

  • 更新数据时,React 是手动 setState,Vue则是响应式的

Vue 是对数据进行劫持/代理,它对监测数据的变化更加精准,动了多少数据就触发多少更新,更新粒度很小,而 React 推崇函数式,这是没办法感知数据变化的,就是说不知道什么时候应该刷新,而且即便是手动 setState 触发更新,它也也不知道哪些组件需要刷新,而是渲染整个组件,这样就导致性能不好,所以后面只能不断通过增加了一个个避免刷新的钩子函数或者 API 还有采用 Fiber 的架构来做时间分片也是来优化渲染的性能。当然 Vue 也不是那么完美,它实现精准刷新也是有代价的,就是需要给每个组件配置监视器,管理依赖收集和派发更新,这同样是有消耗的。

正是这种设计上的区别,也直接影响了 hooks 的实现和表现,React hook 底层是基于链表实现的,每次组件被 render 的时候都会按顺序执行所有 hooks,而且正因为底层是链表,每个 hook 的 next 是指向下一个 hook 的,所以我们写代码是不能在不同的 hooks 调用里使用条件判断/函数嵌套之类的,因为这会导致执行顺序不对,从而出错。而 Vue hook 只会被注册调用一次,因为它是声明在 setup 里,一次组件实例化只调用一次 setup,Vue 之所以能避开这些问题,主要还是得益于数据响应式,不需要链表对 hooks 进行记录,而是直接对数据代理观察。

再比如编译优化的问题,Vue 能够做到数据劫持,再到 Vue3 动静结合的 Diff 思想也得益于它的模板语法实现了静态编译。就是能做到预编译优化,可以静态分析,在解析模板时能根据解析到的不同的标签、文本等分别执行对应的回调函数来构造 AST,而 React 虽然 JSX 语法更加灵活,可也正是因为这样导致可以优化的地方不足,重新渲染时就是一堆递归调用 React.createElement,无法从模板层面进行静态分析,也就做不到双向绑定,即使是很厉害的 fiber,也是因为伤害已经造成,所以通过时间分片的优化来弥补伤害吧,因为已经无法在编译阶段进行优化了,这也是这个设计所带来的问题吧

  1. 项目搭建上
  • react过去使用的主流是create React app创建项目,内部时使用wepack进行打包,因此项目大了之后,webpack打包慢的缺点
  • vue3使用vite,开发快,不需要大量的配置
  • Vite 成为 React 官方推荐

项目选型

React和Vue各有优劣,从加载速度,运行时性能来说,我觉得这两个框架综合各种场景应该是没什么质的差别的。硬要说的话,Vue 在更新时性能优化方面需要的心智负担可能会少那么一点,特别是 Vue3,而 React 如果不注意,容易导致一些组件无用的 Diff,但其实实际项目中真正能遇到这种性能瓶颈的也是极少数,所以(这里有两种说法):

(如果公司主要用 Vue 技术栈的话):所以总的来说我觉得 Vue 性能上会更有优势一点,特别是 Vue3 更加灵活,有很好的可扩展性,同时有更快的渲染速度和更小的打包体积。从 mixins 到 HOC 到 render props 再到 hooks,React 基本已经废掉了过去很多基于组件的逻辑抽象模式,抹掉了 JSX 对比模板的一个优势,Vue3 中现在也都能做到,所以我会偏向 Vue3。

(如果公司主要用 React 技术栈的话):所以总的来说我觉得要是一些不大的系统或者 H5 就用 Vue,因为不管是上手还是开发难度上都很简单,开发效率也高嘛,而且它有更小的打包体积,毕竟在移动端网络差异大的情况下,资源体积是非常重要的。但像是一些中后台系统,或者一些大点的项目,会越做越大的,多人协作开发的,就用 React,因为它的函数式编程有更加灵活的结构和可扩展性,丰富的生态圈和工具链,解决方案多,后期也更方便迭代与维护,还适用原生 APP,所以我会偏向 React。

苏ICP备2025160170号-1 | 前端进化之路 | Released under the MIT License.