生态
React 本身专注 UI 层;路由、状态、数据请求、样式等由社区库补充。见 状态管理、工程化。
核心概念
React 的哲学是**「小核心 + 自由生态」:官方只提供组件模型、Hooks、并发渲染这套核心机制,路由、全局状态、表单、数据请求全部交给社区。好处是团队可以按需组合最合适的工具,代价是新项目需要做大量选型决策**,不同项目之间技术栈差异可能很大。
常用库(2024+ 主流)
| 领域 | 库 | 说明 |
|---|---|---|
| 路由 | React Router | SPA 客户端路由 |
| 服务端状态 | TanStack Query | 请求缓存、重试、失效 |
| 客户端全局状态 | Redux Toolkit、Zustand | 见 state 章节 |
| 表单 | React Hook Form | 非受控为主、性能好 |
| 样式 | CSS Modules、Tailwind、CSS-in-JS 各库 | 按团队规范选型 |
| 动画 | Motion(原 Framer Motion) | 声明式动画 |
| 表格/虚拟列表 | TanStack Table / Virtual | 无头 UI + 虚拟化 |
| 元框架 | Next.js、React Router v7(Framework Mode) | SSR、路由、数据加载;Remix 已并入 React Router v7,不再是独立框架 |
| 表单校验 | Zod | 常与 React Hook Form 搭配做 schema 校验 |
| 国际化 | react-i18next | 社区事实标准 |
示例:TanStack Query 处理服务端状态
import { useQuery } from "@tanstack/react-query";
function UserProfile({ userId }: { userId: string }) {
const { data, isPending, error } = useQuery({
queryKey: ["user", userId],
queryFn: () => fetch(`/api/users/${userId}`).then((r) => r.json()),
});
if (isPending) return <p>加载中…</p>;
if (error) return <p>加载失败</p>;
return <p>{data.name}</p>;
}
TanStack Query 自动处理缓存、重试、后台重新验证、竞态请求取消等,比手写 useEffect + useState 更省心,也避免了Effect 一节中提到的「服务端数据缓存不适合手写 Effect」问题。
UI 组件库
Ant Design、MUI、Radix + shadcn/ui 等;选型看设计语言、可访问性、包体积与 Tree Shaking 支持。
| 库 | 特点 |
|---|---|
| Ant Design | 企业中后台常用,组件齐全、设计语言统一 |
| MUI | Material Design 风格,生态成熟 |
| Radix UI + shadcn/ui | 无样式行为组件 + 可复制粘贴的样式方案,定制自由度高 |
| Chakra UI | 主题化友好,API 简洁 |
shadcn/ui 与传统组件库不同:它不是 npm 依赖,而是把组件源码生成到你的项目里,方便深度定制但也意味着升级需要手动同步。
开发工具
- ESLint
eslint-plugin-react-hooks:强制 Hooks 规则(依赖数组完整性、条件调用检测等)。 - React DevTools:组件树与 Profiler。
- TypeScript:见 typescript。
- Storybook:组件独立开发与可视化文档。
与 Vue 生态对照(简表)
| 能力 | React | Vue |
|---|---|---|
| 官方元框架 | 无(社区 Next 等) | Nuxt |
| 官方路由 | 无(React Router) | Vue Router |
| 官方状态 | 无(Redux 等) | Pinia |
| 组件库风格 | 多为「行为 + 样式分离」(Radix) | 多为「开箱即用」(Element Plus) |
| 表单校验 | Zod + RHF 组合 | VeeValidate + Yup/Zod |
选型建议
- 新的中后台项目:
Vite + React Router + TanStack Query + Zustand(若需要全局状态)+ Ant Design/shadcn。 - 需要 SEO、混合渲染、服务端组件:直接上
Next.js(App Router),减少自己拼装路由和数据获取层的成本。 - 表单密集型系统:
React Hook Form + Zod,配合 UI 库的受控组件适配层。 - 团队对包体积、定制自由度要求高:
Radix + shadcn/ui优于「一次性引入整套设计语言」的组件库。
常见坑
| 现象 | 常见原因 | 处理 |
|---|---|---|
| 选了多个状态库混用,代码风格割裂 | 团队没有统一约定「什么状态放哪」 | 明确服务端状态用 TanStack Query,客户端全局状态用一种库 |
| Ant Design 按需引入后仍很大 | 全局样式或未做正确的 tree-shaking 配置 | 确认按组件导入方式与打包工具配置 |
| shadcn/ui 组件升级困难 | 组件代码已被复制进项目并可能被修改 | 升级前对比官方最新版本手动合并变更 |
| Hooks 规则报错但看起来没问题 | 条件语句里调用了 Hook,或依赖数组遗漏 | 严格遵循 Hooks 规则,交给 ESLint 插件把关 |
生态选型速查
| 需求 | 建议 |
|---|---|
| 快速搭建中后台 | Vite + Ant Design + React Router |
| SEO/内容站 | Next.js(App Router)或 Astro |
| 高度定制视觉 | Radix UI + shadcn/ui + Tailwind |
| 复杂表单校验 | React Hook Form + Zod |
| 服务端数据密集型应用 | TanStack Query(缓存/重试/失效) |
延伸阅读
- 状态管理:客户端/服务端状态选型细节
- 工程化:Vite/Next.js 项目搭建
- Effect 与副作用:为何服务端数据优先用 TanStack Query
参考文献
以下链接在编写时均可正常访问:
| 资料 | 说明 |
|---|---|
| React 官方:学习资源 | 中文 |
| Awesome React | 社区清单(英文) |
| npm trends | 下载量对比(选型参考) |
| TanStack Query | 服务端状态 |
| shadcn/ui | 组件方案 |
相关文章
渲染与协调
React 将组件渲染为虚拟 DOM 树,再协调(reconciliation)到浏览器 DOM。理解该过程有助于解释 key、memo 与性能优化。涵盖渲染流程、Fiber、startTransition、Suspense、最佳实践与常见坑。
工程化
新建 React 项目时,官方与社区主流工具为 Vite;全栈场景常用 Next.js。涵盖 Vite + React、Create React App 现状、Next.js、目录结构、环境变量、部署、最佳实践与常见坑。
TypeScript
React 官方推荐 TypeScript。类型主要落在 Props、事件、Ref 与 Hooks 返回值上。见 组件。
测试
React 组件测试推荐 React Testing Library(RTL):从用户可见行为断言,而非实现细节。运行器常用 Vitest 或 Jest。涵盖安装配置、查询优先级、异步测试、Mock 网络请求、最佳实践与常见坑。
构建与分包
通过代码分割与构建配置减小首屏 JavaScript 体积。涵盖 React.lazy/Suspense、路由级分割、Tree Shaking、Vite 生产构建、体积分析、最佳实践与常见坑。运行时优化见 runtime。
Effect 与副作用
useEffect 用于在组件渲染后执行与外部系统同步的逻辑(请求、订阅、手动改 DOM 等)。涵盖基本用法、依赖数组、适用/不适用场景、useLayoutEffect、最佳实践与常见坑。
Series
react
5 / 16