用途
Web Performance Operations 用于诊断和修复前端页面速度问题,其方法遵循 Core Web Vitals 的评估逻辑:field 数据决定是否存在问题,lab 数据解释原因,每项修复针对失败指标的主要子部分,而不是笼统的“分数”。服务端性能分析、负载测试和后端延迟属于 perf-ops;本技能处理的是浏览器所体验到的性能。
主要能力
- 以 CrUX p75(PSI field 块、CrUX API、Search Console)或自有 RUM 作为 field 数据来源,区分手机和桌面。无 field 数据时,明确判定为仅 lab 结论。
- 识别失败的 Core Web Vital 及其子部分:LCP = TTFB | load delay | load duration | render delay;INP = input delay | processing | presentation;CLS = 哪个元素、为什么。
- 使用 Lighthouse、DevTools Performance 面板、WebPageTest 或 cloudflare:web-perf 技能复现并生成 trace。
- 修复主要子部分,每次测量只做一个改动。
- 通过 lab 前后对比(至少 5 次运行的中位数)、发布、field 28 天确认,并用 CI 预算锁定防止回归。
阈值
在页面加载的第 75 百分位评估,移动端和桌面端分别评估,使用相同数值。INP 于 2024-03-12 取代 FID 成为 Core Web Vital。
| 指标 | 良好 | 差 | 衡量内容 | field/lab |
|---|---|---|---|---|
| LCP | <= 2.5 s | > 4 s | 加载:最大图像/文本块绘制 | 两者 |
| INP | <= 200 ms | > 500 ms | 响应性:最慢交互到下次绘制 | field;lab 仅针对执行的交互(加载代理:TBT) |
| CLS | <= 0.1 | > 0.25 | 视觉稳定性:最大意外偏移突发 | 两者(lab 仅见加载) |
| FCP | <= 1.8 s | > 3 s | 首次绘制(诊断,非 CWV) | 两者 |
| TTFB | <= 800 ms | > 1.8 s | 服务器+网络(诊断;web.dev 称其为粗略指南) | 两者 |
| TBT | <= 200 ms | > 600 ms | 加载期间主线程阻塞(Lighthouse 评分点) | 仅 lab |
两列之间为“需要改进”。Lighthouse 性能分数是加权 lab 综合分(TBT 30、LCP 25、CLS 25、FCP 10、Speed Index 10),不是 Core Web Vital,也不是排名信号。
使用方式
- FIELD:问题真实吗?CrUX p75 或自有 RUM,手机和桌面分开。无 field 数据则说明判定为仅 lab。
- METRIC:哪个 CWV 失败,哪个子部分。
- LAB:复现以获得 trace,Lighthouse、DevTools、WebPageTest。Lab 解释,field 判定。
- FIX:修复主要子部分,每次测量一个改动。
- PROVE:lab 前后对比(5 次中位数)→ 发布 → field 28 天确认 → CI 预算锁定。
跳过第 1 步是典型失败:优化用户从未感受到的 Lighthouse 分数,而真正的问题(同意横幅后的 INP、三屏以下的 CLS)在 lab 中不可见。
脚本
scripts/triage-vitals.py REPORT.json:评级 Lighthouse / PSI / CrUX 报告,并将每个发现路由到参考文档(第 3 步)。scripts/check-web-perf-facts.py --offline:编辑阈值或文字后,检查 catalog 与 SKILL.md 表格一致性;标记未说明 INP 取代 FID 的 FID 建议。scripts/check-web-perf-facts.py --live:每周新鲜度检查:web-vitals 自身阈值常量、npm 主版本、弃用项、LHCI 捆绑的 Lighthouse。
两个脚本遵循仓库脚本契约:--help 带示例、--json 信封、发现时退出码 10、仅 live 模式源不可达时退出码 7。
Craft CMS 快速对照
| 手段 | 影响 | 陷阱 |
|---|---|---|
| Blitz 静态缓存(服务器重写,部署后预热) | TTFB | 包含未生成 transform URL 的页面永不缓存:设置 generateTransformsBeforePageLoad |
.with() / .eagerly()(Craft 5) |
缓存未命中时的 TTFB | Blitz Hints 在 Blitz 5.10 中已退役;手动 eager-load |
{% cache %} |
不使用 Blitz 时的 TTFB | 不要与 Blitz 组合;不会自动对登录用户禁用 |
| Transforms:getImg()、ImageOptimize imgTag()、Imager X | LCP、CLS | 全局懒加载宏命中 hero;ImageOptimize 无 AVIF |
| craft-vite critical CSS + modulepreload | 渲染延迟、FCP | CSS 默认异步:无 critical CSS 会导致 FOUC 和 CLS |
| SEOmatic 脚本位置、按模板 .include(false);Formie JS 位置 | INP | 跟踪脚本仅在 live 渲染:测量生产环境 |
| 队列 worker(runQueueAutomatically 关闭) | TTFB、INP | 默认通过前端页面的额外请求运行作业 |
适用场景
- 前端页面速度与 Core Web Vitals 诊断和修复。
- 区分 field 数据与 lab 数据并确定优先级。
- 针对 LCP、INP、CLS 的子部分进行修复。
- 使用 CI 预算和 Lighthouse CI 锁定性能收益。
- Craft CMS 站点的性能优化。
限制
- 服务端分析、负载测试、后端延迟属于 perf-ops。
- Craft 内容建模、Twig、元素查询属于 craftcms-ops。
- Nginx/Cloudflare 配置语法属于 nginx-ops、cloudflare-ops。
- CI 工作流加固属于 ci-cd-ops。
- Laravel Mix/Webpack -> Vite、Vue 2 -> 3 迁移属于 frontend-upgrade-ops。
- 需 Chrome DevTools MCP 驱动的 lab trace 使用第三方 cloudflare:web-perf 技能(如已安装)。
- CrUX 为 Chrome 专属;与 RUM 不一致时将 RUM 细分到 Chrome 比较。
- CrUX 为 28 天滚动窗口,修复后 field 不会立即移动。
- @lhci/cli 0.15 仍捆绑 Lighthouse 12,断言应使用 metric audits、resource-summary:* 和 *-insight ids,而非 Lighthouse 13 移除的旧 audit ids。
- @builder.io/partytown 已弃用,现为 @qwik.dev/partytown(仍为 beta)。