第 1 章 · 组件拆分与生产级代码

📖 前端工程·考点精讲约 1819 字🎯 配套练习:PDE·组件工程

考点梳理

1.1 组件拆分 3 问(“评审高频追问”)

① 能否复用?   → 拆不出复用部分 = 粒度错了(太大或太碎)
② 状态放哪?   → 局部:useState;共享:Context/状态库(Redux/Zustand)
③ Props 怎么定? → 最小接口(别把整个对象塞进去)

好拆分 vs 坏拆分(高频对比):

坏拆分问题好拆分
MeetingPage.tsx(2000 行)一个组件管所有状态MeetingPage → UploadZone / TranscriptPanel / TodoList / ErrorBanner
<Card data={entireApiObject} />Props 过大<Card title={...} onRetry={...} />(最小接口)

记忆锚:“复用/状态/Props 三问,2000 行组件 = 不及格”。

1.2 状态管理(“3 档”)

档方案适用
局部useState / useReducer单个组件内部(如"输入框内容")
共享(轻)Context跨组件少量共享(如"用户信息/主题")
共享(重)状态库(Zustand/Redux)复杂全局状态(如"任务队列/流式结果")

AI 产品的典型状态(“必会”):

const [phase, setPhase] = useState<'idle'|'uploading'|'streaming'|'done'|'error'>('idle')
const [transcript, setTranscript] = useState('')   // 流式累加
const [errorMsg, setErrorMsg] = useState('')       // 失败原因

记忆锚:“局部 useState,轻量 Context,复杂上状态库;AI 状态用 phase 枚举”。

1.3 性能(“3 个核心指标”,Core Web Vitals)

指标含义目标值(示例)
LCP(Largest Contentful Paint)最大内容渲染时间< 2.5s
INP(Interaction to Next Paint)交互响应时间< 200ms
CLS(Cumulative Layout Shift)布局偏移(页面跳动)< 0.1

前端性能 3 招(“3 招”):

  1. 代码分割:lazy() + 路由级/组件级分包(“首屏只加载首屏”);
  2. 图片/资源:loading="lazy" + 正确尺寸 + 现代格式(“别传 4K 原图”);
  3. 长任务拆分:大计算用 Web Worker/分片(“别让主线程卡 5 秒”)。

记忆锚:“LCP 2.5、INP 200、CLS 0.1;分包懒图拆长任务”。

1.4 无障碍(“4 项”)

项要点检查方式
语义用 button 不用 div onClick;label 关联输入读屏软件/键盘走一遍
焦点焦点可见(:focus-visible)+ 顺序合理只用 Tab 键走全流程
对比文本对比度 ≥ 4.5:1(大字号 3:1)对比度工具
键盘所有交互可键盘完成(含 AI 停止/重试)不碰鼠标走一遍

记忆锚:“语义焦点对比键盘,4.5:1 是线”——“AI 产品的停止/重试按钮必须可 Tab 到达”。

🧠 记忆工具箱

口诀速记

  • 拆分:“复用状态 Props 三问,2000 行组件不及格”;
  • 状态:“局部 useState,轻量 Context,复杂上库;phase 枚举管 AI”;
  • 性能:“LCP 二点五 INP 二百 CLS 零点一”;
  • 无障碍:“语义焦点对比键盘,四点五是线”。

场景锚点

  • 组件拆分想象"“乐高”":你不是玩家(不需要拼成品),你是"设计零件的人"(“拆”)——“一块 2000 行的大积木 = 没法复用、没法测试、没法维护”;“拆成小零件 = 能复用(别的页面也能用)、能单独测(单测)、能换(换 UploadZone 不影响 TodoList)”——“乐高为什么强?因为零件标准化”。

⚠️ 易错提醒

  • “AI 生成能跑” ≠ “生产级”:“生产级 = 组件拆分 + 状态清晰 + 错误处理 + README”——“评审看的是’第二个人能不能接手’”;
  • 状态"全塞 Context" = 反模式:“大量状态进 Context = 每次变更全组件重渲染”——“共享状态要克制”;
  • 性能"只优化首屏"不够:“INP 看交互”(“AI 流式输出时打字不能卡”);
  • 无障碍"停止按钮":“AI 流式的停止/重试必须键盘可达”(“只用鼠标能点到 = 不合格”)。