前端框架的兴衰:为什么 React 成为主流?
从 jQuery、AngularJS 到 React、Vue、Svelte 与 Astro:回顾现代前端的演变,解释 React 的技术创新、历史时机与生态网络效应,以及它领先之后的代价。
十多年前,前端开发者谈论的还是 jQuery、Backbone、AngularJS;今天,React 几乎成了现代前端开发绕不开的名字。但 Vue 更容易上手,Angular 的工程体系更完整,Svelte 和 SolidJS 有不同的响应式模型,Astro 甚至试图让内容网站少用 JavaScript。React 究竟强在哪里,为什么最后是它取得了最大规模的生态优势?
这个问题很容易被回答成一场性能竞赛:某个框架更快、更轻,因而获胜。但软件技术的历史并不是这样运行的。一个框架首先要提出适合时代的问题解法,然后让足够多的开发者、工具和企业围绕它持续投入;当生态形成之后,技术选型就不再只是框架 API 之间的比较。
本文的基本判断
React 的领先主要是采用规模和生态意义上的领先,而不是每项技术指标上的全面胜利。 其早期组件模型与声明式开发体验为普及创造条件;时机、产品实践、工具生态和网络效应,则把这种先发优势放大成长期地位。
一、前端框架的兴衰
1.1从 DOM 操作到单页应用
早期网页以服务端生成 HTML 为主,JavaScript 常用于表单校验、动画和局部交互。随着浏览器能力提高,页面开始承担越来越多的应用逻辑,而原生 DOM API、浏览器兼容性和事件处理也暴露出维护成本。
jQuery(2006) 正是在这个背景下流行起来的。它把 DOM 查询、事件绑定、动画和 Ajax 封装成较一致的 API,让开发者不必为每个浏览器反复处理细节。但 jQuery 更接近一个 DOM 操作工具箱:当一个页面需要维护复杂的应用状态时,开发者仍要自己组织数据与界面之间的关系。
2010 年前后,Backbone.js、Knockout.js、AngularJS、Ember.js 等技术尝试解决这个更大的问题:如何构建一个长期运行、能够响应数据变化的浏览器应用?它们分别强调模型与视图分离、数据绑定、依赖注入、路由和约定式架构。单页应用(SPA)由此逐渐成熟。
现代前端的竞争焦点也发生了迁移:从「怎样更方便地修改 DOM」,变成「怎样让 UI 随状态变化而可靠地更新,并让大型界面保持可维护」。
1.2组件化时代与后来者
| 大致时间 | 代表技术 | 主要方向 |
|---|---|---|
| 2006 前后 | jQuery、Dojo、Ext JS | 封装浏览器差异、DOM 与交互 |
| 2010—2012 | Backbone、Knockout、AngularJS、Ember | SPA、数据绑定、应用架构 |
| 2013—2014 | React、Vue | 声明式组件、组合复用、渐进式采用 |
| 2016 前后 | Angular(2+)、Svelte | 完整应用框架、编译驱动的 UI |
| 2019 年以来 | SolidJS、Astro、Qwik 等 | 细粒度响应式、按需加载、服务端优先 |
这条时间线有两个容易混淆的地方。
首先,AngularJS 与今天的 Angular 不是一次普通的版本升级。2016 年发布的 Angular 2 是一次重大重设计;AngularJS 后来继续维护了一段时间,并在 2022 年 1 月正式结束支持。今天的 Angular 仍然是活跃发展的框架。1
其次,Astro 与 React 不完全处在同一层。React、Vue、Svelte 主要提供 UI 组件与更新模型;Astro 面向整个内容网站的构建与交付,可以直接在页面里使用 React、Vue 或 Svelte 组件。把它们放在同一张「市场竞争排行榜」里,需要先认识这个边界。
1.3今天谁还活跃?怎样理解流行度
2026 年 Stack Overflow 开发者调查,在回答 Web 框架与技术问题的 10,281 名受访者中,报告过去一年使用情况如下。2
| 技术 | 使用比例 | 当前定位 |
|---|---|---|
| React | 41.5% | 使用规模领先的 UI 库 |
| jQuery | 19.7% | 仍有大量既有网站和项目在使用 |
| Vue | 17.2% | 成熟的渐进式 UI 框架 |
| Angular | 16.0% | 成熟的完整应用框架 |
| Svelte | 7.8% | 活跃的编译驱动 UI 框架 |
| Astro | 6.2% | 内容网站和 Islands 架构 |
| AngularJS | 6.0% | 已终止支持,但存量项目仍存在 |
| SolidJS | 1.5% | 细粒度响应式的探索者 |
这些数字是受访者可以多选的使用比例,并非全球网站份额,更不能简单相加。样本也存在受访者群体与技术兴趣的偏差。它们能说明 React 在这份调查中的采用优势,不能证明某个框架更快、更优秀,或其他框架已经「死亡」。
这里尤其值得注意 jQuery 与 AngularJS:停止引领新项目,不等于已经从互联网消失。 企业存量系统、历史依赖和维护成本,会让一代技术在失去话题热度后继续存在很长时间。
二、React 带来了什么?
2.1声明式 UI:从「怎样更新」到「应该显示什么」
考虑一个计数器。传统 DOM 编程需要在点击时修改数据,也要明确指出更新哪个节点:
let count = 0;
button.addEventListener("click", () => {
count++;
label.textContent = String(count);
});React 的思路是让组件描述状态对应的 UI:
import { useState } from "react";
function Counter() {
const [count, setCount] = useState(0);
return (
<button onClick={() => setCount(c => c + 1)}>
Count: {count}
</button>
);
}状态变化后,React 重新计算相关组件的渲染结果,再提交必要的 DOM 改动。开发者通常不需要亲自寻找某个标签并修改它。3
可以把这个思想抽象成:
状态(State) → 组件描述(UI) → 与当前界面对比 → 必要的更新或者写作 UI = f(State)。它不是严格的性能公式,而是一种编程模型:把界面的期望结果写成状态的函数。
当然,声明式数据绑定早就存在于其他框架中,React 并非凭空发明它。React 的突出之处,是把这一思路与一套可组合的组件抽象、JavaScript 表达式和明确的更新机制结合起来。React 团队在 2013 年的说明中就强调了可组合组件与不依赖传统模板语言的设计。4
2.2组件化:让复杂 UI 成为可以组合的零件
大型网站不是一个按钮,而是导航、编辑器、列表、弹窗、表格、筛选条件和交互状态组成的复杂系统。
React 允许将这些内容拆成带有输入(Props)、内部状态和渲染逻辑的组件。一个组件可以组合另一些组件;通用逻辑也可以被抽取和复用。这样做的收益不仅是少写重复代码,更重要的是减少不同界面区域之间的隐式耦合。
组件思想同样不是 React 独占。Vue、Angular 和其他框架也都有组件系统。但 React 将「组件即普通 JavaScript 函数(现代主流写法)」作为极重要的抽象,让框架更容易与已有的语言工具、测试方式和函数组合习惯结合。
2.3JSX:为什么 React 不坚持 HTML 模板?
React 选择 JSX,用接近标签的语法在 JavaScript 中描述 UI:
function Inventory({ items }) {
return (
<ul>
{items
.filter(item => item.count > 0)
.map(item => (
<li key={item.id}>{item.name}</li>
))}
</ul>
);
}条件、映射、函数与变量都来自 JavaScript 本身,不必为每种表达另设计模板指令。对于需要高度动态地组合界面的场景,这是一种很有吸引力的取舍。
但这不等于「JSX 比模板先进」。Vue 的单文件组件(SFC)把模板、逻辑和样式组织在同一文件中;编译器还能分析模板结构并做相应优化。两者真正不同的是抽象的边界:React 更倾向让 JavaScript 表达 UI,Vue 则保留了独立模板语法的可读性与编译空间。
2.4Virtual DOM:重要,但不是「React 一定更快」的理由
React 早期的一项核心设计,是先生成 UI 的内存描述,再由协调过程判断对真实界面需要执行哪些更新。这样既能隐藏很多手动 DOM 操作,也为组件模型提供统一的渲染语义。
但要区分三件事情:
- 组件重新执行:React 计算新的 UI 描述。
- DOM 提交:React 只把必要的变化应用到浏览器 DOM。
- 浏览器绘制:浏览器再完成布局、绘制和合成。
一次组件函数的重新执行,不等于把整个 DOM 删除重建;反过来,「用了 Virtual DOM」也不等于一定比直接、精确地更新 DOM 更快。Vue 有自己的虚拟 DOM 与编译优化,SolidJS 则利用细粒度依赖追踪更直接地更新目标节点。5
React 真正降低的是开发者维护 UI 一致性的复杂度,不能简单把它宣传成最快的 DOM 更新算法。
2.5小核心与组合式生态
React 长期将自己定位为构建 UI 的库,而不是一个包办所有应用决策的完整框架。路由、数据请求、服务端渲染、表单与状态方案等能力,可以通过外部生态组合。
这让 React 易于嵌入既有项目,也给社区留下了很大的创新空间;后来 Next.js 等技术逐渐把这些外围能力集成为更完整的应用方案。代价则是选型增多:两个 React 项目的工程组织、状态方案、路由和数据获取方式,未必完全相同。
三、为什么最终是 React 领先?
3.1历史窗口:在问题尚未定型时进入市场
技术的进入时机影响深远。React 于 2013 年公开推出时,大型浏览器应用已经需要复杂状态管理和复用,但各类 MVC、数据绑定与模板架构尚没有形成稳定共识。
React 没有尝试复制一个更完整的 MVC 框架,而是选择一个边界清晰的问题:如何把持续变化的 UI 拆成组件,并让它们可靠地更新。这使它的设计易于解释、传播和逐步引入。
Vue 在 2014 年进入这一领域,提供了另一种强调渐进式采用的体验;Angular 在 2016 年经历大规模重设计,带来了更一致但迁移成本也更高的新体系。它们并不是缺乏技术能力,而是面对了不同的时机、社区基础和迁移条件。
不能把 Angular 的迁移成本当成 React 胜出的唯一原因,也不能假定 React 从发布那天起就注定占据主导。历史解释需要考虑多种相互作用的因素,而非寻找一个单独的「决定性功能」。
3.2Facebook 的实践与可信度
React 并非只有演示代码的新项目。它由 Facebook(现 Meta)推动,在 Facebook、Instagram 等真实产品中接受了复杂交互场景的检验。团队可以不断改进实现,并向外部开发者提供应用实践与技术说明。4
这带来两类优势:一是工程可靠性的验证,二是采用风险的降低。企业选型时,不只问 API 好不好看,也会问框架有没有长期投入、真实的大规模使用经验,以及遇到问题后是否有人维护。
不过,大公司支持本身不保证成功。它只是让原本已经有吸引力的技术路线,更容易跨过信任和维护成本的门槛。
3.3从一个 UI 库到一片生态
React 的价值随后不再只来自核心包。组件库、状态管理方案、路由、开发工具、类型定义、教程和开发者知识共同积累;Next.js 把 React 延伸到完整的 Web 应用架构;React Native 又将相同的组件理念扩展到原生移动应用,实际渲染的是平台原生 UI,而不是浏览器 DOM。67
技术基础相通,意味着人才、库、经验与工具可以在更多场景之间复用。企业更容易招聘熟悉 React 的开发者;组件作者更有动力首先支持 React;开发者遇到问题时,也更容易找到现成的实践。
这就是网络效应(Network Effect):框架越多人采用,围绕它开发的配套资源越丰富;资源越丰富,后来者越有理由继续采用。
3.4路径依赖:为什么「更好的新框架」很难直接取代它
假设新框架在某个 benchmark 中更快,或者将一个组件从 30 行缩短到 15 行。对于尚未开始的个人项目,这种收益可能足以改变选择;对于已有数十万行前端代码、依赖大量组件库的团队,迁移意味着另一笔账:
- 既有代码、测试和内部工具是否需要改写?
- 复杂编辑器、表单、图表等第三方依赖有没有同等成熟的替代品?
- 团队熟悉的新旧技术差异会造成多少学习与维护成本?
- 未来若框架演化或维护停滞,谁来承担风险?
因此,新框架不能只证明「我更快」,还需要证明「迁移到我这里的整体长期收益,大于继续留在现有生态的成本」。
这是 React 的护城河,也是成熟软件技术共同的特征。它类似操作系统、编程语言和游戏引擎的长期竞争:兼容性、人才和内容生态本身就会成为产品价值的一部分。
技术优势与生态优势不是一回事
React 早期的设计创新帮助它得到关注;但解释其长期领先时,更有说服力的是:技术足够好,生态足够大,迁移成本又足够高。其中任何一项都不足以单独解释整个历史。
四、React 真的比其他框架更好吗?
4.1Vue:更直接的响应式体验
Vue 的组件同样是声明式的,但它强调对响应式依赖的追踪。Vue 3 的 ref、reactive 等 API 能让状态变化与依赖它的模板更新联系起来。8
<script setup>
import { ref } from "vue";
const count = ref(0);
</script>
<template>
<button @click="count++">
Count: {{ count }}
</button>
</template>这段写法中,状态、事件和模板的关系相当直观。Vue 的 SFC、Composition API 以及完整的官方生态,使它同时适合中小项目和复杂应用。它也支持 JSX、服务端渲染等方案,不能把 Vue 简化成「只能写模板的小框架」。
React 倾向通过组件函数重新执行来计算下一次 UI,Vue 则结合依赖追踪、模板编译与渲染优化。两者都能构建大型应用;哪种更清晰,取决于团队对代码组织与状态语义的偏好。
4.2Angular:以完整性换取一致性
Angular 提供比较统一的工程体系:路由、表单、依赖注入、CLI、服务端渲染等能力都有官方方案;现代 Angular 也使用 Signals 和编译优化,并非停留在 AngularJS 的旧式双向绑定时代。9
这适合需要长期协作、统一规范和明确架构约束的团队。相应代价是概念与框架约定较多,进入门槛和迁移路径也可能更重。
React 的灵活不必然优于 Angular 的完整:在团队层面,少做架构选择有时恰恰是一种效率。
4.3Svelte 与 SolidJS:重新思考更新的成本
Svelte 的重要思路是编译:把组件源代码在构建阶段转换成针对运行时优化的 JavaScript。它不是「完全没有运行时」,也不意味着所有场景都自动最快;真正的不同是把更多工作移到编译阶段完成。10
SolidJS 则以 Signals 等细粒度响应式机制追踪依赖,使状态变化可以更新特定的 UI 绑定,减少一些场景中重新执行整个组件的必要。5
它们提出的都是实质性的技术设计问题:能否在保留声明式开发体验的同时,让更新范围更精确、运行时工作更少?
但性能不能仅凭框架标签下结论。渲染任务、组件结构、启动与交互指标、服务端策略、代码体积,以及真实业务逻辑,都会改变最终结果。
4.4Astro、Next.js、Nuxt:先分清比较的层级
一个常见误解是把 Astro、Next.js、React 放进同一个层级比较。
Next.js 在 React 之上提供文件路由、服务端组件、数据获取与更多 Web 应用能力;Nuxt 与 SvelteKit 也分别建立在各自的 UI 技术之上。6
Astro 则强调 Islands(群岛)架构:以静态或服务端生成的 HTML 为主体,只让真正需要交互的部分加载客户端 JavaScript,而且这些交互组件可以使用 React、Vue、Svelte 等不同技术。11
因此,Astro 并不需要先「击败 React」才能成功。一个内容网站完全可以选择 Astro,并在少数交互区域使用 React。不同层级之间,既有竞争,也有组合关系。
4.5放在同一张表里看
| 技术 | 主要特点 | 常见取舍 |
|---|---|---|
| React | JavaScript/JSX 组件模型、巨大生态 | 状态与 Effect 语义需要理解,应用配套选型较多 |
| Vue | 渐进式、模板与响应式结合 | 与 React 的组件生态和人才市场有所差异 |
| Angular | 官方提供完整工程体系 | 约束较多,学习和组织成本相对更高 |
| Svelte | 编译驱动、简洁的组件开发体验 | 某些第三方集成与历史积累不如 React 丰富 |
| SolidJS | 细粒度响应式、针对性更新 | 社区和生态规模较小 |
| Astro | 内容网站、Islands、默认少客户端 JS | 并非以统一管理高度交互的 SPA 为唯一目标 |
比较的重点不该是选一个抽象意义上的「最佳框架」,而是判断哪种编程模型与哪套工具链最符合自己的项目。
还有一组很有意思的对照:在同一份 2026 Stack Overflow 调查里,React 的 Admired(用过并且还想继续使用)比例为 46.7%,Vue 为 47.2%,Svelte 为 59.4%,Astro 为 58.8%。2 这项指标既不是性能基准,也不等同于普遍满意度,但至少提醒我们:采用规模最大,并不意味着使用者的偏好最强。
五、胜出之后:React 的代价与未来
5.1成熟生态带来的历史包袱
一个框架被大量企业使用以后,就很难轻易推翻既有模型。React 需要兼顾旧代码、组件库、构建工具以及不同年代形成的最佳实践。
现代函数组件与 Hooks 在逻辑复用上很有价值,却也引入了新的认知成本:组件重新执行与闭包之间的关系、useEffect 的依赖、状态同步的边界,以及避免不必要渲染时的优化策略。
这里需要谨慎:Effect 不是 React 用来处理所有状态变化的通用事件系统。官方文档强调,它主要用于同步组件与外部系统;如果只是从现有 Props 或 State 派生数据,很多情况下根本不需要 Effect。12
问题并非 React 「做不到」,而是随着能力积累,开发者需要理解的概念也在增长。与此同时,Vue、Angular、Svelte 都在发展自己的响应式、编译与工程实践,并不存在一个静止不变的比较对象。
5.2React 也在借鉴编译时代的思想
React Compiler 1.0 于 2025 年 10 月 7 日发布,能够在构建阶段分析组件和 Hooks,并自动实施部分记忆化优化,减少手工维护 useMemo、useCallback 的负担。13
这说明 React 自身也在调整:既保留现有组件模型与生态兼容性,又试图用编译器降低部分运行时成本。
不过,React Compiler 的自动记忆化不等于把 React 变成了 SolidJS 的细粒度信号系统,也不意味着 React 的更新机制已经与 Svelte 完全相同。方向可能相互影响,架构却不必趋同。
5.3从浏览器 UI 到服务器与客户端的边界
传统 SPA 把大量渲染和应用逻辑放在浏览器里。之后 SSR、静态生成、Hydration、按需加载等手段不断发展;React Server Components 与 Next.js 这样的方案,又让一部分组件能够在服务器环境运行,减少客户端承担的工作。6
Astro 则从内容网站的特征出发,把「少发 JavaScript」作为默认策略。它们在不同层面上回应同一个问题:哪些工作真的必须由用户的浏览器执行?
这可能比继续争论「Virtual DOM 快不快」更能解释近年的前端演进。决定用户体验的除了 DOM 更新,还有网络传输、JavaScript 解析执行、数据请求、缓存、服务端等待与交互延迟。
5.4AI 会改变这场竞争吗?
AI 辅助编程会降低学习 API、编写模板代码与迁移局部逻辑的成本;从这个角度看,它可能让小生态框架更容易被尝试。
但 AI 也可能强化现有生态。成熟框架有更多公开示例、文档、集成方案和经过检验的工程实践;在实际项目里,部署、测试、兼容和长期维护依然不能靠代码生成本身解决。
目前还不能由此断言 AI 一定会削弱或巩固 React 的领先。这是一个值得观察的变量,而非已有定论。
六、结语:技术最优不等于生态胜出
如果今天为新项目做选择,我会先看项目的性质,而不是先看哪个框架在排行榜上领先。
| 项目需求 | 可以优先评估 |
|---|---|
| 高交互 Web 应用、需要大量成熟集成 | React / Next.js |
| 强调直观、渐进式开发与响应式体验 | Vue / Nuxt |
| 大型团队希望使用统一工程规范 | Angular |
| 希望尝试编译驱动与简洁组件模型 | Svelte / SvelteKit |
| 更重视细粒度更新的交互应用 | SolidJS |
| 博客、文档、营销与内容网站 | Astro,以及适用时的 Next.js |
React 为什么胜出?因为它在合适的时期提供了有吸引力的抽象,得到大型真实项目的检验,又通过工具、社区、企业与跨平台生态形成了自我强化的网络效应。它领先的事实,并不能推出 JSX 一定比模板好、Virtual DOM 一定更快,更不能推出其他框架已经没有研究价值。
反过来说,React 的成功也有代价:今天维系庞大生态的兼容性和路径依赖,同样限制了彻底重新设计的自由。后来者在不同方向上探索更精确的更新、更少的客户端 JavaScript、更明确的工程约束;React 也在持续吸收这些思路。
软件技术的发展很少是一场以「最后只剩一个赢家」收场的淘汰赛。市场可以形成领先者,设计思想却仍然保持竞争。 理解 React,最有价值的不是记住它如今最流行,而是理解:一种技术如何从好的抽象,逐渐变成难以替代的生态。
注释
-
AngularJS 官方文档,AngularJS API Documentation。官方明确注明 AngularJS 已于 2022 年 1 月结束支持;现代 Angular 是独立发展的后继架构。 ↩
-
Stack Overflow,2026 Developer Survey — Web frameworks and technologies 与 Desired / Admired。相关问题受访者为 10,281 人;使用比例允许多选,Admired 指用过且希望继续使用的比例。本文引用的是 2026 年调查结果,并非全球网站部署份额。 ↩ ↩2
-
React Documentation,Render and Commit。区分触发渲染、计算组件结果与提交 DOM 更新,支持本文对重新执行组件并不等于重建 DOM 的解释。 ↩
-
Pete Hunt / React Blog,2013,Why did we build React?。React 早期的官方自述,强调可组合 UI 组件、JavaScript 与模板语法的取舍,以及响应数据变化的设计目标。 ↩ ↩2
-
SolidJS Documentation,Fine-grained reactivity。说明信号依赖追踪与针对特定 UI 绑定执行更新的方式。 ↩ ↩2
-
Next.js Documentation,App Router 与 Server and Client Components。说明 React 应用框架的路由、服务端组件、客户端交互及相应边界。 ↩ ↩2 ↩3
-
React Native,官方介绍。说明 React Native 使用 React 编程理念开发 Android/iOS 原生应用,以及与 Web DOM 渲染的区别。 ↩
-
Vue Documentation,Reactivity Fundamentals。说明 Vue 3 的响应式状态、
ref、reactive与 SFC 中的用法。 ↩ -
Angular Documentation,What is Angular?。介绍 Angular 的依赖注入、Signals、路由、表单和服务端渲染等官方能力;具体功能随 Angular 版本演进。 ↩
-
Svelte Documentation,Overview。官方介绍 Svelte 编译器将声明式组件转换为优化后的 JavaScript,并区分 Svelte 与 SvelteKit。 ↩
-
Astro Documentation,Islands Architecture。介绍静态 HTML 与按需激活的客户端组件,以及对 React、Vue、Svelte 等 UI 技术的支持。 ↩
-
React Documentation,Synchronizing with Effects 与 You Might Not Need an Effect。官方将 Effects 定位为与外部系统同步的机制,并建议避免不必要的状态派生 Effect。 ↩
-
React Team,2025-10-07,React Compiler v1.0。官方稳定版公告,说明构建时自动记忆化的能力及其适用边界。 ↩
CONTINUE EXPLORING