什么是React
在 AI 产品出海的技术选型中,前端框架的选择直接影响开发效率、团队招聘和项目长期维护成本。根据 Stack Overflow 2025 年开发者调查,React 以约 40% 的使用率稳居前端框架榜首,远超 Angular(17%)和 Vue(16%)。无论是 Meta 旗下的 Instagram、WhatsApp Web,还是 Netflix、Airbnb、Shopify 等全球化产品,都在大规模使用 React 构建用户界面。
理解 React 是什么、它的核心概念如何运作、生态有哪些工具链,是 AI 产品出海团队在技术选型阶段必须掌握的基础知识。
React 是什么
React 是 Meta(前 Facebook)于 2013 年开源的一个 JavaScript UI 库(library),用于构建用户界面。注意这里用的是「库」而不是「框架」——React 本身只负责视图层(View Layer)的渲染,不包含路由、状态管理、HTTP 请求等功能,这些能力需要借助第三方库来补充。
React 的核心设计理念可以用一句话概括:声明式地描述 UI,React 负责高效地更新视图。
在传统的前端开发中,开发者需要手动操作 DOM 来更新界面——当数据变化时,用 document.getElementById 找到元素,再修改它的 innerHTML 或属性。这种方式在界面复杂时容易出错,也难以维护。React 改变了这种思路:你只需要告诉 React「当前数据是什么状态,UI 应该长什么样」,React 会自动计算差异并更新 DOM。
// 声明式:只需要描述 UI 应该长什么样
function Greeting({ name }) {
return <h1>你好,{name}!</h1>
}这段代码没有涉及任何 DOM 操作,只是描述了一个组件:接收一个 name 属性,渲染一段问候文字。React 会在底层负责将这段声明转换为真实的浏览器 DOM。
核心概念
React 的学习曲线相对平缓,但有几个核心概念需要理解清楚。
组件(Component)
组件是 React 最基本的构建单元。一个 React 应用就是由一个个组件嵌套组合而成的。组件本质上是一个 JavaScript 函数,接收输入(props),返回描述 UI 的 React 元素。
// 一个按钮组件
function Button({ label, onClick }) {
return <button onClick={onClick}>{label}</button>
}
// 使用组件
<Button label="提交" onClick={handleSubmit} />组件的核心价值在于复用性。一个设计良好的组件可以在不同页面、不同场景中反复使用,就像搭积木一样,用有限的积木块拼出复杂的结构。
JSX
JSX 是 React 引入的一种语法扩展,让你在 JavaScript 代码中直接编写类似 HTML 的标记。JSX 最终会被编译工具(如 Babel)转换为普通的 JavaScript 函数调用。
// JSX 写法
const element = <h1 className="title">Hello World</h1>
// 编译后等价于
const element = React.createElement('h1', { className: 'title' }, 'Hello World')JSX 看起来像 HTML,但有几个关键区别:
- 使用
className代替class(因为class是 JavaScript 保留字) - 使用
{}嵌入 JavaScript 表达式 - 标签必须闭合,单个标签要用
/>结尾,如<img /> - 事件处理使用驼峰命名,如
onClick而不是onclick
Props 与 State
Props 和 State 是 React 中管理数据的两个核心机制,它们决定了组件的渲染输出。
Props(属性) 是从父组件传递给子组件的数据,是只读的。子组件不能修改接收到的 props,这保证了数据流动的单向性和可预测性。
// 父组件传递 props
<UserCard name="张三" role="工程师" />
// 子组件接收并使用 props
function UserCard({ name, role }) {
return (
<div>
<p>姓名:{name}</p>
<p>角色:{role}</p>
</div>
)
}State(状态) 是组件内部管理的可变数据。当 state 发生变化时,React 会自动重新渲染组件,更新对应的 DOM。
import { useState } from 'react'
function Counter() {
const [count, setCount] = useState(0) // 初始化状态
return (
<div>
<p>点击次数:{count}</p>
<button onClick={() => setCount(count + 1)}>点击</button>
</div>
)
}每当用户点击按钮,setCount 会更新 count 的值,React 检测到 state 变化后自动重新渲染组件,页面上的数字也随之更新。
Hooks
Hooks 是 React 16.8(2019 年)引入的特性,让函数组件能够使用 state 和其他 React 特性(如生命周期)。在 Hooks 出现之前,只有 class 组件才能管理状态和响应生命周期事件。
常用的内置 Hooks 包括:
| Hook | 用途 | 示例场景 |
|---|---|---|
useState | 管理组件内部状态 | 表单输入、计数器、开关切换 |
useEffect | 处理副作用(数据请求、订阅、DOM 操作) | 组件挂载时请求 API 数据 |
useContext | 消费 Context 提供的共享数据 | 主题切换、用户登录态 |
useRef | 持有可变引用,不触发重新渲染 | 获取 DOM 元素引用、保存定时器 ID |
useMemo | 缓存计算结果,避免重复计算 | 复杂列表过滤、大数据排序 |
useCallback | 缓存函数引用,避免不必要的子组件重渲染 | 传递给子组件的回调函数 |
import { useState, useEffect } from 'react'
function UserProfile({ userId }) {
const [user, setUser] = useState(null)
const [loading, setLoading] = useState(true)
useEffect(() => {
// 副作用:组件挂载或 userId 变化时请求数据
setLoading(true)
fetch(`/api/users/${userId}`)
.then(res => res.json())
.then(data => {
setUser(data)
setLoading(false)
})
}, [userId]) // 依赖数组:userId 变化时重新执行
if (loading) return <p>加载中...</p>
return <p>用户名:{user.name}</p>
}React 的工作原理
理解 React 的工作原理,有助于写出高性能的 React 应用。
虚拟 DOM(Virtual DOM)
虚拟 DOM 是 React 实现高效更新的核心机制。虚拟 DOM 本质上是真实 DOM 的轻量级 JavaScript 对象副本。
当组件的 state 发生变化时,React 的更新流程如下:
- React 重新调用组件函数,生成一棵新的虚拟 DOM 树
- React 将新的虚拟 DOM 树与旧的虚拟 DOM 树进行对比(这个过程叫做「Diff」或「协调」Reconciliation)
- React 计算出两棵树之间的最小差异
- React 只将差异部分应用到真实 DOM 上
直接操作真实 DOM 是浏览器中性能开销较大的操作,因为每次 DOM 变更都可能触发浏览器的重排(Reflow)和重绘(Repaint)。虚拟 DOM 的价值在于:通过 JavaScript 层面的对比,把多次 DOM 变更合并为最少次数的真实 DOM 操作,从而提升渲染性能。
单向数据流
React 采用单向数据流(Unidirectional Data Flow):数据从父组件通过 props 流向子组件,子组件不能直接修改父组件的数据,只能通过回调函数通知父组件更新。
单向数据流的好处是数据流向清晰可追踪。当界面出现异常时,你可以沿着 props 的传递链路向上排查,快速定位数据的来源。相比之下,双向数据绑定虽然写法简洁,但在大型应用中容易导致数据流向混乱,难以调试。
React 生态
React 本身只是一个视图层库,实际构建一个完整的前端应用需要组合多个生态工具。以下是 React 生态中最常用的工具链。
路由
React 自身不包含路由功能,社区中最主流的方案是 React Router。它提供了声明式的路由配置,支持嵌套路由、动态路由、路由守卫等能力。
import { BrowserRouter, Routes, Route } from 'react-router-dom'
function App() {
return (
<BrowserRouter>
<Routes>
<Route path="/" element={<Home />} />
<Route path="/about" element={<About />} />
<Route path="/users/:id" element={<UserProfile />} />
</Routes>
</BrowserRouter>
)
}状态管理
对于小型应用,React 内置的 useState 和 useContext 通常就够用。当应用规模增大、共享状态增多时,可以引入第三方状态管理库:
- Zustand:轻量、API 简洁,近年来增长迅速,适合中小型项目
- Redux Toolkit:Redux 的官方简化版,适合大型应用和需要严格状态管理的场景
- Jotai:原子化状态管理,按最小粒度拆分状态,适合细粒度响应式更新
- Recoil:Meta 开发的原子化状态库,思路与 Jotai 类似
UI 组件库
使用成熟的 UI 组件库可以大幅加速开发,常见选择包括:
- shadcn/ui:当前最热门的选择,提供可复制的组件源码,高度可定制
- Ant Design:蚂蚁集团出品,企业级 UI 组件库,中后台项目常用
- MUI(Material UI):Google Material Design 风格的组件库
- Chakra UI:注重无障碍访问(Accessibility)的组件库
- Tailwind CSS:严格来说不是组件库,而是 Utility-First CSS 框架,常与 shadcn/ui 搭配使用
数据请求
- TanStack Query(原 React Query):服务端状态管理,处理缓存、重试、分页、乐观更新等
- SWR:Vercel 开发的数据请求 Hooks 库,轻量且易用
- Axios:HTTP 请求库,与 TanStack Query 或 SWR 搭配使用
框架级方案
如果不想从零组装工具链,可以选择基于 React 的全栈框架:
- Next.js:最主流的 React 全栈框架,支持 SSR、SSG、API Routes、App Router,AI 产品出海项目的首选
- Remix:强调 Web 标准和渐进增强,由 Shopify 维护
- Gatsby:适合静态站点和内容驱动的网站
为什么 React 是前端主流选择
React 长期占据前端框架使用率榜首,背后有多方面原因。
庞大的社区与生态。React 拥有前端领域最大的开发者社区。GitHub 上 React 主仓库超过 23 万颗星,npm 周下载量数千万。这意味着你遇到的几乎任何问题,都能在 Stack Overflow、GitHub Issues 或社区博客中找到解答。丰富的第三方库和工具也让功能扩展变得容易。
就业市场需求旺盛。在全球主要招聘平台上,React 相关职位的数量远超 Vue 和 Angular。对于出海团队来说,选择 React 意味着更容易招到合适的开发者,降低人才招聘成本。
Meta 的持续投入。React 由 Meta 的专职工程团队维护,持续投入研发。从 Hooks(16.8)到 Concurrent Mode(18)再到 React Server Components(19),React 每隔一两年就会引入重要的架构级改进。这种持续演进的节奏保证了 React 不会停滞。
学习曲线友好。React 的核心 API 相对精简——函数组件、JSX、Hooks、条件渲染、列表渲染,掌握这些基本概念就能开始构建应用。相比 Angular 需要理解 TypeScript、装饰器、模块系统、依赖注入等一整套体系,React 的入门门槛明显更低。
跨平台能力。React 的学习成果可以复用到 React Native(移动端)、React Three Fiber(3D 图形)、Tauri / Electron(桌面应用)等平台。掌握 React 不仅限于 Web 前端,还能延伸到多端开发。
企业级验证。Netflix、Airbnb、Shopify、Uber、Dropbox、Discord 等公司在生产环境中大规模使用 React,证明了它在高流量、复杂业务场景下的可靠性和可扩展性。
三大框架对比
选择前端框架时,React、Vue、Angular 是最常被比较的三个选项。
| 维度 | React | Vue | Angular |
|---|---|---|---|
| 类型 | UI 库 | 渐进式框架 | 全功能框架 |
| 维护方 | Meta | 独立社区(尤雨溪创建) | |
| 模板语法 | JSX(JavaScript 扩展) | 模板(HTML 扩展) | 模板(HTML 扩展) |
| 学习曲线 | 中等(核心 API 精简,生态需自选) | 较低(文档友好,约定清晰) | 较高(概念多,体系完整) |
| 状态管理 | 自选(Zustand、Redux 等) | Pinia / Vuex | 内置 Services + RxJS |
| 路由 | 自选(React Router) | Vue Router(官方) | Angular Router(内置) |
| 类型支持 | 可选 TypeScript | 可选 TypeScript | 默认 TypeScript |
| 适用场景 | 各类规模项目,尤其大型 SPA | 中小型项目,渐进式接入 | 大型企业级应用 |
| GitHub Stars | ~230k | ~210k | ~98k |
| 2025 使用率 | ~40% | ~16% | ~17% |
核心概念对照
React 中的几个核心概念,在 Vue 和 Angular 中也有对应的实现方式。了解它们之间的对应关系,有助于在不同框架之间切换时快速适应。
| React 概念 | Vue 对应 | Angular 对应 | 说明 |
|---|---|---|---|
| 组件(Component) | 组件(Component) | 组件(Component) | 三者都以组件作为基本构建单元 |
| JSX | 模板(Template) | 模板(Template) | React 用 JS 写模板,Vue/Angular 用 HTML 扩展 |
| Props | Props | @Input() | 父向子传递数据 |
| State | ref() / reactive() | 属性 / Signal | 组件内部可变数据 |
| Hooks | Composables | Services / Directives | 逻辑复用机制 |
| Context | Provide / Inject | Services | 跨组件共享数据 |
| useEffect | watch / watchEffect | ngOnInit / ngOnChanges | 副作用处理 |
Props 与 State 对比
Props 和 State 是 React 中两种不同的数据来源,理解它们的区别是掌握 React 数据流的关键。
| 对比维度 | Props | State |
|---|---|---|
| 数据来源 | 父组件传入 | 组件内部定义 |
| 是否可修改 | 只读(子组件不能修改) | 可变(通过 setter 函数更新) |
| 更新触发 | 父组件重新渲染时更新 | 调用 setter 函数后触发重新渲染 |
| 初始值 | 由父组件决定 | 在 useState 中设置初始值 |
| 用途 | 配置组件行为、传递数据 | 管理组件内部交互状态 |
| 类比 | 函数的参数 | 函数内部的局部变量 |
function Toggle({ initialEnabled }) { // props:来自外部
const [enabled, setEnabled] = useState(initialEnabled) // state:内部管理
return (
<button onClick={() => setEnabled(!enabled)}>
{enabled ? '已开启' : '已关闭'}
</button>
)
}Hooks 类型对照
Hooks 是现代 React 的核心。不同类型的 Hooks 解决不同的问题,了解它们的分类和用途有助于在实际开发中选择合适的 Hook。
| Hook 类型 | 代表 Hook | 用途 | 注意事项 |
|---|---|---|---|
| 状态管理 | useState, useReducer | 管理组件内部可变数据 | useReducer 适合复杂状态逻辑 |
| 副作用处理 | useEffect | 数据请求、订阅、手动 DOM 操作 | 注意依赖数组,避免无限循环 |
| 上下文消费 | useContext | 读取 Context 提供的共享数据 | 适合全局主题、用户信息等 |
| 引用 | useRef | 获取 DOM 引用或保存可变值 | 修改 ref.current 不触发重渲染 |
| 性能优化 | useMemo, useCallback | 缓存计算结果或函数引用 | 不要过度使用,先测量再优化 |
| 自定义 Hook | useXxx | 封装可复用的状态逻辑 | 命名必须以 use 开头 |
实际案例
案例一:Instagram Web
Instagram 是全球最早大规模采用 React 的产品之一。早在 2014 年,Instagram 就将 Web 前端迁移到 React,团队在工程博客中写道:「React 让我们在构建复杂 UI 时能保持代码的可预测性。」Instagram Web 的 Feed 流、Stories、评论系统、消息功能等核心模块都使用 React 构建,利用组件化思想将复杂的社交界面拆解为可维护的独立模块。
案例二:Shopify 商家后台
Shopify 是全球领先的电商 SaaS 平台,其商家后台(Shopify Admin)完全使用 React 构建。Shopify 团队不仅大量使用 React,还开源了 Polaris 设计系统和 React 组件库,供生态内的开发者构建风格一致的 Shopify 应用。Shopify 选择 React 的核心理由是:组件化开发效率高、生态工具丰富、招聘市场上 React 开发者供给充足。
案例三:Notion
Notion 是一款全球化的协作工具,集成了文档、知识库、项目管理等功能。Notion 的前端基于 React 构建,利用 React 的组件化能力将编辑器、数据库视图、侧边栏、评论等复杂交互模块拆解为独立组件。Notion 的块编辑器(Block Editor)就是典型的 React 组件化设计——每个内容块(文本、表格、图片、代码)都是独立的 React 组件,可以拖拽、嵌套和自由组合。
检查清单
在项目中引入 React 之前,可以对照以下清单确认准备情况:
- Node.js 环境就绪:确认本地已安装 Node.js 20+ 和 pnpm / npm
- 构建工具选择:决定使用 Vite(轻量快速)还是 Next.js(全栈框架)
- TypeScript 配置:React 项目强烈建议使用 TypeScript,提前配置
tsconfig.json - 代码规范工具:配置 ESLint 和 Prettier(或 Biome),保证团队代码风格一致
- 路由方案确定:纯 SPA 选 React Router,需要 SSR/SEO 选 Next.js
- 状态管理方案:小项目用
useState+useContext,中型项目考虑 Zustand,大型项目评估 Redux Toolkit - UI 组件库选型:根据设计风格选择 shadcn/ui、Ant Design 或 MUI
- 数据请求方案:评估 TanStack Query 或 SWR 的适用性
- 目录结构规划:按功能模块组织
components/、hooks/、utils/、pages/或features/ - 测试策略:确定单元测试(Vitest)和 E2E 测试(Playwright)的覆盖范围
- 性能监控计划:准备 React DevTools Profiler 用于开发期性能分析
- 国际化支持:出海项目提前规划 i18n 方案(如 react-i18next 或 next-intl)
小结
React 是目前使用最广泛的前端 UI 库,它的声明式编程模型、组件化架构和虚拟 DOM 机制让构建复杂用户界面变得高效且可维护。对于 AI 产品出海团队来说,React 拥有庞大的社区生态、丰富的工具链、旺盛的就业市场需求和经过大规模产品验证的可靠性,是前端技术选型中值得优先考虑的方案。
掌握 React 的核心概念——组件、JSX、Props、State 和 Hooks——是学习 React 的第一步。在此基础上,再根据项目规模选择合适的路由、状态管理和 UI 组件库,就能搭建出一个完整的 React 应用。
参考资料
- React 官方文档 — React 最新的官方文档,包含交互式教程和 API 参考
- React 中文文档 — 官方中文版的快速入门指南
- MDN — React 入门 — Mozilla 开发者网络的 React 入门教程
- Instagram 工程博客 — React at Instagram — Instagram 团队分享的大规模采用 React 的实践经验
- Shopify Polaris — Shopify 开源的 React 组件库和设计系统
- State of JavaScript 2025 — Front-end Frameworks — 2025 年前端框架使用情况和开发者偏好调查
- Stack Overflow Developer Survey 2025 — 全球开发者调查,包含框架使用率数据
- Next.js 官方文档 — 基于 React 的全栈框架,AI 产品出海项目的推荐选择