用途
该技能用于在存在性能需求、用户或监控反馈变慢、Core Web Vitals 低于阈值、怀疑引入性能回归,或正在构建处理大数据量/高流量功能时,指导对应用进行性能优化。它明确反对在没有证据的情况下优化,认为过早优化带来的复杂度成本高于其收益。
核心原则
先测量再优化。没有测量的性能工作只是猜测,猜测会导致过早优化。流程为:测量建立基线 → 定位真实瓶颈(而非假设)→ 修复该瓶颈 → 复测并决定保留或回退 → 加监控或测试防止回归。
Core Web Vitals 目标
- LCP(最大内容绘制):良好 ≤ 2.5s,需改进 ≤ 4.0s,差 > 4.0s
- INP(交互到下次绘制):良好 ≤ 200ms,需改进 ≤ 500ms,差 > 500ms
- CLS(累积布局偏移):良好 ≤ 0.1,需改进 ≤ 0.25,差 > 0.25
测量方式
两种互补方式并用:合成测试(Lighthouse、DevTools Performance 面板)条件可控、可复现,适合 CI 回归检测和隔离具体问题;RUM(web-vitals 库、CrUX)是真实条件下的真实用户数据,用于验证修复是否真正改善用户体验。前端可用 web-vitals 的 onLCP、onINP、onCLS 采集;后端可用响应时间日志、APM、带计时的数据库查询日志,或 console.time/console.timeEnd 做简单计时。
定位瓶颈
技能提供按症状排查的决策树:首屏加载慢可查包体积与代码分割、TTFB 网络瀑布(DNS、TCP/TLS、服务端等待)、渲染阻塞资源;交互卡顿可查主线程长任务(>50ms)、重渲染、布局抖动;导航后慢可查 API 响应与客户端渲染;后端慢可查数据库查询与索引、连接池、内存与 CPU、锁竞争与 GC。并给出前端与后端常见症状、可能原因与排查手段的对照表。
修复模式
后端反模式包括:N+1 查询(应在同一查询中 join/include 取关联数据)、无界数据获取(列表端点必须分页并稳定排序)、忽略索引的查询(用 EXPLAIN ANALYZE 测量,按查询形态建索引,注意低选择性值、前导通配符、列上函数等情况,且每个索引都会增加写入成本)、连接池耗尽(每进程一个池,实例数×max 不超过数据库连接上限,无界实例场景用 pgbouncer、RDS Proxy 等多路复用)、缓存缺失(缓存昂贵且读远多于写的数据,键必须包含所有影响响应的输入,明确失效策略与可接受陈旧窗口,防止热键击穿)。前端反模式包括:图片未优化(声明宽高、LCP 图用 fetchpriority="high"、现代格式与 srcset/sizes、首屏下懒加载)、不必要的重渲染(提升常量,React.memo 与 useMemo 仅用于 profile 证明昂贵的场景)、包体积过大(路由级代码分割、Suspense 懒加载重型少用功能)。
验证与回退
修复在复测前只是假设。需用与基线相同的方式复测(相同命令、条件、固定预算),一次只改一项,比较增量是否超过运行间波动。结果超过阈值且测试通过则保留并在提交信息中记录前后数字;在噪声范围内、变差、或改善但测试变红,一律回退。中性结果视为回退而非保留。正确性优先于指标。所有尝试(含回退的)应记录在 PR 描述或 PERF.md 中,避免重复尝试已失败的方案。
回归防护
守护用户真正感知的指标。面向用户时用两层:合成 CI 门禁(性能预算,重复测量或比较中位数/趋势以避免抖动)与线上监控(RUM 的 p75 变化告警,用归因数据定位原因)。技能给出预算示例:JS 包 < 200KB gzip、CSS < 50KB gzip、首屏图片 < 200KB、字体 < 100KB、API 响应 < 200ms(p95)、4G 下 TTI < 3.5s、Lighthouse 性能分 ≥ 90,并给出 bundlesize 与 Lighthouse CI 的 CI 命令。
适用场景与限制
适用于有性能需求或证据表明存在性能问题的前后端与数据库优化。不适用于尚无问题证据时的提前优化。技能还列出常见合理化借口与对应事实、红旗清单,以及变更后的验证清单(前后测量数字、复测方式一致、改善超过波动、未达标改动已回退、尝试已记录、瓶颈已定位、Core Web Vitals 达标、包体积未显著增长、无 N+1、新索引有查询计划依据、新缓存说明键与失效方式、有回归检测手段、现有测试仍通过)。