换个角度比对Vue和React

197 阅读4分钟

看够了面经八股文,换个角度看看Vue和React的异同点。

首先,从两者的官网上复制一下官方对自身的定义。

React: The library for web and native user interfaces.

Vue: The Progressive JavaScript Framework. An approachable, performant and versatile framework for building web user interfaces. (一个可实现的、高性能且用途广泛的框架。)

从文字上来看,一个是library,一个是framework。 其背后的哲学,或者说理念差别在于以下几点:

  1. React只管UI,而Vue包罗万象。
  2. React贯彻函数式编程的理想,而Vue追求高效开发、快速上手和心智减负。

所以,React的演进方向是做好自己,方便社区。而Vue的核心理念就一个字,“快”!

在没有Create React App的年代,从头搭建一个React的工程是考验前端工程师知识面是否有短板的最好考验方式。若你曾经苦逼的加班调试Webpack每一个配置项怎么生效的时候,隔壁Vue组的同学早就下班聚餐,啤酒+烤串撸了起来。

先说React,

React就像一个家教严格的老父亲,规矩严格、克制自己,性能优化都是在算法、调度上下功夫。从第二个正式版本v16开始,就废弃了mixin和createComponent的相关API,更是在16.8就支持了hooks。之前还Stateful/Stateless组件,hooks之后就主推Function Component了。若你从早期就跟进React,那些高阶组件(高阶函数)、函数组合、数据不可变等等,大部分都是函数式编程的概念。

再说Vue,

Vue从一开始,就像一个全能主妇,家务、学习一把抓,主打一个脏活我全干,剩下你随意。当然,隔壁有个好东西叫hooks,那咱家也得有个composition API。

从项目管理的角度来说:

  • React语法灵活,程序员友好。想学React,需要先打好ES基础,从OOP到FP全面了解。项目写的烂,只能说明程序员的功力不行。从这方面讲,要求相关从业人员素质过关。
  • Vue门槛低,对传统前端开发友好。尤其SFC设计,template、script、style开箱即用。主打一个写了就能跑,对“快速迭代”、“还没想好要做什么”、“先做了再说”特别友好。深受国内老板喜欢,毕竟试错成本低。

从响应式数据的角度来看:

  • React不限制数据类型,严格按照ES标准来判定diff结果。也就是说,React像一块砖,你可以按照自己的思路随意组装。最终实现的效果也是由你个人来承担。有点像Minecraft,不要埋怨房子丑,要怪就怪自己能力不足。
  • Vue对data进行了深入的定制,Vue@2直接修改了对象本身、Vue@3创建了新的proxy对象来代理数据操作。其内置的能力开箱即用,且能满足80%的常见场景。如果项目最终性能有问题,最先考虑的应该是是不是场景有问题,是不是不应该有这么多数据。

从复杂项目的痛点来看:

  • React本身灵活度太高,hooks本身更是一把锋利的手术刀。背后的哲学还没有足够的了解时,就盲目的动手写bug。虽然项目能跑,但是依赖关系一团乱麻。hooks的依赖列表里,常常想不清楚到底是数据依赖还是数据驱动就动手。
  • Vue的数据依赖是隐式声明的,再加上Bus、Mixin等黑魔法手段。想要理清数据依赖关系,几乎没有任何希望。至少200万个依赖声明下,完全找不到性能优化的切入点。

image.png

3554个Vue组件,有200万+的依赖绑定

其实,React和Vue本身都是非常优质的前端解决方案。出现问题的关键点在于,这些解决方案的核心在于响应式数据驱动业务逻辑。如果编程思想没有转变过来,那只能是事倍功半的下场。

就像从面向过程编程到面向对象编程的转变,现在前端编程的核心重点应该是聚焦于数据的一生。感谢React、Vue、Angular这些现代解决方案,它们把前端从事必躬亲的维护每一个DOM节点这种繁重的工作中解脱出来。

如果我们不能把业务抽象成数据模型,按照数据的维度去组织、去管理业务。那我们和20年前的jQuery年代没有任何区别。

这一点尤其是Vue技术栈的同学要格外注意,尤其要注意避免对refs的使用。

PS: 造轮子和创新的区别在于背后是否有思想支撑。如果没有新的理念去支持,那就摆脱不了造轮子的嫌疑。