React:构建用户界面的JavaScript库

React:构建用户界面的JavaScript库


一、前言

如果你在2024年问一位前端开发者:"你最常用的框架是什么?"大概率会听到一个名字------React

自2013年由Facebook(现Meta)开源以来,React已经从一个"另类的UI库"成长为全球最流行的前端技术之一。它驱动着无数我们每天使用的产品:Facebook、Instagram、Netflix、Airbnb、Twitter(X)、Discord......几乎覆盖了互联网的半壁江山。

React 到底有什么魔力?它和 Vue、Angular 有什么不同?2024年的 React 生态又是什么样的?这篇文章将带你全面了解。


二、React 是什么

2.1 一句话定义

React 是一个用于构建用户界面的声明式、组件化的 JavaScript 库。

注意两个关键词:

  • 不是框架,是库:React 本身只负责"视图层"(View),不内置路由、状态管理、HTTP 请求等功能。这既是它的"缺点"(需要自己组合生态),也是它的优点(极致的灵活性)。
  • 声明式:你只需要描述"界面应该长什么样",React 负责高效地将其渲染出来,而不需要你手动操作 DOM。

2.2 核心理念

复制代码
┌─────────────────────────────────────────────┐
│            React 的三大核心理念              │
├─────────────────────────────────────────────┤
│                                             │
│  1. 声明式(Declarative)                    │
│     → 用"状态"描述界面,而非手动操作 DOM      │
│                                             │
│  2. 组件化(Component-Based)                │
│     → 一切皆组件,像搭积木一样构建界面        │
│                                             │
│  3. 一次学习,随处编写(Learn Once,           │
│     Write Anywhere)                        │
│     → Web、移动端、桌面端、VR......              │
│                                             │
└─────────────────────────────────────────────┘

三、历史与发展

3.1 诞生背景

2011年前后,Facebook 的广告平台面临严重的前端维护问题:随着功能增多,传统的 jQuery + MVC 模式让代码变得难以预测------一个数据变化可能触发一连串级联更新,开发者很难追踪界面为什么变成了某个状态。

Facebook 工程师 Jordan Walke 受 PHP 组件框架 XHP 的启发,创造了 React 的原型。其核心思路非常大胆:

每次数据变化时,不要试图"修补"界面,而是重新描述整个界面应该长什么样,让框架帮你高效更新。

3.2 里程碑时间线

时间 事件
2011 Jordan Walke 创建 React 原型(内部名 FaxJS)
2013.05 React 在 JSConf US 正式开源
2015.03 React Native 发布,用 React 写原生移动应用
2015.04 React 0.13 引入 ES6 Class 组件写法
2016 React 15 发布,虚拟 DOM 重写
2017.09 React 16 发布,全新的 Fiber 架构
2019.02 React 16.8 发布,引入 Hooks(革命性更新)
2022.03 React 18 发布,引入并发渲染(Concurrent Rendering)
2024 React 19(RC)发布,Server Components 成熟、Actions API
至今 GitHub 230k+ Star,npm 周下载量 2500万+

React 开源时曾因 JSX 语法被社区广泛质疑("在 JS 里写 HTML?疯了吧!"),但事实证明它引领了前端开发范式的变革。


四、核心概念详解

4.1 JSX:JavaScript 的语法扩展

JSX 是 React 最直观的特征。它允许你在 JavaScript 中编写类似 HTML 的标记语法:

jsx 复制代码
function Welcome({ name }) {
  return <h1>你好,{name}!</h1>;
}

JSX 本质上不是 HTML,它会被编译为 JavaScript 函数调用。之所以使用它,是因为:

  • 视觉上直观,UI 结构一目了然
  • 拥有 JavaScript 的全部表达能力(条件判断、循环、变量等)
  • 编译时即可进行类型检查和语法校验

4.2 组件(Component)

组件是 React 的原子单元。一个 React 应用就是一棵组件树:

复制代码
         <App>
        /     \
   <Header>   <Main>
    /    \        \
<Logo> <Nav>    <Content>
                 /    \
           <Article> <Sidebar>

在现代 React 中,组件主要以函数组件的形式编写:

jsx 复制代码
function UserCard({ name, avatar, bio }) {
  return (
    <div className="user-card">
      <img src={avatar} alt={name} />
      <h2>{name}</h2>
      <p>{bio}</p>
    </div>
  );
}

组件的设计哲学是:每个组件只关心自己的事情,通过 Props 接收外部数据,通过组合的方式构建复杂界面。

4.3 Props 与 State

这是理解 React 数据流的关键:

复制代码
┌───────────────────────────────────────────────────┐
│                                                   │
│   Props(属性)              State(状态)         │
│   ─────────                 ──────────            │
│   • 从父组件传入             • 组件内部管理         │
│   • 只读,不可修改           • 可变,通过 set 更新  │
│   • 类似函数的"参数"         • 类似函数的"局部变量" │
│                                                   │
│   父组件 ──Props──→ 子组件                        │
│                     ↕ State                       │
│                   触发重新渲染                     │
│                                                   │
└───────────────────────────────────────────────────┘

单向数据流 是 React 的重要设计原则:数据永远从父组件流向子组件,子组件不能直接修改父组件的状态。这让数据变化的路径变得可预测、可追踪

4.4 Hooks:函数组件的超能力

2019 年 React 16.8 引入的 Hooks 是 React 历史上最重大的变革之一。它让函数组件拥有了状态管理、生命周期、副作用处理等全部能力,彻底取代了 Class 组件。

核心 Hooks 一览:

Hook 用途 一句话说明
useState 状态管理 给组件添加可变状态
useEffect 副作用处理 数据请求、订阅、DOM 操作
useContext 跨层级传值 避免 Props 逐层传递(Props Drilling)
useRef 引用 DOM / 持久化值 不触发重渲染的"记忆盒子"
useMemo 计算结果缓存 避免昂贵的重复计算
useCallback 函数引用缓存 避免子组件不必要的重渲染
useReducer 复杂状态管理 类似 Redux 的 reducer 模式

Hooks 还支持自定义 Hook------将一组逻辑抽离成可复用的函数,这是 React 中最优雅的代码复用方式:

jsx 复制代码
// 自定义 Hook:监听窗口宽度
function useWindowWidth() {
  const [width, setWidth] = useState(window.innerWidth);
  useEffect(() => {
    const handler = () => setWidth(window.innerWidth);
    window.addEventListener('resize', handler);
    return () => window.removeEventListener('resize', handler);
  }, []);
  return width;
}

// 在任何组件中使用
function MyComponent() {
  const width = useWindowWidth();
  return <p>窗口宽度:{width}px</p>;
}

4.5 虚拟 DOM 与 Reconciliation

React 性能的核心秘密在于虚拟 DOM(Virtual DOM)

复制代码
  状态变化
     │
     ▼
┌──────────┐     ┌──────────┐
│ 旧虚拟DOM │     │ 新虚拟DOM │
│  (树A)    │     │  (树B)    │
└─────┬────┘     └─────┬────┘
      │                │
      └────┬───────────┘
           │
           ▼
      ┌─────────┐
      │  Diff    │  ← 比较两棵树的差异
      │  算法    │
      └────┬────┘
           │
           ▼
     最小化 DOM 操作
     (只更新变化的部分)

流程

  1. 状态变化时,React 生成一棵新的虚拟 DOM 树(本质是 JS 对象)
  2. 与上一次的虚拟 DOM 树进行 Diff 比较
  3. 计算出最小的变更集
  4. 批量更新真实 DOM

直接操作真实 DOM 很慢,但 JS 对象的比较很快。虚拟 DOM 的价值在于:用 JS 计算的速度换取 DOM 操作的效率

4.6 Fiber 架构(React 16+)

React 16 引入的 Fiber 架构 彻底重写了 Reconciliation 引擎:

复制代码
  旧架构(Stack Reconciler)         新架构(Fiber Reconciler)
  ──────────────────────           ──────────────────────────
  同步渲染,一旦开始                  可中断的异步渲染
  就必须完成整棵树                    将工作拆分成小单元
  ↓                                ↓
  长任务阻塞主线程                    每个单元完成后检查:
  → 用户交互卡顿                      "有更高优先级的任务吗?"
  → 动画掉帧                          → 有:暂停当前,先处理紧急任务
                                      → 无:继续下一个单元

Fiber 架构使得 React 18 的并发特性成为可能:

  • 自动批处理:多次状态更新合并为一次渲染
  • Transitions:区分紧急更新(用户输入)和非紧急更新(搜索结果)
  • Suspense:优雅地处理异步加载状态

五、React 生态全景

React 本身是"小而美"的,但它周围形成了一个庞大而丰富的生态系统

复制代码
┌───────────────────────────────────────────────────────┐
│                   React 生态全景图                      │
├────────────┬──────────────────────────────────────────┤
│            │                                          │
│  全栈框架   │  Next.js ★     Remix       Gatsby       │
│            │  (App Router / Server Components)      │
├────────────┼──────────────────────────────────────────┤
│  状态管理   │  Zustand ★   Jotai   Redux Toolkit      │
│            │  Recoil      Valtio    MobX              │
├────────────┼──────────────────────────────────────────┤
│  数据请求   │  TanStack Query ★    SWR    tRPC        │
├────────────┼──────────────────────────────────────────┤
│  路由       │  React Router ★    TanStack Router      │
├────────────┼──────────────────────────────────────────┤
│  样式方案   │  Tailwind CSS ★   CSS Modules           │
│            │  styled-components   Emotion             │
├────────────┼──────────────────────────────────────────┤
│  UI 组件库  │  shadcn/ui ★  Ant Design  MUI           │
│            │  Radix UI     Chakra UI   Mantine        │
├────────────┼──────────────────────────────────────────┤
│  表单处理   │  React Hook Form ★    Formik            │
├────────────┼──────────────────────────────────────────┤
│  动画       │  Framer Motion ★  React Spring          │
├────────────┼──────────────────────────────────────────┤
│  构建工具   │  Vite ★       Turbopack    Webpack      │
├────────────┼──────────────────────────────────────────┤
│  类型安全   │  TypeScript ★   Zod(数据校验)          │
├────────────┼──────────────────────────────────────────┤
│  测试       │  Vitest   React Testing Library   Cypress│
├────────────┼──────────────────────────────────────────┤
│  移动端     │  React Native   Expo                    │
├────────────┼──────────────────────────────────────────┤
│  跨平台     │  Electron(桌面)  react-three-fiber(3D)│
│            │                                          │
└────────────┴──────────────────────────────────────────┘
                              ★ = 当前社区最主流选择

5.1 Next.js:React 的"官方推荐框架"

2023 年,React 官方文档做出了一个重大调整:推荐使用 Next.js 等全栈框架来创建新项目 ,而非传统的 create-react-app

Next.js 在 React 之上提供了:

能力 说明
文件系统路由 文件即路由,无需手动配置
多种渲染模式 SSR(服务端渲染)、SSG(静态生成)、ISR(增量静态再生成)
Server Components 组件在服务端渲染,减少客户端 JS 体积
Server Actions 在组件中直接调用服务端函数,无需写 API
内置优化 图片优化、字体优化、代码分割、预加载
中间件 边缘计算,请求级别的逻辑处理
API Routes 内置后端 API 能力

可以说,Next.js 已经从"React 框架"演变为一个全栈 Web 开发平台

5.2 状态管理的演进

React 的状态管理方案经历了一段有趣的演进历史:

复制代码
  2015          2018          2020          2023
   │             │             │             │
   ▼             ▼             ▼             ▼
 Redux        Context API    Recoil       Zustand
 (重量级)      (内置方案)     (原子化)      (极简主义)

  "所有状态     "简单场景      "原子化       "够用就好
   集中管理"    够用了"        状态管理"      回归简单"

2024 年的趋势

  • 小型项目:useState + useContext 就够了
  • 中型项目:Zustand(极简 API,上手快)
  • 大型项目:Redux ToolkitZustand
  • 服务端状态:TanStack Query(不要把服务端数据放在全局状态里!)

六、React 18/19 新特性

6.1 React 18:并发时代

React 18 于 2022 年发布,核心是并发渲染(Concurrent Rendering)

特性 说明
自动批处理 所有状态更新(包括 Promise、setTimeout 中的)自动合并为一次渲染
useTransition 将某些更新标记为"非紧急",保证用户输入的即时响应
useDeferredValue 延迟更新某个值,类似防抖但更智能
Suspense 增强 配合流式 SSR,渐进式展示页面内容
Streaming SSR 服务端可以流式发送 HTML,用户更早看到内容

6.2 React 19:服务端革新

React 19(2024年)带来了更深层的变革:

特性 说明
Server Components 组件默认在服务端运行,零客户端 JS,直接访问数据库
Server Actions 表单提交直接调用服务端函数,无需手写 API 端点
use() Hook 在组件中直接读取 Promise 和 Context
Actions 原生表单增强,支持 pending 状态和乐观更新
useOptimistic 内置乐观更新支持
Ref 作为 Prop 不再需要 forwardRef
文档元数据 组件中直接写 <title><meta> 等标签

Server Components 的意义

复制代码
传统 React(CSR)                    Server Components
─────────────────                  ─────────────────

浏览器                              服务器
  │                                  │
  │ 1. 下载 JS Bundle(很大)         │ 1. 服务端渲染组件
  │ 2. 执行 JS,发起 API 请求         │ 2. 直接访问数据库
  │ 3. 等待响应                       │ 3. 发送渲染好的 HTML
  │ 4. 渲染界面                       │    (JS Bundle 极小)
  │                                  │
  │ 用户等待时间:长                   │ 用户等待时间:短
  │ JS 体积:大                       │ JS 体积:小
  │ 首屏性能:差                      │ 首屏性能:优

七、React vs Vue vs Angular

这三者是前端"三大框架",经常被拿来比较:

维度 React Vue Angular
类型 UI 库 渐进式框架 完整框架
开发者 Meta(Facebook) 尤雨溪(独立开源) Google
语言 JavaScript / TypeScript JavaScript / TypeScript TypeScript(强制)
模板语法 JSX(JS 中写 HTML) SFC 模板(HTML 中写 JS) Angular 模板
状态管理 外部方案(Zustand、Redux等) Pinia(官方) NgRx / Signals
学习曲线 中等 较低 较高
灵活性 极高(自由选择生态) 中等(有官方推荐方案) 较低(全家桶强约束)
社区生态 最大 大(国内特别流行) 大(企业级项目多)
适用场景 大型应用、跨平台 中小型应用、快速开发 大型企业级应用
移动端 React Native 无官方方案 Ionic / NativeScript
GitHub Stars 230k+ 208k+ 96k+
就业市场 全球最多 国内很多,海外相对少 企业级需求稳定

怎么选?

  • 初学者/个人项目:Vue 上手最快
  • 追求职业发展/海外就业:React 机会最多
  • 大型企业级应用/喜欢强约束:Angular 开箱即用
  • 需要跨平台(Web + 移动端):React + React Native

三者都是优秀的选择,没有绝对的好坏。最重要的是深入掌握一个,了解其他


八、React 的设计哲学

理解 React 的设计哲学,比记住 API 更重要:

8.1 组合优于继承

React 从不推荐使用继承来复用组件逻辑。相反,它鼓励通过组合来构建复杂界面:

  • 通过 children 嵌套组件
  • 通过 Props 传递组件(Render Props 模式)
  • 通过 自定义 Hooks 复用逻辑

8.2 单向数据流

复制代码
      ┌─────────────────────────┐
      │                         │
      │   State(状态)          │
      │         │               │
      │         ▼               │
      │   View(视图/UI)        │
      │         │               │
      │         ▼               │
      │   Action(用户交互)     │
      │         │               │
      │         ▼               │
      │   更新 State            │
      │         │               │
      └─────────┘(循环)        │
    
      数据永远沿一个方向流动,
      让应用行为可预测、可调试。

8.3 不可变性(Immutability)

React 要求状态更新必须是不可变的------创建新对象,而非修改旧对象:

javascript 复制代码
// ❌ 错误:直接修改状态
state.items.push(newItem);

// ✅ 正确:创建新数组
setState({ items: [...state.items, newItem] });

这看似繁琐,实则好处巨大:

  • React 可以通过引用比较(===)快速判断数据是否变化
  • 支持时间旅行调试(undo/redo)
  • 避免意外的副作用

8.4 纯函数理念

React 组件本质上应该是纯函数

复制代码
相同的 Props + 相同的 State → 相同的 UI 输出

副作用(数据请求、DOM 操作、定时器等)被隔离在 useEffect 中,保持渲染逻辑的纯净。


九、快速上手

9.1 创建项目

bash 复制代码
# 方式一:使用 Vite(轻量、极速,推荐用于学习和 SPA)
npm create vite@latest my-app -- --template react-ts
cd my-app
npm install
npm run dev

# 方式二:使用 Next.js(推荐用于生产项目)
npx create-next-app@latest my-app
cd my-app
npm run dev

9.2 项目结构(Next.js App Router)

复制代码
my-app/
├── app/                    # 路由目录
│   ├── layout.tsx          # 根布局
│   ├── page.tsx            # 首页 (/)
│   ├── about/
│   │   └── page.tsx        # 关于页 (/about)
│   └── blog/
│       ├── page.tsx        # 博客列表 (/blog)
│       └── [slug]/
│           └── page.tsx    # 博客详情 (/blog/xxx)
├── components/             # 可复用组件
├── lib/                    # 工具函数
├── public/                 # 静态资源
├── package.json
├── tsconfig.json
└── next.config.js

9.3 开发者工具

  • React Developer Tools:浏览器扩展,查看组件树、Props、State、Hooks
  • React Strict Mode:开发模式下帮助发现潜在问题(双重渲染检测副作用)

十、React 的优势与挑战

10.1 优势

复制代码
┌───────────────────────────────────────────┐
│             React 的核心优势               │
├───────────────────────────────────────────┤
│                                           │
│  🌍 最大的社区与生态系统                    │
│     → 遇到问题几乎总能找到解决方案          │
│                                           │
│  🔧 极致的灵活性                           │
│     → 可以自由搭配最适合的工具              │
│                                           │
│  📱 真正的跨平台                           │
│     → React Native / Expo 写移动应用      │
│     → Electron 写桌面应用                  │
│                                           │
│  💼 就业市场最大                           │
│     → 全球前端岗位中 React 需求最多         │
│                                           │
│  🏢 Meta 持续投入                          │
│     → 核心团队全职开发,不会"弃坑"          │
│                                           │
│  📚 TypeScript 完美支持                    │
│     → 类型推导、泛型组件、类型安全          │
│                                           │
│  🚀 性能持续提升                           │
│     → Fiber、并发渲染、Server Components   │
│                                           │
└───────────────────────────────────────────┘

10.2 挑战与批评

挑战 说明
选择疲劳 生态丰富意味着每个环节都要做选择,新手容易迷茫
概念较多 Hooks 规则、闭包陷阱、useEffect 心智模型需要时间理解
变化较快 Class → Hooks → Server Components,需要持续学习
"只是一个库" 缺乏官方的路由、状态管理等一站式方案
SEO 需额外处理 纯客户端渲染不利于 SEO(需借助 Next.js 等方案)
包体积 与 Vue、Svelte 等相比,React 运行时体积较大

10.3 常见误区

误区 事实
"React 就是前端全部" React 只是视图层,完整的应用还需要路由、状态管理等
"虚拟 DOM 很快" 虚拟 DOM 不是银弹,有些场景原生 DOM 操作更快
"Hooks 替代了一切" Class 组件仍然可用,Error Boundary 目前仍需 Class
"学 React 就够了" HTML、CSS、JavaScript 基础才是根本
"React Native = React" 两者理念相同但 API 不同,RN 有自己的学习曲线

后记

2026年5月18日于上海,在claude opus 4.6辅助下完成。

相关推荐
行走的陀螺仪1 小时前
[特殊字符] JavaScript 设计模式完全指南:从入门到精通(含20种模式)
开发语言·javascript·设计模式
小陶来咯2 小时前
AI Agent 设计模式:ReAct 深度解析
人工智能·react.js·设计模式
胡萝卜术2 小时前
《JavaScript 语言精粹》第三章精读:对象——最基础也最容易被误解的基石
javascript
A南方故人2 小时前
vue3常用指令以及注册
前端·javascript·vue.js
韭菜炒大葱3 小时前
详解:useMemo 和useCallback
前端·react.js·面试
ZC跨境爬虫3 小时前
跟着 MDN 学 HTML day_62:(HTML调试与常见错误修复指南)
java·前端·javascript·ui·html·媒体
浮生望3 小时前
《JavaScript语言精粹》第3章:对象——JS世界的基石
javascript
学掌门3 小时前
JavaScript:为什么命名参数比位置参数更好
开发语言·javascript·ecmascript
赏金术士3 小时前
第二章:Compose入门—声明式UI编程
android·ui·kotlin·compose