Elytra
网站

前端框架的兴衰:为什么 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—2012Backbone、Knockout、AngularJS、EmberSPA、数据绑定、应用架构
2013—2014React、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

技术使用比例当前定位
React41.5%使用规模领先的 UI 库
jQuery19.7%仍有大量既有网站和项目在使用
Vue17.2%成熟的渐进式 UI 框架
Angular16.0%成熟的完整应用框架
Svelte7.8%活跃的编译驱动 UI 框架
Astro6.2%内容网站和 Islands 架构
AngularJS6.0%已终止支持,但存量项目仍存在
SolidJS1.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 操作,也为组件模型提供统一的渲染语义。

但要区分三件事情:

  1. 组件重新执行:React 计算新的 UI 描述。
  2. DOM 提交:React 只把必要的变化应用到浏览器 DOM。
  3. 浏览器绘制:浏览器再完成布局、绘制和合成。

一次组件函数的重新执行,不等于把整个 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;开发者遇到问题时,也更容易找到现成的实践。

Loading diagram…

这就是网络效应(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 放进同一个层级比较。

Loading diagram…

Next.js 在 React 之上提供文件路由、服务端组件、数据获取与更多 Web 应用能力;Nuxt 与 SvelteKit 也分别建立在各自的 UI 技术之上。6

Astro 则强调 Islands(群岛)架构:以静态或服务端生成的 HTML 为主体,只让真正需要交互的部分加载客户端 JavaScript,而且这些交互组件可以使用 React、Vue、Svelte 等不同技术。11

因此,Astro 并不需要先「击败 React」才能成功。一个内容网站完全可以选择 Astro,并在少数交互区域使用 React。不同层级之间,既有竞争,也有组合关系。

4.5放在同一张表里看

技术主要特点常见取舍
ReactJavaScript/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,最有价值的不是记住它如今最流行,而是理解:一种技术如何从好的抽象,逐渐变成难以替代的生态。

注释

  1. AngularJS 官方文档,AngularJS API Documentation。官方明确注明 AngularJS 已于 2022 年 1 月结束支持;现代 Angular 是独立发展的后继架构。 ↩

  2. Stack Overflow,2026 Developer Survey — Web frameworks and technologies 与 Desired / Admired。相关问题受访者为 10,281 人;使用比例允许多选,Admired 指用过且希望继续使用的比例。本文引用的是 2026 年调查结果,并非全球网站部署份额。 ↩ ↩2

  3. React Documentation,Render and Commit。区分触发渲染、计算组件结果与提交 DOM 更新,支持本文对重新执行组件并不等于重建 DOM 的解释。 ↩

  4. Pete Hunt / React Blog,2013,Why did we build React?。React 早期的官方自述,强调可组合 UI 组件、JavaScript 与模板语法的取舍,以及响应数据变化的设计目标。 ↩ ↩2

  5. SolidJS Documentation,Fine-grained reactivity。说明信号依赖追踪与针对特定 UI 绑定执行更新的方式。 ↩ ↩2

  6. Next.js Documentation,App Router 与 Server and Client Components。说明 React 应用框架的路由、服务端组件、客户端交互及相应边界。 ↩ ↩2 ↩3

  7. React Native,官方介绍。说明 React Native 使用 React 编程理念开发 Android/iOS 原生应用,以及与 Web DOM 渲染的区别。 ↩

  8. Vue Documentation,Reactivity Fundamentals。说明 Vue 3 的响应式状态、ref、reactive 与 SFC 中的用法。 ↩

  9. Angular Documentation,What is Angular?。介绍 Angular 的依赖注入、Signals、路由、表单和服务端渲染等官方能力;具体功能随 Angular 版本演进。 ↩

  10. Svelte Documentation,Overview。官方介绍 Svelte 编译器将声明式组件转换为优化后的 JavaScript,并区分 Svelte 与 SvelteKit。 ↩

  11. Astro Documentation,Islands Architecture。介绍静态 HTML 与按需激活的客户端组件,以及对 React、Vue、Svelte 等 UI 技术的支持。 ↩

  12. React Documentation,Synchronizing with Effects 与 You Might Not Need an Effect。官方将 Effects 定位为与外部系统同步的机制,并建议避免不必要的状态派生 Effect。 ↩

  13. React Team,2025-10-07,React Compiler v1.0。官方稳定版公告,说明构建时自动记忆化的能力及其适用边界。 ↩

CONTINUE EXPLORING

沿着这篇文章继续

在地图中查看

On this page