React 应用开发:从组件到 SSR 与测试
0. 元信息
- 主题路径:
docs/topics/react-app/README.md - 主分类:前端与客户端
- 辅助分类:工程技术
- 适合对象:会用 HTML/CSS/JS、了解 HTTP 与 REST、写过简单交互页面的开发者
- 建议周期:6
10 周(每周 812 小时,至少 60% 时间写代码) - 前置知识:JavaScript ES2017+ 模块与异步、
http-1-2-3、rest-api-design、命令行与 Node.js - 最终目标:能独立搭建带路由、状态管理、服务端渲染、测试与监控的可生产 React 应用
1. 学习路线
组件与 JSX
→ Hooks 与状态管理
→ 路由与数据获取
→ 样式与构建工具链
→ 测试、可观测与可访问性
→ SSR / SSG / RSC 与生产部署
→ 综合项目:完整电商 SPA + 配套 RSC 重构
每一步都建立在前一步的稳定结构上;不要跳级把 RSC 提前到没掌握 Suspense 与数据流之前。
2. 阶段周数分配(6~10 周,量力而行)
| 阶段 | 6 周方案 | 10 周方案 | 备注 |
|---|---|---|---|
| 1. 组件与 JSX | 1 | 1.5 | props、列表 key、lift state up、Refs、Portal |
| 2. Hooks 与状态 | 1.5 | 2.5 | useState/Effect/Memo/Callback/Ref/Reducer/Context + useTransition/useDeferredValue + Context/Zustand/Jotai/RTK/TanStack Query |
| 3. 路由与数据 | 1 | 1.5 | React Router、TanStack Router、data loaders、Suspense、error boundary |
| 4. 样式与构建 | 0.75 | 1.5 | CSS Modules、Tailwind、Vanilla Extract、Vite、SWC、Turbopack、ESLint、Prettier |
| 5. 测试与可观测 | 1 | 1.5 | Vitest、RTL、Playwright、MSW、Sentry、Web Vitals、OpenTelemetry、a11y |
| 6. SSR/RSC 与部署 | 0.5 | 1 | Next.js / Remix / Astro、hydration、RSC、Server Actions、edge runtime |
| 7. 综合项目 | 0.25 | 0.5 | 必做:完整电商 SPA;可选:RSC 重构 |
6 周方案对应高强度、每天投入;10 周方案对应稳扎稳打、留出“踩坑-复盘-改写”时间。选 6 周时建议每周留 1 天只做代码复盘。
3. 七阶段表
| 阶段 | 核心知识 | 实践产出 | 可观察学会标准 |
|---|---|---|---|
| 1. 组件与 JSX | 函数组件、JSX 规则、props/state、列表与 key、lift state up、组合、ref、Portal、uncontrolled vs controlled | TodoMVC(无依赖、纯函数组件) | 不看文档能写出受控表单、能解释为什么列表要 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 / RSC | Next.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 输出 hello | notes/day1.md、Vite 启动成功的截图或日志 |
| Day 2 | 写 3 个函数组件:Button / Card / Avatar;用 props 传值;用 children 传 JSX | 一个 storybook 风格的 demo.tsx(不强求真用 Storybook) |
| Day 3 | useState + 受控输入:写一个搜索框,输入即过滤列表;用 useDeferredValue 让输入更顺 | 过滤可用的搜索页 |
| Day 4 | 列表与 key:写一个 100 项 todo 列表,key 用 id、不用 index;删 / 改 / 加都正常 | todo 列表 demo |
| Day 5 | 状态提升:把选中态提升到父组件,两个子组件共享 | 选中态在父、子各自更新 |
| Day 6 | useRef + 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. 阶段通用验收
- 不看答案能复述每个 Hook 的依赖数组规则、stale closure 风险;
- 用自己的话解释“为什么用 Context 但不直接 store 大对象”、“为什么 RQ 比手写 fetch 更省事”;
- 画一张组件树 + 数据流图(父→子 props / 子→父 callback / Context / external store);
- 跑通生产构建(
vite build/next build),无 warning; - 至少 3 组自定义数据并贴出实际渲染结果;
- 关键路径有 profiling 截图(React DevTools Profiler / Lighthouse);
- 能修改已有应用(加功能、修 bug、调性能),而不是只能照抄。
6. 最终验收
- 独立完成:受控表单、自定义 Hook、Context + Reducer 替代小 Redux、Zustand 单一 store、TanStack Query 一个完整 query + mutation、React Router 一组嵌套路由、一种 SSR 框架(Next.js 或 Remix)跑通 prod build;
- 至少完成 12 个练习(含 4 个组件设计、4 个 Hook 习题、2 个 RQ 习题、2 个 SSR 习题);
- 完成 1 个综合项目:完整电商 SPA(含路由、状态管理、SSR、测试、CI、监控),配套一份复盘;
- 能用 15 分钟讲清楚 React 18→19 关键变化(concurrent rendering、useTransition、Server Components、Actions)以及何时仍选 SPA。
7. 综合项目
首选:完整电商 SPA
- 路由:首页 / 商品列表 / 商品详情 / 购物车 / 结算 / 订单 / 登录 / 404;
- 状态:Zustand 管 UI(主题、侧栏),TanStack Query 管服务端数据,Context 只放鉴权;
- SSR:Next.js App Router;商品列表 SSG,详情 ISR,结算 CSR;
- 测试:RTL 单元 20+、Playwright e2e 5 路径、MSW 拦截 API;
- 可观测:Sentry 上报 + Web Vitals 上报 + OpenTelemetry trace;
- 部署:Vercel/Netlify 静态 + serverless functions;CI 跑 lint/typecheck/test/build。
备选:把现有 SPA 重构为 RSC + Server Actions 架构
- 保留原 SPA 路由和数据契约;
- 引入 App Router,把数据获取迁到 Server Component;
- 引入 Server Actions 替代部分 mutation;
- 输出一份“迁移前后 bundle / TTFB / LCP / 客户端 JS 体积”对比表。
任何项目都要包含:
- 需求说明与角色(访客/登录用户/管理员);
- 状态管理选型理由;
- 关键交互时序图;
- 模块化源码(按 feature 切目录,组件 / hook / store / route / test 分离);
- 边界 / 异常测试;
- 构建与部署说明;
- README + 复盘报告(
retrospective.md,含踩坑清单)。
8. 推荐开源资料
| 阶段 | 角色 | 资料 | 用法 |
|---|---|---|---|
| 1~2 | 官方主线 | react.dev | 必读;新文档是默认教材 |
| 1~2 | 视频主线 | Epic React | Kent C. Dodds 的 hooks / 模式 / 测试 |
| 2 | 视频主线 | FullStack Open | 包含 React + Redux + Node + testing |
| 2 | 模式手册 | Patterns.dev | 现代 React 模式总览 |
| 3 | 路由官方 | React Router / TanStack Router | data 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 | 性能 / a11y | React DevTools Profiler / Lighthouse | 跑分 |
| 6 | SSR | Next.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 稳定后写法重写:2023 年 Next.js 把 SSR / SSG 推回主流,Vite 把 dev server 拉回毫秒级。2024 年 React 19 引入 Server Components、Actions、useOptimistic、Web Vitals 内置优化。useState / useEffect 取代 this.state / componentDidMount,函数组件成默认。2020
今天 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 / 静态]
关系说明:
- 组件 + JSX 是语法和组合层;
- Hooks 是状态与副作用的统一接口;
- 外部 store / Server cache 是规模化的两条轴:客户端状态 vs 服务端数据;
- Router 串起页面与数据;
- Suspense / ErrorBoundary 处理异步与失败;
- RSC 把组件的渲染推到服务端;
- Style、Test、Observe、A11y 是横切关注点。
9.3 基础知识讲解
9.3.1 论文 / 规范 / RFC
| 资料 | 影响 | 建议读法 |
|---|---|---|
| React (Building User Interfaces) 2013 公告 | 起源 | 看早期模型与术语 |
| RFC: React Server Components (2020) | 解释 RSC 动机与边界 | 对比“客户端组件 + SSR”与“服务端组件 + 流式响应” |
| RFC: React 19 Actions | useActionState / 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 Open | React + Redux + Node + testing | 偏全栈 |
| Patterns.dev(Lydia Hallie / Addy Osmani) | 现代模式 + RSC | 中后期看 |
9.3.3 优秀博客 / 文档
| 资料 | 特点 | 用法 |
|---|---|---|
| react.dev | 官方文档 | 主线教材 |
| Overreacted (Dan Abramov) | 概念深讲 | 周末精读 |
| Josh Comeau | CSS in JS / RSC / 可视化 | 跟着 demo 跑 |
| Mark Erikson | Redux / 状态管理 | RTK 选型前必读 |
| Kent C. Dodds | Testing / Advanced React Patterns | 测试与模式 |
| Robin Wieruch | 完整 React 路线 | 路线型 |
| Patterns.dev | 现代模式集合 | 中后期查阅 |
| React Router / TanStack Router | 路由官方 | data router 必读 |
| TanStack Query | 服务端状态 | 必读 |
| Zustand / Jotai | store 备选 | 选型对比 |
| Next.js 文档 / Remix 文档 | SSR/RSC 框架 | 选框架时细读 |
| Web Vitals / MDN ARIA | 性能与 a11y 权威 | 阶段 5 看 |
9.3.4 核心人物
| 人物 | 主要影响 | 建议追踪的材料 |
|---|---|---|
| Jordan Walke | React 发明人 | 2013 talks、原始 PR |
| Dan Abramov | Hooks、Redux、React DevTools | Overreacted、React Working Group |
| Sebastian Markbåge | RSC / 并发 / React 19 关键 RFC | React Conf talks |
| Andrew Clark | React core、并发 | React 18 发布 talk |
| Kent C. Dodds | Testing Library、Epic React、kentcdodds.com | 测试与模式 |
| Mark Erikson | Redux 维护者、状态管理 | blog.isquaredsoftware.com |
| Tanner Linsley | TanStack 全家桶 | TanStack Conf |
| Guillermo Rauch | Vercel / Next.js / RSC 推手 | Vercel blog、React Conf |
| Josh Comeau | CSS-in-JS / RSC / 可视化 | joshwcomeau.com |
| Rich Harris | Svelte / 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 implementation | RTL 查可见行为,不查 state | 避免重构即坏测试 |
| Profile before optimizing | 先 React DevTools Profiler / Lighthouse,再改 | 性能问题 |
| Boundary of trust | Server Actions / loader 当信任边界;前端只校验格式 | SSR / RSC |
| RSC by default, client on demand | 在 Next.js App Router 默认 Server Component,需要交互或浏览器 API 再 'use client' | App Router 写法 |
重点 RFC 共 5 篇/组:
- React Server Components RFC — 解释 RSC 为什么是“组件渲染在服务端、序列化结果给客户端”。
useTransitionRFC — 解释并发渲染的入口与“低优先级更新”含义。- React 19 Actions RFC — 解释
useActionState/useFormStatus/ Server Actions 的表单模型。 - React 19 Release Notes(react.dev blog)— 总结新 Hook、优化、
ref as prop等。 - Patterns.dev:React Server Components — 第三方对照讲清 RSC 与 SSR 区别。
补充:TanStack Query 的 staleTime / gcTime 文档、React Router 的 data router 说明、Next.js 的 partial prerendering 文档。
9.4 经典问题与经典案例
| # | 问题 | 为什么会重要 | 最简答案或证据 |
|---|---|---|---|
| 1 | useEffect 死循环 | 缺少依赖或依赖对象每次新建 | 拆 effect;稳定依赖;用 useMemo 或拆分 ref |
| 2 | stale closure | effect 捕获旧 state | 加依赖或用 useRef / useReducer |
| 3 | 列表用 index 做 key | 重排后状态错位 | 用稳定 id |
| 4 | 提升过度 / 不足 | 状态位置不对 | 选共同最近祖先;跨页面用 store |
| 5 | 误用 Redux / Context | 渲染范围爆炸 | 切片 store;用 selector;Context 只放低频更新 |
| 6 | 受控/非受控混用 | 表单失焦丢值 | 明确单一来源;用 ref + defaultValue |
| 7 | 路由懒加载导致闪烁 | 首次 chunk 未就绪 | <Suspense fallback={<Skeleton/>}>;预取 |
| 8 | hydration mismatch | 服务端与客户端首屏不一致 | 仅在客户端读 window / Date.now();Server Component 渲染动态数据 |
| 9 | 重复请求瀑布 | 父等子、子等孙 | 用 Promise.all / RQ 并行;用 RSC 流式 |
| 10 | RSC 误把客户端代码放服务端 | 用了 useState / onClick | 加 'use client';或把交互抽成子组件 |
| 11 | 大列表卡顿 | 10000 行 DOM | 虚拟列表(@tanstack/react-virtual) |
| 12 | 键盘 a11y 缺失 | 仅做鼠标 | 用 <button> 而非 <div onClick>;管理 focus;ARIA roles |
| 13 | Web Vitals LCP 差 | 关键资源阻塞 | fetchpriority="high"、preload、SSR/SSG |
| 14 | Web 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
| 名称 | 版本 | 发布组织 | 状态 | 许可证 / 可访问性 |
|---|---|---|---|---|
| React | 18 / 19 | Meta(Open Source) | 活跃 | MIT;源码 github.com/facebook/react |
| React DOM | 18 / 19 | Meta | 活跃 | MIT |
| React Native | 0.74+ | Meta / 社区 | 活跃 | MIT |
| JSX | TC39 Stage(提案历史) | ECMAScript 提案 | 由 React / TypeScript 工具链实现 | — |
| TypeScript JSX | TSX | Microsoft TypeScript | 活跃 | Apache-2.0 |
| React Server Components | React 18 实验 → 19 稳定 | Meta | 稳定 | 随 React 仓库发布 |
9.6.2 Scope
- React 定义组件模型、Hooks、并发渲染、Context、Suspense。
- React DOM / Native 负责渲染目标。
- RSC 改变“哪些代码在哪个环境跑”,是 React 19 的最大语义变化。
- JSX 不是 ECMAScript 标准;TypeScript / Babel / SWC 各自实现。
- React 自身不规定路由、状态、HTTP、样式、构建——这些是上层生态。
9.6.3 Structure
- 必须掌握:
Component/props/state/useState/useEffect/useMemo/useCallback/useRef/useReducer/useContext/useTransition/useDeferredValue/useId/Suspense/ErrorBoundary/lazy/memo。 - React 19 新增:
useActionState/useFormStatus/useOptimistic/use(读 Promise / Context)/ref as prop。 - 关键概念:
Server Component/Client Component/Server Action/boundary/hydration/streaming/partial prerendering。
9.6.4 Ecosystem
- 路由:React Router v6/v7、TanStack Router、Next.js App Router、Remix。
- 状态:Zustand、Jotai、Redux Toolkit、Valtio、Recoil(已停止维护)。
- 数据:TanStack Query、SWR、Apollo(GraphQL)。
- 样式:CSS Modules、Tailwind、styled-components、Emotion、Vanilla Extract、shadcn/ui。
- 构建:Vite、Next.js、Remix、Astro、Parcel、Rsbuild。
- 测试:Vitest、Jest、React Testing Library、Playwright、Cypress、MSW、Storybook。
- 可观测:Sentry、Web Vitals、OpenTelemetry、Datadog RUM、LogRocket、React DevTools。
- a11y:eslint-plugin-jsx-a11y、axe-core、@testing-library/jest-dom、Pa11y。
- 事实标准 vs 标准本身:默认选型(Vite + RR + Zustand + RQ + Vitest + RTL + Playwright + Sentry + Tailwind)不写在 React 文档,是社区共识。
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
- react.dev:官方文档、版本说明。
- React Working Group 仓库 与 React 仓库:RFC 与实现。
- 引用快照:2026-07-30。React 19 已发布;RSC 在 Next.js App Router 中默认启用;新项目默认 react@19 / next@15。
10. 常见误区
- 把
useEffect当万能胶水,初始 state 来自网络却用 effect 拉; - 列表用
index做 key,重排后状态错位; - 用 Context 存高频更新(每次 dispatch 全部组件重渲染);
- 用 Redux 存一切,不学 RQ;
- 路由用 hash 模式而不是 history,刷新无副作用但 SEO 差;
- 写受控表单但用
defaultValue+value混用; - 把
useMemo当性能银弹,不 Profile 乱加; - RQ 设
staleTime: 0每次都打网络; - SSR 直接
new Date()或读localStorage,造成 hydration mismatch; - 把客户端代码放 Server Component,不加
'use client'; - 用
<div onClick>而非<button>,丢掉 a11y; - 上线后才接监控,错误盲跑;
- 框架选 Next.js 但又用 CRA 写法,不读 App Router;
- 不写测试就上线;
- 把“会写 demo”当“会做生产”,跳过监控 / a11y / 性能预算。
11. 所有知识点分类(统一规则)
- 编程语言
- 数据结构与算法
- 计算机基础
- 工程技术
- Web 与后端
- 前端与客户端
- 数据与人工智能
- 项目与职业能力
- 安全与可靠性
本计划归属:前端与客户端 主 + 工程技术 辅。