# V10 重构策略:UI/交互层与技术层解耦(2026-07-03) > **核心原则(PM 拍板)**: > > "原型主要确定 UI 和交互,我们重构前端时要用原型的 UI 和交互,可以不适用原型的技术。" > > **含义**:原型是 **UI/交互的行为规约**(行为契约),不是 **代码模板**。技术栈完全开放。 --- ## 0. 与 V1 / V2 报告的关键差异 | 维度 | V1 / V2 假设 | V10 修正 | |---|---|---| | 原型代码 | "保留为主,只重构集成" | **可整体重写**,但 UI/交互 1:1 复现 | | React 19 | "沿用" | **可选**:Vue 3 / Svelte 5 / Solid 都可以 | | useChat 单体 hook | "分解成 5 个子 hook" | **可选**:保留/Zustand/Jotai/Redux Toolkit 都可以 | | `any` 类型 33 处 | "降级到 warn,逐步修" | **直接清零**:重写时使用严格类型 | | 7 个原型 lib 文件 | "提取到 packages/lib" | **可丢弃**:业务逻辑重新按 API 端点重写 | | ESLint 49 warning | "Sprint 1 降级 + Sprint 2 修" | **直接消除**:新代码按严格规范写 | | 评估总工时 | 66-89 人天 | **修正 50-70 人天**(节省的 16-19d 来自:删 `any` 修复 + 7 文件重写 + 6 个手写 hook 重构) | --- ## 1. 双层模型:UI/交互层 × 技术层 ``` ┌────────────────────────────────────────────────────────┐ │ Layer A · UI/交互契约层(🔒 锁定,1:1 复现) │ │ ──────────────────────────────────────────────────── │ │ • 12 个 UI 不变量(见 FRONTEND_REFACTOR_PLAN §3.1) │ │ • 8 个核心组件视觉规范(PlanCard 3-Tab、ModeIndicator 4 │ │ mode 决策树、FormCard 3-step guards、Badge 状态映射) │ │ • 1024px 断点、48px 移动端导航、SafeMarkdown XSS 防护 │ │ • Design Token(247 行 design-system.css 100+ 变量) │ │ • 暗/亮/系统三主题切换 + 1.2s 缓动 │ │ • Flash 防护:theme-script + ThemeProvider SSR/CSR 一致 │ │ • Typing 动画(思考指示器三态:思考中/已暂停/已停止) │ │ • 移动端手势(下拉刷新、虚拟键盘适配、安全区) │ │ ──────────────────────────────────────────────────── │ │ ★ 验收:Playwright 视觉回归 + Chromatic 像素级 diff │ │ ★ 验收:axe-core 0 critical / 0 serious │ └────────────────────────────────────────────────────────┘ △ 契约接口 │ ┌─────────────────────────▽──────────────────────────────┐ │ Layer B · 技术实现层(🔓 完全开放,按 Sprint 选型) │ │ ──────────────────────────────────────────────────── │ │ B1. 框架:Next.js 16 / Vite+React 19 / Nuxt 3 / │ │ SvelteKit 2 / SolidStart 1(任选) │ │ B2. 状态:Zustand 4 / Jotai 2 / Redux Toolkit 2 / │ │ Pinia 2 / 自定义 store(任选) │ │ B3. 数据:TanStack Query 5 / SWR 2 / Apollo 4 / │ │ tRPC 11(任选) │ │ B4. 表单:React Hook Form 7 / Formik 2 / VeeValidate │ │ B5. 测试:Vitest 2 / Jest 29 / Playwright 1.55(统一) │ │ B6. 构建:Turborepo 2.10 / Nx 20 / Lerna 8(任选) │ │ B7. 样式:Tailwind 4 / vanilla-extract / CSS Modules / │ │ Panda CSS / UnoCSS(任选,保持 design token 一致)│ │ B8. 类型:TypeScript 5(统一)/ JSDoc(备选) │ │ ──────────────────────────────────────────────────── │ │ ★ 验收:typecheck 0 error / lint 0 error / test 100% │ │ ★ 验收:bundle < 300KB gzip / LCP < 2.5s / CLS < 0.1 │ └────────────────────────────────────────────────────────┘ ``` --- ## 2. UI/交互契约 · 12 项不变量(必须 1:1 复现) > 来源:`FRONTEND_REFACTOR_PLAN_2026-07-02.md` §3.1,已通过原型实测验证。 ### 2.1 布局不变量(4 项) | # | 不变量 | 实测值 | 验收方式 | |---|---|---|---| | L1 | 桌面断点 | `≥ 1024px` 显示侧栏三栏布局 | Playwright viewport=1280 | | L2 | 移动断点 | `< 768px` 单栏 + 底部 Tab 导航(48px 高) | Playwright viewport=375 | | L3 | 中间断点 | `768-1023px` 双栏,导航折叠为顶部抽屉 | Playwright viewport=900 | | L4 | 容器宽度 | `max-w-7xl mx-auto px-4 sm:px-6 lg:px-8` | 视觉回归 | ### 2.2 组件不变量(4 项) | # | 组件 | 关键行为 | 来源文件 | |---|---|---|---| | C1 | **PlanCard 3-Tab** | "院校 / 专业 / 就业" Tab 切换不重渲染父组件 | `src/components/PlanCard.tsx` | | C2 | **ModeIndicator 4-mode 决策树** | chat-mode / plan-mode / review-mode / share-mode 互斥显示,决策延迟 < 50ms | `src/components/ModeIndicator.tsx` | | C3 | **FormCard 3-step guards** | step 1→2 需 score 输入;step 2→3 需选科+位次;后退保留数据 | `src/components/FormCard.tsx` | | C4 | **Badge 8 态映射** | 985/211/双一流/省重点/普通本科/专科/提前批/征集,颜色 + 图标对应 | `src/components/Badge.tsx` | ### 2.3 行为不变量(2 项) | # | 行为 | 验收 | |---|---|---| | B1 | **Typing 动画三态** | "AI 正在思考"旋转 / "已暂停"静止 / "已停止"隐藏 | Playwright trace | | B2 | **SafeMarkdown XSS 防护** | `