WebPerf: Core Web Vitals
JavaScript snippets for measuring web performance in Chrome DevTools. Execute with mcp__chrome-devtools__evaluate_script, capture output with mcp__chrome-devtools__get_console_message.
Scripts
- -
scripts/CLS.js — Cumulative Layout Shift (CLS) - INLINECODE3 — Interaction to Next Paint (INP)
- INLINECODE4 — LCP Image Entropy
- INLINECODE5 — LCP Sub-Parts
- INLINECODE6 — LCP Trail
- INLINECODE7 — LCP Video Candidate
- INLINECODE8 — Largest Contentful Paint (LCP)
Descriptions and thresholds: INLINECODE9
Common Workflows
Complete Core Web Vitals Audit
When the user asks for a comprehensive Core Web Vitals analysis or "audit CWV":
- 1. LCP.js - Measure Largest Contentful Paint
- CLS.js - Measure Cumulative Layout Shift
- INP.js - Measure Interaction to Next Paint
- LCP-Sub-Parts.js - Break down LCP timing phases
- LCP-Trail.js - Track LCP candidate evolution
LCP Deep Dive
When LCP is slow or the user asks "debug LCP" or "why is LCP slow":
- 1. LCP.js - Establish baseline LCP value
- LCP-Sub-Parts.js - Break down into TTFB, resource load, render delay
- LCP-Trail.js - Identify all LCP candidates and changes
- LCP-Image-Entropy.js - Check if LCP image has visual complexity issues
- LCP-Video-Candidate.js - Detect if LCP is a video (poster or video element)
CLS Investigation
When layout shifts are detected or the user asks "debug CLS" or "layout shift issues":
- 1. CLS.js - Measure overall CLS score
- Layout-Shift-Loading-and-Interaction.js (from Interaction skill) - Separate loading vs interaction shifts
- Cross-reference with webperf-loading skill:
- Find-Above-The-Fold-Lazy-Loaded-Images.js (lazy images causing shifts)
- Fonts-Preloaded-Loaded-and-used-above-the-fold.js (font swap causing shifts)
INP Debugging
When interactions feel slow or the user asks "debug INP" or "slow interactions":
- 1. INP.js - Measure overall INP value
- Interactions.js (from Interaction skill) - List all interactions with timing
- Input-Latency-Breakdown.js (from Interaction skill) - Break down input delay, processing, presentation
- Long-Animation-Frames.js (from Interaction skill) - Identify blocking animation frames
- Long-Animation-Frames-Script-Attribution.js (from Interaction skill) - Find scripts causing delays
Video as LCP Investigation
When LCP is a video element (detected by LCP-Video-Candidate.js):
- 1. LCP-Video-Candidate.js - Identify video as LCP candidate
- Video-Element-Audit.js (from Media skill) - Audit video loading strategy
- LCP-Sub-Parts.js - Analyze video loading phases
- Cross-reference with webperf-loading skill:
- Resource-Hints-Validation.js (check for video preload)
- Priority-Hints-Audit.js (check for fetchpriority on video)
Image as LCP Investigation
When LCP is an image (most common case):
- 1. LCP.js - Measure LCP timing
- LCP-Sub-Parts.js - Break down timing phases
- LCP-Image-Entropy.js - Analyze image complexity
- Cross-reference with webperf-media skill:
- Image-Element-Audit.js (check format, dimensions, lazy loading)
- 5. Cross-reference with webperf-loading skill:
- Find-Above-The-Fold-Lazy-Loaded-Images.js (check if incorrectly lazy)
- Priority-Hints-Audit.js (check for fetchpriority="high")
- Resource-Hints-Validation.js (check for preload)
Decision Tree
Use this decision tree to automatically run follow-up snippets based on results:
After LCP.js
- - If LCP > 2.5s → Run LCP-Sub-Parts.js to diagnose which phase is slow
- If LCP > 4.0s (poor) → Run full LCP deep dive workflow (5 snippets)
- If LCP candidate is an image → Run LCP-Image-Entropy.js and webperf-media:Image-Element-Audit.js
- If LCP candidate is a video → Run LCP-Video-Candidate.js and webperf-media:Video-Element-Audit.js
- Always run → LCP-Trail.js to understand candidate evolution
After LCP-Sub-Parts.js
- - If TTFB phase > 600ms → Switch to webperf-loading skill and run TTFB-Sub-Parts.js
- If Resource Load Time > 1500ms → Run:
1.
webperf-loading:Resource-Hints-Validation.js (check for preload/preconnect)
2.
webperf-loading:Priority-Hints-Audit.js (check fetchpriority)
3.
webperf-loading:Find-render-blocking-resources.js (competing resources)
- - If Render Delay > 200ms → Run:
1.
webperf-loading:Find-render-blocking-resources.js (blocking CSS/JS)
2.
webperf-loading:Script-Loading.js (parser-blocking scripts)
3.
webperf-interaction:Long-Animation-Frames.js (main thread blocking)
After LCP-Trail.js
- - If many LCP candidate changes (>3) → This causes visual instability, investigate:
1.
webperf-loading:Find-Above-The-Fold-Lazy-Loaded-Images.js (late-loading images)
2.
webperf-loading:Fonts-Preloaded-Loaded-and-used-above-the-fold.js (font swaps)
3.
CLS.js (layout shifts contributing to LCP changes)
- - If final LCP candidate appears late → Run webperf-loading:Resource-Hints-Validation.js
- If early candidate was replaced → Understand why initial content was pushed down (likely CLS issue)
After LCP-Image-Entropy.js
- - If entropy is very high → Image is visually complex, recommend:
- Modern formats (WebP, AVIF)
- Appropriate compression
- Potentially a placeholder strategy
- - If entropy is low → Image may be over-optimized or placeholder-like
- If large file size detected → Run webperf-media:Image-Element-Audit.js for format/sizing analysis
After LCP-Video-Candidate.js
1.
webperf-media:Video-Element-Audit.js (check poster, preload, formats)
2.
webperf-loading:Priority-Hints-Audit.js (check fetchpriority on poster)
3.
LCP-Sub-Parts.js (analyze video loading phases)
- - If poster image is LCP → Treat as image LCP (run image workflows)
After CLS.js
- - If CLS > 0.1 → Run webperf-interaction:Layout-Shift-Loading-and-Interaction.js to separate causes
- If CLS > 0.25 (poor) → Run comprehensive shift investigation:
1.
webperf-loading:Find-Above-The-Fold-Lazy-Loaded-Images.js (images without dimensions)
2.
webperf-loading:Fonts-Preloaded-Loaded-and-used-above-the-fold.js (font loading strategy)
3.
webperf-loading:Critical-CSS-Detection.js (late-loading styles)
4.
webperf-media:Image-Element-Audit.js (missing width/height)
- - If CLS = 0 → Confirm with multiple page loads (might be timing-dependent)
After INP.js
- - If INP > 200ms → Run webperf-interaction:Interactions.js to identify slow interactions
- If INP > 500ms (poor) → Run full INP debugging workflow:
1.
webperf-interaction:Interactions.js (list all interactions)
2.
webperf-interaction:Input-Latency-Breakdown.js (phase breakdown)
3.
webperf-interaction:Long-Animation-Frames.js (blocking frames)
4.
webperf-interaction:Long-Animation-Frames-Script-Attribution.js (culprit scripts)
- - If specific interaction type is slow (e.g., keyboard) → Focus analysis on that interaction type
Cross-Skill Triggers
These triggers recommend using snippets from other skills:
From LCP to Loading Skill
- - If LCP > 2.5s and TTFB phase is dominant → Use webperf-loading skill:
- TTFB.js, TTFB-Sub-Parts.js, Service-Worker-Analysis.js
- - If LCP image is lazy-loaded → Use webperf-loading skill:
- Find-Above-The-Fold-Lazy-Loaded-Images.js
- - If LCP has no fetchpriority → Use webperf-loading skill:
- Priority-Hints-Audit.js
From CLS to Loading Skill
- - If CLS caused by fonts → Use webperf-loading skill:
- Fonts-Preloaded-Loaded-and-used-above-the-fold.js
- Resource-Hints-Validation.js (for font preload)
- - If CLS caused by images → Use webperf-media skill:
- Image-Element-Audit.js (check for width/height attributes)
From INP to Interaction Skill
- - If INP > 200ms → Use webperf-interaction skill for full debugging:
- Interactions.js, Input-Latency-Breakdown.js
- Long-Animation-Frames.js, Long-Animation-Frames-Script-Attribution.js
- LongTask.js (if pre-interaction blocking suspected)
From LCP/INP to Interaction Skill
- - If render delay or interaction delay is high → Use webperf-interaction skill:
- Long-Animation-Frames.js (main thread blocking)
- LongTask.js (long tasks delaying rendering)
Multi-Metric Correlation
When multiple CWV metrics are poor, prioritize investigation:
- - If LCP > 2.5s AND CLS > 0.1 → Likely shared root cause:
1. Check for late-loading content pushing LCP element
2. Run LCP-Trail.js to see LCP candidate changes
3. Run Layout-Shift-Loading-and-Interaction.js to correlate timing
- - If LCP > 2.5s AND INP > 200ms → Main thread congestion:
1. Run Long-Animation-Frames.js
2. Run webperf-loading:Script-Loading.js
3. Run webperf-loading:JS-Execution-Time-Breakdown.js
- - If CLS > 0.1 AND INP > 200ms → Layout thrashing or interaction-triggered shifts:
1. Run Layout-Shift-Loading-and-Interaction.js
2. Run Interactions.js
3. Check if shifts occur during/after interactions
References
- -
references/snippets.md — Descriptions and thresholds for each script - INLINECODE11 — Return value schema for interpreting script output
Execute via mcp__chrome-devtools__evaluate_script → read with mcp__chrome-devtools__get_console_message.
WebPerf: 核心网页指标
用于在Chrome DevTools中测量网页性能的JavaScript代码片段。通过mcpchrome-devtoolsevaluatescript执行,使用mcpchrome-devtoolsgetconsole_message捕获输出。
脚本
- - scripts/CLS.js — 累积布局偏移 (CLS)
- scripts/INP.js — 与下一次绘制的交互 (INP)
- scripts/LCP-Image-Entropy.js — LCP图像熵
- scripts/LCP-Sub-Parts.js — LCP子部分
- scripts/LCP-Trail.js — LCP轨迹
- scripts/LCP-Video-Candidate.js — LCP视频候选
- scripts/LCP.js — 最大内容绘制 (LCP)
描述和阈值:references/snippets.md
常见工作流程
完整核心网页指标审计
当用户要求进行全面的核心网页指标分析或审计CWV时:
- 1. LCP.js - 测量最大内容绘制
- CLS.js - 测量累积布局偏移
- INP.js - 测量与下一次绘制的交互
- LCP-Sub-Parts.js - 分解LCP时间阶段
- LCP-Trail.js - 追踪LCP候选演变
LCP深度分析
当LCP较慢或用户要求调试LCP或为什么LCP慢时:
- 1. LCP.js - 建立基线LCP值
- LCP-Sub-Parts.js - 分解为TTFB、资源加载、渲染延迟
- LCP-Trail.js - 识别所有LCP候选及其变化
- LCP-Image-Entropy.js - 检查LCP图像是否存在视觉复杂度问题
- LCP-Video-Candidate.js - 检测LCP是否为视频(海报或视频元素)
CLS调查
当检测到布局偏移或用户要求调试CLS或布局偏移问题时:
- 1. CLS.js - 测量整体CLS分数
- Layout-Shift-Loading-and-Interaction.js(来自交互技能)- 区分加载与交互导致的偏移
- 与webperf-loading技能交叉引用:
- Find-Above-The-Fold-Lazy-Loaded-Images.js(导致偏移的懒加载图像)
- Fonts-Preloaded-Loaded-and-used-above-the-fold.js(导致偏移的字体切换)
INP调试
当交互感觉缓慢或用户要求调试INP或交互缓慢时:
- 1. INP.js - 测量整体INP值
- Interactions.js(来自交互技能)- 列出所有交互及其时间
- Input-Latency-Breakdown.js(来自交互技能)- 分解输入延迟、处理、呈现
- Long-Animation-Frames.js(来自交互技能)- 识别阻塞动画帧
- Long-Animation-Frames-Script-Attribution.js(来自交互技能)- 查找导致延迟的脚本
视频作为LCP调查
当LCP为视频元素时(由LCP-Video-Candidate.js检测):
- 1. LCP-Video-Candidate.js - 识别视频为LCP候选
- Video-Element-Audit.js(来自媒体技能)- 审计视频加载策略
- LCP-Sub-Parts.js - 分析视频加载阶段
- 与webperf-loading技能交叉引用:
- Resource-Hints-Validation.js(检查视频预加载)
- Priority-Hints-Audit.js(检查视频的fetchpriority)
图像作为LCP调查
当LCP为图像时(最常见情况):
- 1. LCP.js - 测量LCP时间
- LCP-Sub-Parts.js - 分解时间阶段
- LCP-Image-Entropy.js - 分析图像复杂度
- 与webperf-media技能交叉引用:
- Image-Element-Audit.js(检查格式、尺寸、懒加载)
- 5. 与webperf-loading技能交叉引用:
- Find-Above-The-Fold-Lazy-Loaded-Images.js(检查是否错误地懒加载)
- Priority-Hints-Audit.js(检查fetchpriority=high)
- Resource-Hints-Validation.js(检查预加载)
决策树
使用此决策树根据结果自动运行后续代码片段:
执行LCP.js后
- - 如果LCP > 2.5秒 → 运行LCP-Sub-Parts.js诊断哪个阶段较慢
- 如果LCP > 4.0秒(差) → 运行完整LCP深度分析工作流程(5个片段)
- 如果LCP候选是图像 → 运行LCP-Image-Entropy.js和webperf-media:Image-Element-Audit.js
- 如果LCP候选是视频 → 运行LCP-Video-Candidate.js和webperf-media:Video-Element-Audit.js
- 始终运行 → LCP-Trail.js了解候选演变
执行LCP-Sub-Parts.js后
- - 如果TTFB阶段 > 600毫秒 → 切换到webperf-loading技能并运行TTFB-Sub-Parts.js
- 如果资源加载时间 > 1500毫秒 → 运行:
1.
webperf-loading:Resource-Hints-Validation.js(检查预加载/预连接)
2.
webperf-loading:Priority-Hints-Audit.js(检查fetchpriority)
3.
webperf-loading:Find-render-blocking-resources.js(竞争资源)
1.
webperf-loading:Find-render-blocking-resources.js(阻塞CSS/JS)
2.
webperf-loading:Script-Loading.js(解析器阻塞脚本)
3.
webperf-interaction:Long-Animation-Frames.js(主线程阻塞)
执行LCP-Trail.js后
- - 如果LCP候选变化较多(>3次) → 这会导致视觉不稳定,调查:
1.
webperf-loading:Find-Above-The-Fold-Lazy-Loaded-Images.js(延迟加载的图像)
2.
webperf-loading:Fonts-Preloaded-Loaded-and-used-above-the-fold.js(字体切换)
3.
CLS.js(导致LCP变化的布局偏移)
- - 如果最终LCP候选出现较晚 → 运行webperf-loading:Resource-Hints-Validation.js
- 如果早期候选被替换 → 了解初始内容为何被推下(可能是CLS问题)
执行LCP-Image-Entropy.js后
- 现代格式(WebP、AVIF)
- 适当的压缩
- 可能的占位策略
- - 如果熵值低 → 图像可能过度优化或类似占位符
- 如果检测到大文件大小 → 运行webperf-media:Image-Element-Audit.js进行格式/尺寸分析
执行LCP-Video-Candidate.js后
1.
webperf-media:Video-Element-Audit.js(检查海报、预加载、格式)
2.
webperf-loading:Priority-Hints-Audit.js(检查海报的fetchpriority)
3.
LCP-Sub-Parts.js(分析视频加载阶段)
- - 如果海报图像是LCP → 按图像LCP处理(运行图像工作流程)
执行CLS.js后
- - 如果CLS > 0.1 → 运行webperf-interaction:Layout-Shift-Loading-and-Interaction.js区分原因
- 如果CLS > 0.25(差) → 运行全面偏移调查:
1.
webperf-loading:Find-Above-The-Fold-Lazy-Loaded-Images.js(无尺寸的图像)
2.
webperf-loading:Fonts-Preloaded-Loaded-and-used-above-the-fold.js(字体加载策略)
3.
webperf-loading:Critical-CSS-Detection.js(延迟加载的样式)
4.
webperf-media:Image-Element-Audit.js(缺少宽/高)
- - 如果CLS = 0 → 通过多次页面加载确认(可能依赖于时间)
执行INP.js后
- - 如果INP > 200毫秒 → 运行webperf-interaction:Interactions.js