CalcGuide · 技术博客主页 / 一页纸学习计划
🟠

React 应用开发:从组件到 SSR 与测试

分类:前端与客户端 · 路径:docs/topics/react-app/README.md

#react#hooks#state#routing#ssr

用 6~10 周从组件到能独立搭建带路由、状态管理、SSR、测试的可生产 React 应用

父主题

顶层主题

子主题(5)

React 应用开发:从组件到 SSR 与测试

0. 元信息

1. 学习路线

组件与 JSX
  → Hooks 与状态管理
  → 路由与数据获取
  → 样式与构建工具链
  → 测试、可观测与可访问性
  → SSR / SSG / RSC 与生产部署
  → 综合项目:完整电商 SPA + 配套 RSC 重构

每一步都建立在前一步的稳定结构上;不要跳级把 RSC 提前到没掌握 Suspense 与数据流之前。

2. 阶段周数分配(6~10 周,量力而行)

阶段6 周方案10 周方案备注
1. 组件与 JSX11.5props、列表 key、lift state up、Refs、Portal
2. Hooks 与状态1.52.5useState/Effect/Memo/Callback/Ref/Reducer/Context + useTransition/useDeferredValue + Context/Zustand/Jotai/RTK/TanStack Query
3. 路由与数据11.5React Router、TanStack Router、data loaders、Suspense、error boundary
4. 样式与构建0.751.5CSS Modules、Tailwind、Vanilla Extract、Vite、SWC、Turbopack、ESLint、Prettier
5. 测试与可观测11.5Vitest、RTL、Playwright、MSW、Sentry、Web Vitals、OpenTelemetry、a11y
6. SSR/RSC 与部署0.51Next.js / Remix / Astro、hydration、RSC、Server Actions、edge runtime
7. 综合项目0.250.5必做:完整电商 SPA;可选:RSC 重构

6 周方案对应高强度、每天投入;10 周方案对应稳扎稳打、留出“踩坑-复盘-改写”时间。选 6 周时建议每周留 1 天只做代码复盘。

3. 七阶段表

阶段核心知识实践产出可观察学会标准
1. 组件与 JSX函数组件、JSX 规则、props/state、列表与 key、lift state up、组合、ref、Portal、uncontrolled vs controlledTodoMVC(无依赖、纯函数组件)不看文档能写出受控表单、能解释为什么列表要 key、能解释为什么 setState 是异步批处理
2. Hooks 与状态useState/useEffect/useMemo/useCallback/useRef/useReducer/useContext/useTransition/useDeferredValue;Context、Zustand、Jotai、Redux Toolkit、TanStack Query商品列表页(多 store、缓存、乐观更新)能解释闭包陷阱、stale state;能选择合适的 store;能讲清 RQ 的 staleTime / gcTime
3. 路由与数据React Router v6/v7、TanStack Router、loader/action、search params、code split、lazy、Suspense、ErrorBoundary、route guards登录 + 商品详情 + 列表(嵌套路由)能解释 data router 与组件渲染顺序;能处理 401/403/404 重定向
4. 样式与构建CSS Modules、Tailwind、Vanilla Extract、shadcn/ui;Vite、esbuild、SWC、Turbopack、pnpm workspaces、Turborepo;ESLint、Prettier、tsc、TypeScript JSX多页面 demo、设计系统起步能解释 RSC 为何需要 bundler-level 改造;能调通 monorepo 构建
5. 测试与可观测Vitest / Jest、React Testing Library、Playwright、MSW;Sentry、Web Vitals、OpenTelemetry、React DevTools、Profiler;a11y / ARIA / 键盘导航端到端:登录→搜索→加购→结账单元 + 集成 + e2e 三层都过;Web Vitals LCP/INP/CLS 在 P75 达标
6. SSR / RSCNext.js App Router、Remix、Astro;hydration、RSC、Server Actions、streaming、partial prerendering、edge runtime把第 5 阶段 e2e 跑通到 prod build能解释为什么 client component 仍然需要 RSC;能定位 hydration mismatch
7. 综合项目选型、版本管理、CI、监控、复盘完整电商 SPA + 复盘报告第三方能按 README 启动;监控、a11y、性能指标全在

陷阱集中在三个:把 useEffect 当万能胶水、过早引入 Redux、把 SSR 当 SPA 升级版。每个阶段都对照检查。

4. 第一周任务

Day 1 约定:Node 22 LTS;pnpm 9;编辑器开启 TypeScript + ESLint 实时检查。所有 demo 起手用 pnpm create vite@latest my-app -- --template react-ts,避免一开始就选 Next.js 把概念叠在一起。命令跑通后写进 notes/day1.md

任务当天交付
Day 1装 pnpm/Node;用 Vite 起 react-ts 模板;打开 React DevTools;改 App.tsx 输出 hellonotes/day1.md、Vite 启动成功的截图或日志
Day 2写 3 个函数组件:Button / Card / Avatar;用 props 传值;用 children 传 JSX一个 storybook 风格的 demo.tsx(不强求真用 Storybook)
Day 3useState + 受控输入:写一个搜索框,输入即过滤列表;用 useDeferredValue 让输入更顺过滤可用的搜索页
Day 4列表与 key:写一个 100 项 todo 列表,key 用 id、不用 index;删 / 改 / 加都正常todo 列表 demo
Day 5状态提升:把选中态提升到父组件,两个子组件共享选中态在父、子各自更新
Day 6useRef + Portal:写一个 <Modal>,用 createPortal 挂到 body;用 ref 调 focus一个可 ESC 关闭的 modal
Day 7项目:用纯函数组件实现一个 TodoMVC 子集(增删改 + filter + 持久化 localStorage)。步骤 A 跑通最小;步骤 B 补全:空列表 / 超长标题 / 特殊字符 / 刷新恢复TodoMVC 源码 + notes/week1-day7.md

Day 7 步骤 A 只求 4 个功能:增、删、改状态、清空。步骤 B 补 4 类边界:空数组、标题 5000 字符、emoji/换行、localStorage 解析失败。每补一类都贴实际输出。

5. 阶段通用验收

  1. 不看答案能复述每个 Hook 的依赖数组规则、stale closure 风险;
  2. 用自己的话解释“为什么用 Context 但不直接 store 大对象”、“为什么 RQ 比手写 fetch 更省事”;
  3. 画一张组件树 + 数据流图(父→子 props / 子→父 callback / Context / external store);
  4. 跑通生产构建(vite build / next build),无 warning;
  5. 至少 3 组自定义数据并贴出实际渲染结果;
  6. 关键路径有 profiling 截图(React DevTools Profiler / Lighthouse);
  7. 能修改已有应用(加功能、修 bug、调性能),而不是只能照抄。

6. 最终验收

7. 综合项目

首选:完整电商 SPA

备选:把现有 SPA 重构为 RSC + Server Actions 架构

任何项目都要包含:

  1. 需求说明与角色(访客/登录用户/管理员);
  2. 状态管理选型理由;
  3. 关键交互时序图;
  4. 模块化源码(按 feature 切目录,组件 / hook / store / route / test 分离);
  5. 边界 / 异常测试;
  6. 构建与部署说明;
  7. README + 复盘报告(retrospective.md,含踩坑清单)。

8. 推荐开源资料

阶段角色资料用法
1~2官方主线react.dev必读;新文档是默认教材
1~2视频主线Epic ReactKent C. Dodds 的 hooks / 模式 / 测试
2视频主线FullStack Open包含 React + Redux + Node + testing
2模式手册Patterns.dev现代 React 模式总览
3路由官方React Router / TanStack Routerdata router 范式
2数据获取TanStack Query默认选择
2状态Zustand / Jotai / Redux Toolkit按需选
4构建Vite / Next.js / Remix各自默认
5测试Vitest / RTL / Playwright / MSW组合使用
5可观测Sentry React / Web Vitals / OpenTelemetry JS接 SDK
5性能 / a11yReact DevTools Profiler / Lighthouse跑分
6SSRNext.js 文档 / Remix 文档 / Patterns.dev RSC必读
博客Overreacted (Dan Abramov) / Josh Comeau / Mark Erikson / Kent C. Dodds / Robin Wieruch跨主题补充
视频React Conf talks看最新 RSC / Actions 演示

默认顺序:react.dev 主线 → 写 demo → Epic React 验错 → Patterns.dev 看模式 → 选栈查官方文档 → 写项目 → 复盘。复制代码前先看 LICENSE(默认 MIT)。

9. 学习资料汇聚(v0.3 自包含)

本节由本计划生成。链接指向原始材料或作者公开内容。生态变化快,决策时再查版本与日期。

9.1 背景与动机

React 2013 年由 Jordan Walke 在 Facebook 发布,最早为广告系统 UI 设计。2014 年公开。它的核心抽象是“UI = f(state)”:组件是函数、状态是输入、JSX 是声明式语法糖。

20152018 年间,Redux 与 class 生命周期成为默认套路。2019 年 Hooks 稳定后写法重写:useState / useEffect 取代 this.state / componentDidMount,函数组件成默认。20202023 年 Next.js 把 SSR / SSG 推回主流,Vite 把 dev server 拉回毫秒级。2024 年 React 19 引入 Server Components、Actions、useOptimistic、Web Vitals 内置优化。

今天 React 不只是 view library;它是“应用框架的基座”,围绕它的有数据获取、路由、样式、构建、测试、监控、a11y。学会 React 等于学会组织前端代码;上层框架按需选择。

9.2 概念地图

flowchart LR
  JSX[JSX] --> Component[函数组件]
  Component --> Props[props / children / composition]
  Component --> State[state]
  State --> Hook[Hooks]
  Hook --> Effect[useEffect / useLayoutEffect]
  Hook --> Transition[useTransition / useDeferredValue]
  Hook --> Reducer[useReducer]
  Reducer --> Context[Context]
  State --> External[External store: Zustand / Jotai / RTK]
  External --> ServerCache[TanStack Query]
  ServerCache --> Router[React Router / TanStack Router]
  Router --> Suspense[Suspense / ErrorBoundary]
  Component --> RSC[React Server Components]
  RSC --> ServerActions[Server Actions]
  Component --> Style[CSS Modules / Tailwind / Vanilla Extract]
  Component --> Test[Vitest / RTL / Playwright / MSW]
  Component --> Observe[Sentry / Web Vitals / OTel / DevTools]
  Component --> A11y[ARIA / 键盘 / 焦点管理]
  Component --> Build[Vite / Next.js / Remix]
  Build --> Deploy[Edge / Node / 静态]

关系说明:

9.3 基础知识讲解

9.3.1 论文 / 规范 / RFC

资料影响建议读法
React (Building User Interfaces) 2013 公告起源看早期模型与术语
RFC: React Server Components (2020)解释 RSC 动机与边界对比“客户端组件 + SSR”与“服务端组件 + 流式响应”
RFC: React 19 ActionsuseActionState / useFormStatus / Server Actions看表单 mutation 改造
RFC: useTransition并发渲染入口看调度器视角
React Working Group 仓库公开讨论与 RFC 索引查未来方向

9.3.2 经典书籍

影响用法
Learning React(Alex Banks / Eve Porcello)入门主线0 基础扫一遍
React Docs Beta → react.dev官方教材替代老书
Epic React(Kent C. Dodds)Hooks / 模式 / 测试跟着 4 个 workshop 写
FullStack OpenReact + Redux + Node + testing偏全栈
Patterns.dev(Lydia Hallie / Addy Osmani)现代模式 + RSC中后期看

9.3.3 优秀博客 / 文档

资料特点用法
react.dev官方文档主线教材
Overreacted (Dan Abramov)概念深讲周末精读
Josh ComeauCSS in JS / RSC / 可视化跟着 demo 跑
Mark EriksonRedux / 状态管理RTK 选型前必读
Kent C. DoddsTesting / Advanced React Patterns测试与模式
Robin Wieruch完整 React 路线路线型
Patterns.dev现代模式集合中后期查阅
React Router / TanStack Router路由官方data router 必读
TanStack Query服务端状态必读
Zustand / Jotaistore 备选选型对比
Next.js 文档 / Remix 文档SSR/RSC 框架选框架时细读
Web Vitals / MDN ARIA性能与 a11y 权威阶段 5 看

9.3.4 核心人物

人物主要影响建议追踪的材料
Jordan WalkeReact 发明人2013 talks、原始 PR
Dan AbramovHooks、Redux、React DevToolsOverreacted、React Working Group
Sebastian MarkbågeRSC / 并发 / React 19 关键 RFCReact Conf talks
Andrew ClarkReact core、并发React 18 发布 talk
Kent C. DoddsTesting Library、Epic React、kentcdodds.com测试与模式
Mark EriksonRedux 维护者、状态管理blog.isquaredsoftware.com
Tanner LinsleyTanStack 全家桶TanStack Conf
Guillermo RauchVercel / Next.js / RSC 推手Vercel blog、React Conf
Josh ComeauCSS-in-JS / RSC / 可视化joshwcomeau.com
Rich HarrisSvelte / Remix 共同作者关注框架对比视角

9.3.5 开发方法

方法具体动作何时用
State-location first先决定状态放哪(URL / store / server / local)任何新功能
Lift state up默认把状态放最近共同祖先不需要 store 时
Hooks for cross-cutting抽自定义 Hook 封装副作用复用副作用或数据流
Suspense as a protocol任何异步都暴露 Promise<Suspense>RSC、data router、TanStack Query
Test the contract, not the implementationRTL 查可见行为,不查 state避免重构即坏测试
Profile before optimizing先 React DevTools Profiler / Lighthouse,再改性能问题
Boundary of trustServer Actions / loader 当信任边界;前端只校验格式SSR / RSC
RSC by default, client on demand在 Next.js App Router 默认 Server Component,需要交互或浏览器 API 再 'use client'App Router 写法

重点 RFC 共 5 篇/组:

  1. React Server Components RFC — 解释 RSC 为什么是“组件渲染在服务端、序列化结果给客户端”。
  2. useTransition RFC — 解释并发渲染的入口与“低优先级更新”含义。
  3. React 19 Actions RFC — 解释 useActionState / useFormStatus / Server Actions 的表单模型。
  4. React 19 Release Notes(react.dev blog)— 总结新 Hook、优化、ref as prop 等。
  5. Patterns.dev:React Server Components — 第三方对照讲清 RSC 与 SSR 区别。

补充:TanStack Query 的 staleTime / gcTime 文档、React Router 的 data router 说明、Next.js 的 partial prerendering 文档。

9.4 经典问题与经典案例

#问题为什么会重要最简答案或证据
1useEffect 死循环缺少依赖或依赖对象每次新建拆 effect;稳定依赖;用 useMemo 或拆分 ref
2stale closureeffect 捕获旧 state加依赖或用 useRef / useReducer
3列表用 index 做 key重排后状态错位用稳定 id
4提升过度 / 不足状态位置不对选共同最近祖先;跨页面用 store
5误用 Redux / Context渲染范围爆炸切片 store;用 selector;Context 只放低频更新
6受控/非受控混用表单失焦丢值明确单一来源;用 ref + defaultValue
7路由懒加载导致闪烁首次 chunk 未就绪<Suspense fallback={<Skeleton/>}>;预取
8hydration mismatch服务端与客户端首屏不一致仅在客户端读 window / Date.now();Server Component 渲染动态数据
9重复请求瀑布父等子、子等孙Promise.all / RQ 并行;用 RSC 流式
10RSC 误把客户端代码放服务端用了 useState / onClick'use client';或把交互抽成子组件
11大列表卡顿10000 行 DOM虚拟列表(@tanstack/react-virtual
12键盘 a11y 缺失仅做鼠标<button> 而非 <div onClick>;管理 focus;ARIA roles
13Web Vitals LCP 差关键资源阻塞fetchpriority="high"、preload、SSR/SSG
14Web Vitals INP 差长任务阻塞主线程拆 effect;用 useTransition;web worker
15内存泄漏取消订阅未做effect 返回 cleanup;RQ 默认会做

9.5 学习难点

概念难点

难点为什么会卡突破路径
闭包与依赖数组useEffect 看不到更新后的 state画“每次渲染一张新图”,标出 effect 捕获的版本
RSC 边界不熟“哪些能放服务端”默认 Server Component;要交互的子树打 'use client'
Suspense 协议不知道 <Suspense> 到底等什么看“抛 Promise → 捕获 → 渲染 fallback → 数据就绪切换”
reconciliation key不理解 diff看协调算法;key 用来对位置而非身份

思维难点

难点为什么会卡突破路径
状态放哪不知道提不提升、用不用 store规则:URL 公开 / 跨页面用 store / 同页面父提 / 服务端数据用 RQ
并发渲染心智以前都同步接受“过渡期可见旧值”;用 useTransition 包非紧急更新
客户端 vs 服务端不熟边界区分“谁跑在浏览器”(事件、ref、window、localStorage)vs “谁跑在服务端”(DB、机密)

工程难点

难点为什么会卡突破路径
选型焦虑React Router vs TanStack Router;Zustand vs RTK vs Jotai选“主流默认 + 按需替换”:RR + Zustand + RQ;不确定时保持替换面小
性能回归useMemo 用错或滥用先 Profile;memo 用于“引用相等的下游 + 频繁重渲染”
测试金字塔失衡全是 e2e 或全是单元关键交互用 RTL;跨页用 Playwright;HTTP 用 MSW
监控盲区错误只在生产接 Sentry + Web Vitals + OTel;用真实用户指标而非只看 console
部署 SSR 排障不知错在 server 还是 client分环境打 log;区分 'use client' 边界;用 source map

9.6 技术标准与接口

9.6.1 Entity

名称版本发布组织状态许可证 / 可访问性
React18 / 19Meta(Open Source)活跃MIT;源码 github.com/facebook/react
React DOM18 / 19Meta活跃MIT
React Native0.74+Meta / 社区活跃MIT
JSXTC39 Stage(提案历史)ECMAScript 提案由 React / TypeScript 工具链实现
TypeScript JSXTSXMicrosoft TypeScript活跃Apache-2.0
React Server ComponentsReact 18 实验 → 19 稳定Meta稳定随 React 仓库发布

9.6.2 Scope

9.6.3 Structure

9.6.4 Ecosystem

9.6.5 Depth Tiers

层级名称必须看到什么
L0知道存在知道 React 是什么,区分 SPA / SSR / RSC
L1看得懂示例能读懂官方文档示例与简单组件
L2能正确调用能用 Hooks 写受控表单、自定义 Hook、Context
L3能解释与排错能解释 stale closure、key、Suspense 协议;能选 store;能排 SSR 渲染差异
L4能设计与扩展能设计应用结构、引入 RSC、写自定义打包与监控

本计划目标:综合项目阶段达到 L3,部分架构决策与 RSC 重构触及 L4。

9.6.6 Source

10. 常见误区

11. 所有知识点分类(统一规则)

  1. 编程语言
  2. 数据结构与算法
  3. 计算机基础
  4. 工程技术
  5. Web 与后端
  6. 前端与客户端
  7. 数据与人工智能
  8. 项目与职业能力
  9. 安全与可靠性

本计划归属:前端与客户端 主 + 工程技术 辅。


直接依赖(4)

查看知识图谱