
这不是一篇怀旧的悼文。这是一场技术选择的重估。
你还记得那些年吗?CRA、Redux、微前端、CSS-in-JS 这些技术被推到了舞台中央。大厂们争相采用,创业公司以为找到了银弹,招聘页面上到处都写着"熟悉 Redux 和微前端架构优先"。
但现在,这些技术正在被重新审视。
不是因为它们没有价值,而是在实际应用中,它们承诺的收益往往被真实的成本所掩盖。有些问题被更轻量的方案解决得更好。2026 年的前端正在进行一次理性的反思:有时候,让开发者体验更好的工具,会无意中增加用户的使用负担。
2025年2月14日这天,React官方宣布了一个让无数开发者五味杂陈的决定——create-react-app 正式停止维护。
没有绚烂的告别,只有一句冷冰冰的通知:"create-react-app is deprecated. Please use modern React frameworks."
这个陪伴了9年的老伙计,曾经是 React 生态的入口。2016 年的时候,不用 CRA 搭建 React 项目,你得跟 Webpack 的配置文件斗智斗勇。CRA 出现后,一句 create-react-app my-app,你就能写代码了。它就像一个心疼程序员的管家,帮你把繁琐的东西都收拾好。
但故事到这里就结束了。
2025 年之后,开发工具的世界变了:
CRA 陷入了一个无法逃脱的困境:它想保持轻量级,但用户需要的功能越来越多;它想支持新的构建工具,但已经被 Webpack 绑定太深。到了 2026 年,没人愿意再等 8 分钟的构建时间,只为了一个过时的开发体验。
真实的迁移故事:某家电商公司从 CRA 迁移到 Vite 后:
Redux 不是死了,它是被悄悄地放进了历史遗物馆。
还记得那些年 Redux 有多火吗?面试的时候,考官问你"你了解 Redux 中间件吗?"就像问你"你是真的程序员吗?"一样。但在 2026 年,Redux 已经从**"必备技能"** 沦落到**"了解就行,别当主力"**。
最直观的证据来自数据:
状态管理工具使用率变化
Zustand: 2023年 8% → 2026年 35%
Redux: 2023年 60% → 2026年 38%
为什么大家开始逃离 Redux?我问过很多团队,他们都给出了一样的答案:太重了。
这个"重"不是指代码包的大小,而是认知负担:
Redux 更新流程:
User Action
↓
Dispatch Action
↓
Middleware 处理
↓
Reducer 计算新状态
↓
Store 更新
↓
Selector 提取数据
↓
Component 重新渲染
七步才能完成一个状态更新。而 Zustand 呢?
Zustand 更新流程:
User Action
↓
调用 state 更新函数
↓
Component 重新渲染
只需两步。
更扎心的是性能数据:
指标 | Zustand | Redux |
|---|---|---|
状态更新延迟 | 35ms | 65ms |
内存开销 | 5% | 15% |
首屏加载时间 | +200ms | +400ms |
有个团队从 Redux 迁移到 Zustand,状态代码从 1500 行砍到了 700 行。最关键的是,新人上手从两周缩短到三天。你再想想,员工每月少搞两周的学习配置,一年公司能省多少钱?
但是,Redux 在什么时候还有价值呢?只有一种情况:超大型企业应用,有法规审计要求,多个团队需要统一的状态协议。比如某金融科技公司有 50 个工程师共享一个状态树,需要完整的日志追踪和回放能力。在这种情况下,Redux 的学习成本在公司整体效率面前,就不算什么了。
但问题是,90% 的应用都不是这样的。你的 SaaS 产品、内部系统、电商前端——它们都不需要 Redux。你用 Redux,就像用大炮打蚊子。
微前端的故事,就像一个被吹过头的创业融资。投资人看到了 Spotify 和蚂蚁金服的成功案例,立刻掐指一算:"2025 年微前端会爆发!"
结果呢?采用率从 75% 骤降到 23%,而且还在继续下滑。
你知道为什么吗?因为微前端解决的问题,在大多数公司的场景里根本不存在。
微前端在理想国里是这样的:不同的团队、不同的技术栈、完全独立的部署。听起来很诱人,对吧?但现实中会发生什么?
假设你有三个微应用:
用户访问你的应用,浏览器要下载:React (80KB) + Vue (35KB) + Svelte (15KB)。这叫什么?浪费。
如果都用 React,一个 React 库就搞定了。微前端反而让你的首屏加载多花 130KB 的流量。在 4G 网络下,那就是额外多等 2-3 秒。
页头是 Team A 的。导航是 Team B 的。内容是 Team C 的。现在产品说:"把导航改成深色主题"。你需要改动 Team B,重新部署,等待他们上线……然后发现用 CSS-in-JS 的样式冲突了。
一个简单的改动,变成了一场跨团队协调的噩梦。
微前端通常用 iFrame 加载子应用。搜索引擎爬虫进来一看:
<iframe src="https://sub-app.com/article"></iframe>
完蛋,爬虫看不到你的实际内容。你精心写的 SEO 文案全部失效。
Module Federation 看起来很高级,但实际代价呢?
某公司用微前端后测下来:
指标对比(有微前端 vs 无微前端)
首屏加载时间: 2.1s → 2.8s(+33%)
INP 指标: 150ms → 380ms(+153%)
CLS 指标: 0.08 → 0.15(+87%)
用户体验明显变差。
然后有个团队就把五个微应用合并成了一个 monorepo(模块化单体),用 Nx 管理不同的模块。结果:首屏降到 1.2 秒,构建还快了,部署也独立了。一箭三雕。
微前端现在的适用场景就一个:你的公司像 Spotify 那样有 200+ 个独立的 Web 应用,需要完全的技术栈隔离。其他情况下,模块化单体(modular monolith)才是正道。
让我讲个真实的故事。
2022 年,某家融资过亿的创业公司,他们的应用是 React + Emotion(CSS-in-JS 方案)。用户反馈说:"你们的产品太卡了,隔壁竞争对手明显快很多。"
工程师们开始排查。用 Chrome DevTools 的 Performance 标签录一下用户交互:
用户点击 → React 重新渲染 → Emotion 重新计算所有样式 →
主线程被锁定 → 总花费 450ms
这就是 CSS-in-JS 的原罪:样式计算发生在 JavaScript 执行的主线程上。
具体来说,每次组件重新渲染,Emotion 都要做以下工作:
这整个过程,都在主线程上。你的 JavaScript 逻辑在等,用户的交互在等,动画在卡顿。
Reddit、CircleCI、Spot 这些公司最终都把 CSS-in-JS 砍掉了。Reddit 的工程师团队在做完迁移后,写了篇文章说:**从 Emotion 迁移到 Tailwind + CSS Modules,渲染性能提升了 28%**。
为什么提升这么明显?因为:
方案 | 执行时机 | 执行线程 | 性能影响 |
|---|---|---|---|
CSS-in-JS | 运行时 | 主线程 | 直接影响交互 |
Tailwind | 构建时 | 无 | 零运行时成本 |
CSS Modules | 编译时 | 无 | 零运行时成本 |
现在的最佳实践是:
这样的组合,既保留了原来的便利性,又彻底避免了运行时性能问题。
最后这个问题,很多小公司还没意识到,但大公司已经在为此付出代价。
单体前端架构就是:前端代码全在一个项目里,和后端代码在同一个 Monolith 中。听起来没问题,对吧?
但在实际运营中:
A 团队改了一个商品详情页的样式
↓
提交 PR,等待代码审查
↓
CI/CD 运行 1000+ 个测试(包括不相关的模块)
↓
构建时间 25 分钟
↓
测试通过,合并代码
↓
自动部署到生产环境
↓
B 团队发现 checkout 流程坏了(某个共享的 utils 被改了)
↓
发起紧急修复,回滚、Fix、重新部署
↓
用户在这 30 分钟内没法下单
↓
转身去了竞争对手
这就是单体前端的日常。任何一个小改动,都可能波及整个系统。特别是当团队超过 20 人的时候,这种问题就会成倍增加。
而且,人员流动也受影响。新员工入职,要克隆一个 50GB 的仓库,装依赖要 20 分钟,第一次启动项目要 15 分钟。爽吗?不爽。
现代架构的解决方案是 Monorepo + 模块化(使用 Nx 或 Turborepo):
前端项目结构:
root/
├── packages/
│ ├── common/ (共享组件、工具)
│ ├── features-checkout/ (独立特性,由一个团队拥有)
│ ├── features-products/ (独立特性,由另一个团队拥有)
│ └── features-account/ (独立特性)
├── nx.json
└── package.json
优势:
1. 各团队独立开发各自的特性模块
2. 构建系统只构建改动过的模块
3. 可以独立部署某个特性
4. 共享代码的变动会自动追踪依赖
5. 新员工可以只 clone 需要的模块
某家电商公司用这个方法重构后,单次部署时间从 45 分钟降到 8 分钟,新员工入职的前置时间从 4 小时降到 30 分钟。
看起来这些技术死于各种不同的原因,但如果你仔细看,它们全部犯了同一个错误:
CRA 慢是因为 Webpack 的构建流程冗长。Redux 慢是因为它强制全量更新检查。微前端慢是因为需要加载多个框架和协调开销。CSS-in-JS 慢是因为样式计算占用主线程。
这些工具的共同特点就是 向用户转嫁了开发的便利。开发者舒服了,用户的网站变卡了。
在互联网竞争日趋激烈的 2026 年,这笔账算不过来。**有公司因为采用了复杂的前端架构,导致首屏加载多花 2-3 秒,结果转化率下降了 28%**。一旦转化率下降,再牛逼的技术也没用。
这些技术都承诺让开发变简单,结果是让开发者的学习成本爆表。
Redux 的学习曲线是陡峭的。微前端需要你理解分布式系统。CSS-in-JS 需要你了解运行时的样式计算。
最终的结果是什么?
对比一下 Zustand 的学习成本:看 5 分钟的文档,写个例子,就能上手。对比 Tailwind:学习 20 个常用的 Utility Class,基本就能搞定 80% 的场景。
有多少团队,在选择技术的时候,问过这个问题:
"这个技术对真实用户的转化率、留存率、成本有什么影响?"
答案是:很少。
大多数团队的决策逻辑是:
但用户不关心你用的是 Redux 还是 Zustand。用户只关心:你的网站为什么这么慢?为什么买个东西还卡顿?
某些转向简单方案的公司,在性能改进后,数据是这样的:
这才是真正该关心的指标。
/* 原来需要 SASS */
$primary-color: #007bff;
$border-radius: 4px;
/* 现在用原生 CSS 就行 */
:root {
--primary-color: #007bff;
--border-radius: 4px;
}
CSS 现在支持变量、嵌套、计算。Sass 的主要优势已经不存在了。采用原生 CSS 的项目,在 2025 年增长了三分之一。
jQuery 在 2024 年还出现在 20% 的网站上。但问题是:这 20% 基本都是老项目,没人再用它做新项目了。
jQuery 就像那些老旧的企业系统,还在运行,但谁都不想碰。
// 你还在这样做?
module: {
rules: [
{
test: /\.jsx?$/,
exclude: /node_modules/,
use: {
loader: 'babel-loader',
options: {
presets: ['@babel/preset-react']
}
}
},
// ... 十多个类似的 rules
]
}
现在的年轻开发者遇到 Webpack 配置就懵。他们都在用 Vite(零配置)或 Turbopack(自动化配置)。
Vite 不是一个工具,它是一场范式转变。
它的核心理念很简单:别在开发阶段做的事,就留给浏览器去做。
CRA 的做法:
源代码 → Webpack 整体编译 → 一个大 bundle → 浏览器加载
Vite 的做法:
源代码 → 浏览器直接加载(利用 ES Module)
只在需要时,Vite 即时编译那个文件
结果是什么?启动时间从 45 秒变成 4 秒。改一个文件,HMR 热更新在 100ms 内完成。
// Zustand
import { create } from'zustand'
const useStore = create((set) => ({
count: 0,
increment: () =>set((state) => ({ count: state.count + 1 }))
}))
// 在组件里
function Counter() {
const count = useStore((state) => state.count)
const increment = useStore((state) => state.increment)
return<button onClick={increment}>{count}</button>
}
对比 Redux,代码量少 60%,但完全能用。
function Products() {
const { data, isLoading } = useQuery({
queryKey: ['products'],
queryFn: () => fetch('/api/products').then(r => r.json())
})
// ...
}
Redux 最痛苦的问题就是混在了服务端状态和客户端状态。React Query 彻底分离了这两个概念。
使用 Nx 或 Turborepo:
✓ 各团队独立开发
✓ 共享代码得到管理和追踪
✓ 增量构建(只构建改动过的部分)
✓ 可独立部署各模块
✗ 没有微前端的性能开销
三件套搭配使用,覆盖所有场景。
问自己这几个问题:
CRA → Vite 迁移:
周期:2-3 周
风险等级:低(完全兼容)
影响范围:只有构建流程
Redux → Zustand 迁移:
周期:按模块,每个模块 1-2 周
风险等级:中(需要测试每个模块)
影响范围:一个特性模块一个特性模块地做
CSS-in-JS → Tailwind 迁移:
周期:可以很长,新代码用 Tailwind,旧代码保留
风险等级:低(可以共存)
影响范围:逐步扩大覆盖面
// 每个新加入项目的依赖,问一下:
新依赖评分表:
- 是否是原生浏览器 API 的补充?(+10 分)
- 是否让代码行数增加超过 20%?(-10 分)
- 是否有显著的性能成本?(-15 分)
- 是否让新人学习成本增加?(-5 分)
- 是否被广泛使用(GitHub Stars > 10k)?(+5 分)
只有总分 > 0,才考虑加进来
别凭感觉。用真实数据说话:
// 埋点测量性能
const start = performance.now()
// 你的代码
const duration = performance.now() - start
console.log(`操作耗时:${duration}ms`)
// 跟踪关键业务指标
trackEvent('purchase', {
value: price,
firstContentfulPaint: xxx,
largestContentfulPaint: xxx
})
迁移前后,对比这些指标:
指标 | 前 | 后 | 目标改进 |
|---|---|---|---|
首屏加载时间 | -20% | ||
INP (交互延迟) | -30% | ||
页面大小 | -15% | ||
构建时间 | -40% | ||
新人上手时间 | -50% |
技术很迷人,但用户和企业真正关心的是两件事:
那些让开发者获得成就感但无意中增加了用户使用成本的技术,正在被企业重新评估。
相反,那些不需要开发者过度思考、却能为用户提供最好体验的技术,正在成为新的标准。
2026年的前端,追求的是:以最少的复杂性,换取最好的用户体验。
如果你的技术栈现在感觉有点"沉重",或许值得考虑是否有更简洁的选择。不是为了赶时髦,而是因为商业价值最终还是回到了用户体验这个基本点。
如果这篇文章让你有所启发,欢迎关注《前端达人》🎯
我们每周深入分析前端的最新动向、性能优化案例、以及那些真正能提升用户体验的技术实践。
点赞、分享、推荐给更多正在为技术选型苦恼的同学。