Files
gaokao-volunteer-system/SPRINT_4_S4_PERF_OPS.md
Frontend Developer e8b8ad079e feat(sprint-2): V10 选项 B 完整切换 + G1 闸门通过
框架切换:Next.js 16 → Vite 5 + React 19 + React Router 7
状态管理:7 手写 hook → 4 Zustand slice
数据获取:直接 fetch → TanStack Query 5 (15 hooks)
表单:3-step 状态机 → RHF 7 + Zod
测试:0 → 25 单测 + 20 e2e (4 浏览器)
Bundle:192 KB gzip (目标 < 300 KB)
Lint:49 warning → 0 warning
Type:33 any → 0 any

S2-T-01 切 Vite 5 + React 19 框架
S2-T-02 Zustand 4 slice 替代 7 手写 hook
S2-T-03 TanStack Query 5 + 15 hooks
S2-T-04 Vitest + RTL + MSW + Chromatic 配置
S2-T-05 OpenAPI Codegen + Zod schema 复用
S2-T-06 RHF 7 + Zod 重写 FormCard
S2-T-07 Playwright 视觉基线 4 浏览器 5 spec
S2-T-08 Vite build + bundle < 300KB gzip

G1 闸门 (全部通过):
- typecheck: 0 error
- lint: 0 error 0 warning
- test (Vitest): 25/25 passed
- test:e2e (Playwright): 20/20 passed
- build (Vite): 326 modules 4.14s
- codegen:check: OpenAPI types 非占位

Sprint 2 收口报告:SPRINT_2_CLOSEOUT_2026-07-03.md
2026-07-03 15:51:03 +08:00

8.4 KiB
Raw Blame History

Sprint 4 任务拆解W6-7 · 10 人天 · 46 子任务)— V10 选项 B

技术栈Vite 5 + React 19 + Zustand 4 + TanStack Query 5 + RHF 7 + Zod 目标:错误/兜底/离线/防重 + 性能优化 + 监控收口 + 真实后端回归 闸门G3Lighthouse P75 ≥ 90 P/A/B/S+ G4Poster CLI Docker 镜像跑通) V10 变化:从 14d 缩到 10d节省 4d = Vite SSR 简化 + e2e 用 Playwright 1.55 加速) PM 决策2026-07-03整体重写为新实现Playwright 视觉回归 + Chromatic 验收


⚠️ V10 关键变化(与 V2 对比)

维度 V2 V10 选项 B
Lighthouse 目标 90 P75 90 P75(保持)
e2e 真实化8 路径) 3.0d 2.0dPlaywright trace + Vite preview 加速)
Bundle 优化 1.0d 0.5dVite 已分块)
i18n 错误码映射 0.5d 0.5d(不变)
总估时 14d 10d

0. Sprint 4 概览

任务 主任务 估时 子任务数
T-B-18 错误码 → 用户文案映射 0.5d 3
T-B-19 ErrorBoundary 兜底页 0.5d 3
T-B-20 离线检测 + 提示 1.0d 4
T-B-21 表单提交防重复RHF 版) 0.5d 3
T-B-22 TanStack Query 持久化 0.5d 3
T-B-23 e2e 真实化8 路径Playwright 加速) 2.0d 8
T-B-24 Lighthouse CI 集成 1.5d 4
T-B-25 Bundle 优化Vite 版) 0.5d 3
T-B-26 路由级 prefetch 0.5d 2
T-B-27 真实后端回归 0.5d 2
T-B-40 Share Link 状态面板数据 0.5d 3
T-B-41 ShareLink 失败降级 0.5d 3
T-B-42 LLM 增强进度轮询 0.5d 3
T-B-43 Poster 异步生成 + 轮询 0.5d 3
T-C-44 Poster CLI 部署集成Docker 1.0d 4
T-C-45 集成测试套件 0d 2
合计 16 任务 10d 53

T-B-18 · 错误码 → 用户文案映射0.5d · 3 子任务)

ST-S4-B-18.1 写 packages/i18n/zh-CN/errors.json0.25d

  • 内容15 个错误码全覆盖
    • E03001 / E03002 / E03003
    • E04001 / E04002
    • E05001
    • +8 V2 错误码
  • 约束:沿用 admin/errors/registry.py 5 字段结构

ST-S4-B-18.2 写 api-client 拦截器0.125d

  • 验收
    • 拦截响应 → 查表 → 返回 i18n 文案

ST-S4-B-18.3 写单测0.125d

  • 覆盖15 错误码各 1 用例

T-B-19 · ErrorBoundary 兜底页0.5d · 3 子任务)

ST-S4-B-19.1 写 ErrorBoundary 组件0.25d

  • V10 变化:用 react-error-boundary 库,避免手写 class 组件

ST-S4-B-19.2 写兜底页0.125d

  • UI/交互 1:1:与原型 ErrorPage 一致

ST-S4-B-19.3 接入根路由0.125d


T-B-20 · 离线检测 + 提示1.0d · 4 子任务)

ST-S4-B-20.1 写 useOnlineStatus hook0.25d

  • 封装navigator.onLine + online/offline 事件

ST-S4-B-20.2 写 OfflineBanner 组件0.25d

  • V10 不变量 L2:移动端 48px 高度

ST-S4-B-20.3 写离线降级策略0.25d

  • 行为:写操作排队 + 恢复后自动重试

ST-S4-B-20.4 写 e2eoffline.spec0.25d


T-B-21 · 表单提交防重复RHF 版 · 0.5d · 3 子任务)⚠️ V10 简化

V10 收益RHF formState.isSubmitting 内置

ST-S4-B-21.1 接入 RHF isSubmitting0.125d

ST-S4-B-21.2 写通用 SubmitButton 组件0.25d

ST-S4-B-21.3 写单测0.125d


T-B-22 · TanStack Query 持久化0.5d · 3 子任务)⚠️ V10 简化

V10 收益@tanstack/query-async-storage-persister 内置支持

ST-S4-B-22.1 安装 persister0.125d

pnpm --filter web add @tanstack/query-async-storage-persister

ST-S4-B-22.2 写 queryClient.ts 持久化配置0.25d

  • maxAge24h
  • storagelocalStorage

ST-S4-B-22.3 验证 5 模块刷新恢复0.125d


T-B-23 · e2e 真实化8 路径 · 2.0d · 8 子任务)⚠️ V10 加速

V10 加速:用 Playwright test.step + Vite preview server

ST-S4-B-23.1 e2e: theme-switch0.25d

ST-S4-B-23.2 e2e: chat-send-receive0.25d

ST-S4-B-23.3 e2e: form-submit-validation0.25d

ST-S4-B-23.4 e2e: plan-create-view0.25d

ST-S4-B-23.6 e2e: data-query-search0.25d

ST-S4-B-23.7 e2e: review-flow-approve0.25d

ST-S4-B-23.8 e2e: poster-generate-download0.25d


T-B-24 · Lighthouse CI 集成1.5d · 4 子任务)

ST-S4-B-24.1 安装 @lhci/cli0.25d

ST-S4-B-24.2 写 lighthouserc.json0.5d

  • 目标P ≥ 90 / A ≥ 95 / B ≥ 90 / S ≥ 90
  • V10 收益Vite 产物比 Next.js 小Lighthouse 分数天然更高

ST-S4-B-24.3 接入 GitHub Action0.5d

  • 验收
    • PR 触发 LHCI
    • 分数 < 90 阻止合并

ST-S4-B-24.4 调优未达标项0.25d


T-B-25 · Bundle 优化Vite 版 · 0.5d · 3 子任务)⚠️ V10 简化

V10 收益Sprint 2 已分块S4 只做微调

ST-S4-B-25.1 配置 manualChunks 精细化0.125d

  • 目标recharts 单独 chunk懒加载

ST-S4-B-25.2 配置资源内联阈值0.125d

  • 4KB 以下内联

ST-S4-B-25.3 验证 bundle < 300KB gzip0.25d


T-B-26 · 路由级 prefetch0.5d · 2 子任务)

  • 行为hover 200ms 后预取目标 chunk

ST-S4-B-26.2 接入 Header / Sidebar0.25d

  • 验收
    • hover → 预取 → 点击 0 等待

T-B-27 · 真实后端回归0.5d · 2 子任务)

ST-S4-B-27.1 启动后端服务0.25d

  • 命令docker compose up backend postgres

ST-S4-B-27.2 跑 5 模块端到端0.25d

  • 验收
    • Share / Query / Review / LLM / Poster 全部 200

ST-S4-B-40.1 写 useShareLinkStatsQuery0.125d

  • 封装GET /api/share-link/{code}/stats

ST-S4-B-40.2 写 Stats 组件0.25d

  • V10 收益Sprint 3 已实现,此处优化

ST-S4-B-40.3 接入 Dashboard0.125d


ST-S4-B-41.1 写重试机制0.25d

  • V10 收益TanStack Query retry: 3 内置

ST-B-41.2 写降级 UI0.125d


T-B-42 · LLM 增强进度轮询0.5d · 3 子任务)⚠️ V10 简化

V10 收益TanStack Query refetchInterval 内置

ST-S4-B-42.1 写 useAuditEnhanceStatusQuery0.125d

ST-S4-B-42.2 写进度条组件0.25d

ST-S4-B-42.3 接入 AuditPanel0.125d


T-B-43 · Poster 异步生成 + 轮询0.5d · 3 子任务)

ST-S4-B-43.1 写 usePosterStatusQuery0.125d

ST-S4-B-43.2 写状态机组件0.25d

  • 三态generating / ready / failed

ST-S4-B-43.3 接入 PosterDialog0.125d


T-C-44 · Poster CLI 部署集成Docker · 1.0d · 4 子任务)

ST-C-44.1 写 Dockerfile.poster0.25d

ST-C-44.2 写 docker-compose.yml 添加 poster 服务0.25d

ST-C-44.3 本地构建 + 启动验证0.25d

ST-C-44.4 CI 集成0.25d


T-C-45 · 集成测试套件0d · 2 子任务)

ST-C-45.1 写 tests/integration/ 骨架0d

ST-C-45.2 跑通 3 个集成测试0d


V10 验收清单Sprint 4 G3 + G4 闸门)

G3 闸门(必须全部通过):
  [ ] Lighthouse P75 ≥ 90P/A/B/S 四项)
  [ ] pnpm build bundle < 300KB gzip
  [ ] 8 e2e spec 全绿
  [ ] 真实后端 5 模块 200

G4 闸门:
  [ ] Poster CLI Docker 镜像本地构建 < 60s
  [ ] docker compose up 启动成功
  [ ] Poster 异步生成端到端跑通

V10 风险Sprint 4 特有)

ID 风险 等级 缓解
V10-S4-R1 Lighthouse 分数不达标 Vite 产物天然高分;重点优化 LCP 图
V10-S4-R2 真实后端回归失败 用 docker compose 隔离环境;失败可回退 mock
V10-S4-R3 Poster CLI Docker 镜像构建慢 多阶段构建 + 缓存

Sprint 4 文档状态V10 选项 B 重写完成 总工时10 人天V2 是 14 人天,节省 4d 总子任务53 个V2 是 50 个) 下一步Sprint 3 完成后立即启动