React和Vue我都用了三年,今天说点老板不爱听的大实话

462 阅读10分钟

React和Vue我都用了三年,今天说点老板不爱听的大实话

一、技术选型:一个让程序员集体沉默的难题

上个月老板把我叫进办公室,说新项目要选技术栈,让我两天内给方案。我说好,然后回到工位盯着屏幕发了半小时呆。

不是我不知道选什么,是我知道选哪个都会被后面的坑折磨。

React和Vue,我各写了三年。从外包项目到自研产品,从单人开发到带小团队,这俩框架我都爱过也骂过。今天不聊官方文档里那些漂亮话,只说实际干活时的真实感受。

老板要的是"两天内出方案",但他不知道的是,技术选型从来不是技术问题,而是团队问题、招聘问题、维护成本问题的综合博弈。我花了两天写方案,又花了两周说服各方,最后选了Vue。至于为什么,往下看。

一个被前后端混合双打的全栈社畜,5000小时的真实踩坑记录。

二、学习曲线:一个让你怀疑人生,一个让你怀疑自己

React:你以为学会了,其实刚入门

我刚学React的时候,花了三天写了个Todo List,觉得自己行了。然后组长让我接一个老项目——

// 我看到的代码
class UserDashboard extends React.Component {
  shouldComponentUpdate(nextProps, nextState) {
    return !shallowEqual(this.props.user, nextProps.user)
      || !shallowEqual(this.state.filters, nextState.filters);
  }
  // ... 200 行生命周期方法
}

我当时脑子里只有一个想法:这是什么。

后来有了Hooks,我以为日子好过了。结果发现:

  • useEffect 的依赖数组,少写一个变量就会掉进闭包陷阱,调了一个通宵
  • useCallback / useMemo,用多了代码像裹脚布,用少了老板问你性能怎么这么差
  • 自定义Hook抽象,三个月后回来看,完全不记得自己当时在想什么

React的学习曲线是阶梯式的:入门简单(JSX写起来确实爽),但每往上走一级都要掉一层皮。你得自己决定状态管理用Redux还是Zustand还是Jotai,路由用React Router还是TanStack Router,表单用React Hook Form还是Formik——每个选择后面都跟着一屁股配置和踩坑。

Vue:上手快得让你膨胀,但膨胀完就是迷茫

Vue完全不同。我第一次用Vue是接一个紧急需求,花了一上午看文档,下午就开始写业务代码了:

<template>
  <div v-if="loading">加载中...</div>
  <UserList v-else :users="filteredUsers" @select="handleSelect" />
</template>

<script setup>
import { ref, computed } from 'vue'
const loading = ref(true)
const filteredUsers = computed(() => {
  return users.value.filter(u => u.active)
})
</script>

舒服。真的舒服。模板语法直观,响应式不用手动优化,官方生态开箱即用——Vue Router、Pinia、Vite,你不用选,尤大帮你选好了。

但问题是,这种舒服会让人变懒。我见过太多Vue开发者写了两年,连虚拟DOM是什么都说不清楚。Vue帮你屏蔽了太多底层细节,以至于当你真正遇到性能问题或者需要自定义渲染逻辑时,整个人都是懵的。

维度ReactVue
入门难度低(JSX直观)极低(模板语法接近HTML)
进阶曲线陡峭(需理解闭包、不可变性等概念)平缓但易触天花板
状态管理学习成本高(需自行选型和学习)低(Pinia官方一把梭)
底层理解要求高(被迫理解渲染机制)低(框架帮你屏蔽了)

一句话总结:React让你被迫变强,Vue让你快速变快。前者痛苦但成长快,后者舒服但容易到天花板。

三、开发体验:一个像在拼乐高,一个像在写作文

灵活度对比

这是两个框架最本质的差异。React是"库",只关心UI层,其他全靠你自己搭。Vue是"框架",给你全套解决方案。具体对比:

维度ReactVue
核心哲学库,只关心UI框架,给你全套
编写方式JSX(JavaScript主导)SFC单文件(模板+逻辑+样式)
状态管理自由选择(useState/useReducer + 第三方)Pinia(官方推荐,一把梭)
样式方案CSS-in-JS / CSS Modules / Tailwind...scoped CSS / CSS Modules
路由React Router / TanStack RouterVue Router(官方)
构建工具Vite / Next.js / RemixVite(官方深度集成)

React给了你无限自由,但也意味着每个项目你都可能踩不同的坑。上个月我接手一个React项目,状态管理用的Jotai,路由用的TanStack Router,表单用的React Hook Form,样式用的Vanilla Extract——四个库四种API设计哲学,每次切换上下文我都要愣三秒。

Vue就简单粗暴多了。官方全家桶,文档里怎么写的你就怎么用,基本不会有意外。这对中小团队是巨大优势——新人接手项目,翻官方文档就能干活。

模板 vs JSX:我最想吐槽的地方

Vue的模板语法,写条件渲染的时候是真的优雅:

<div v-if="status === 'loading'">加载中</div>
<div v-else-if="status === 'error'">出错了</div>
<div v-else>{{ content }}</div>

React的等价写法:

{status === 'loading'
  ? <div>加载中</div>
  : status === 'error'
    ? <div>出错了</div>
    : <div>{content}</div>
}

三层三元运算符嵌套,Code Review的时候组长让我重写。但React就是这样,JSX本质上是 createElement 的语法糖,它的表达能力完全取决于JavaScript,没有模板语法那么直观的条件渲染指令。

不过React也有让我爽的地方。渲染逻辑复杂时,直接写JS函数拆分,灵活度拉满:

const renderUserCard = (user) => {
  const avatar = getGravatarUrl(user.email);
  const badge = getUserBadge(user.level);
  return (
    <Card>
      <Avatar src={avatar} />
      {badge && <Badge type={badge.type}>{badge.label}</Badge>}
      <UserName>{user.name}</UserName>
    </Card>
  );
};

Vue里要做类似的逻辑拆分,要么写render函数,要么用JSX插件,总感觉在绕弯子。

React的自由是"给你一把瑞士军刀,你自己看着办"。Vue的约束是"给你一套工具箱,按说明书用就行"。没有对错,只有取舍。

四、性能:别被Benchmark骗了

网上那些虚拟DOM Benchmark,10万行数据渲染对比,Vue和React差个几毫秒——实际业务里你根本感受不到这个差距。真正影响用户体验的是下面这些。

组件更新粒度

Vue的响应式系统基于Proxy,能精确追踪到哪个属性变了,只重渲染依赖该属性的组件。React默认是父组件更新,子组件全量更新,除非你手动包 React.memo 或用 useMemo。

真实案例:去年做了一个数据看板页面,30+个图表组件。React版本每次数据刷新都卡,加了 React.memo、useCallback、useMemo 层层包裹才好一点——但代码已经变成这样了:

const MemoizedChart = React.memo(({ data, options }) => {
  const processedData = useMemo(() => transformData(data), [data]);
  const chartOptions = useMemo(() => mergeOptions(options), [options]);
  return <Chart data={processedData} options={chartOptions} />;
}, (prev, next) => {
  return shallowEqual(prev.data, next.data)
    && shallowEqual(prev.options, next.options);
});

Vue版本几乎没做任何优化,computed + 响应式系统自动搞定了。不是Vue性能更好,而是Vue让你少写了很多手动优化的烂代码。

编译时优化

Vue 3的编译优化很激进:静态节点提升、Patch Flag、Block Tree,编译阶段就把能优化的都优化了。你的模板写得再烂,编译器帮你擦屁股。React这边,React Compiler还在路上,实际项目里兼容性问题一堆。

真实性能对比

场景React(未优化)React(手动优化后)Vue 3
简单表单页流畅流畅流畅
中等复杂度列表(100条)基本流畅流畅流畅
复杂数据看板(30+图表)明显卡顿基本流畅流畅
高频更新(每秒10次+)需要大量优化需要优化需要 shallowRef
大型应用首屏需要code splitting需要code splitting + lazy需要code splitting

结论:中等复杂度以下的项目,两者性能差不多。复杂项目,Vue的默认性能更好,React需要开发者更懂性能优化。

五、生态与招聘:这才是老板最该关心的

生态成熟度

React的生态碾压级领先。Next.js是服务端渲染的王者,React Native是跨端方案的主流选择,组件库有Ant Design、MUI、shadcn/ui,状态管理方案多到选择困难。

Vue这边:Nuxt对标Next.js但差距还在,Uni-app跨端体验一般,组件库Element Plus和Naive UI够用但成熟度有差距,状态管理Pinia好用但基本只有这一个选择。

生态维度ReactVue
SSR方案Next.js(行业标杆)Nuxt(进步快但差距在)
跨端方案React Native(生态成熟)Uni-app(bug较多)
组件库Ant Design / MUI / shadcn/uiElement Plus / Naive UI / Vant
状态管理Redux / Zustand / Jotai / Recoil...Pinia(官方唯一推荐)

但要注意,80%的项目不需要React生态里那些花里胡哨的东西。大多数中小公司的业务就是表单、列表、详情页,Vue的生态完全够用。

招聘难度

ReactVue
求职者数量多中等
平均薪资要求高中
初级开发者比例高(培训班重灾区)中
高级开发者比例高低(更难招到高手)
面试区分度高(能考的点多)低(Vue帮你做了太多,能问的少)

React开发者多但参差不齐,市面上太多"会用React写Todo List就自称React开发"的。Vue这边人少,但胜在官方约束强,代码质量下限更高——你很难用Vue写出特别离谱的代码,不像React,给新手足够的自由他就能给你足够的惊喜(惊吓)。

六、到底怎么选?一个不会挨骂的决策框架

说了这么多,到了最实际的环节。我总结了一套决策流程:

项目类型判断:

1. 你们团队有多少人?
   ├── 1-3人小团队 → 看第2条
   ├── 4-10人中等团队 → 看第3条
   └── 10人以上 → 看第4条

2. 小团队
   ├── 需要快速出活,没时间折腾 → 选Vue
   ├── 有React经验丰富的TL → 选React
   └── 要做移动端 → React(React Native生态更成熟)

3. 中等团队
   ├── 要做SEO/SSR → Next.js(React)更成熟
   ├── 内部管理系统 → Vue更快
   ├── 未来要招人扩展 → React池子大
   └── 追求开发规范 → Vue官方约束好

4. 大团队
   ├── 微前端架构 → 两者都可以,React方案更成熟
   ├── 需要跨团队共享组件 → React生态组件库更丰富
   └── 技术债务可控 → Vue更容易保持一致性

我个人三年的选型倾向

  • 内部工具/后台管理 → Vue 3 + Element Plus。一天搭框架,三天出第一版,老板开心你也开心。
  • 面向用户的产品/官网 → Next.js (React)。SSR、SEO、性能,Next.js就是行业最佳实践。
  • 需要复杂交互的单页应用 → 看团队。千万别为了"技术先进性"强行换栈,团队学习成本远大于框架差异。
  • 小程序/跨端 → React(Taro)或 Uni-app(Vue),半斤八两,选团队熟悉的。
  • 个人项目/开源项目 → 你喜欢哪个用哪个,这是你唯一能任性的时候。

七、最后说点真心话

我写这篇文章的时候,刚改完一个React项目的bug——useEffect 缺少依赖导致的内存泄漏,排查了三个小时。所以现在我对React是带着情绪的。

但冷静下来想,没有银弹,只有取舍。

React教会了我JavaScript的深度——闭包、不可变性、函数式编程,这些知识在任何框架里都有用。Vue让我明白开发体验的重要性——好的框架应该让开发者专注于业务,而不是和框架搏斗。

如果你正在做技术选型,记住一件事:选择你和你的团队最熟悉的,而不是网上声音最大的。网上吵React好还是Vue好的人,大部分既没有维护过3年以上的React项目,也没有维护过3年以上的Vue项目。他们只是在吵。而你在上班。

最后回答开头的那个问题——我为什么选了Vue。因为团队里五个人,三个Vue熟、一个React熟、一个都不熟。选Vue,三个人能立刻产出,两个人有学习曲线但平缓。选React,只有一个人能立刻产出,另外四个全在踩坑。

技术选型的本质不是选最强的工具,是选让团队产出最大化的工具。

如果这篇文章帮你省了一次和老板解释技术选型的时间,点个赞让我知道。有什么踩坑经历也欢迎评论区聊聊——毕竟程序员之间交流踩坑经验,比争论框架好坏有用多了。