mcpField
C
core-web-vitals

core-web-vitals

github.com/addyosmani开发3.0k32.4k 次安装9 周前更新
代码仓库

关于 core-web-vitals

面向 Web 开发者的 Core Web Vitals 优化技能,利用真实用户数据确定影响,并通过浏览器性能跟踪诊断 LCP、INP 和 CLS 问题。

主要功能

  1. 01优先查看页面级 CrUX 数据
  2. 02用性能跟踪诊断指标问题
  3. 03覆盖 LCP、INP 和 CLS
  4. 04区分真实用户数据与实验室结果
  5. 05提供按指标分类的优化指导

适用场景

  1. 01定位真实用户指标不佳的原因
  2. 02调查页面交互响应缓慢
  3. 03根据跟踪记录诊断布局偏移

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/addyosmani/web-quality-skills --skill core-web-vitals

安装后在 Claude Code 中输入/core-web-vitals确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

references/
CLS.md
INP.md
LCP.md

详细介绍

Core Web Vitals 优化

针对三项 Core Web Vitals 进行优化:利用现场数据识别对用户的影响,并通过浏览器跟踪诊断原因。

优化前先测量

有可运行的 URL 时,请阅读性能测量工作流。建议按以下顺序操作:

  1. 检查页面级 CrUX p75 数据;如果页面数据不可用,则使用明确标注的来源级数据作为回退。
  2. 在注明的条件下记录浏览器性能跟踪。使用 Chrome DevTools MCP 时,跟踪摘要可以将 CrUX 数据与观测到的实验室指标一并列出。
  3. 仅分析与未达标指标相关的洞察,然后检查涉及的代码和资源。
  4. 修复后重新进行条件等同的实验室测量。不要声称现场数据会立即改善;CrUX 和第一方 RUM 需要新的用户访问后才会更新。

如果只有源代码,请指出可能的原因,但没有运行时证据时,不要声称 LCP、INP 或 CLS 未达标。

三项指标

指标衡量内容良好需要改进差
LCP加载≤ 2.5s2.5s – 4s> 4s
INP交互性≤ 200ms200ms – 500ms> 500ms
CLS视觉稳定性≤ 0.10.1 – 0.25> 0.25

Google 按第 75 百分位数进行衡量——75% 的页面访问必须达到“良好”阈值。


LCP:最大内容绘制

LCP 衡量最大可见内容元素的渲染时间。通常是:

  • 主视觉图片或视频
  • 大段文本
  • 背景图片
  • <svg> 元素
常见的 LCP 问题

1. 服务器响应缓慢(TTFB > 800ms)

Fix: CDN, caching, optimized backend, edge rendering

2. 阻塞渲染的资源


<link rel="stylesheet" href="/all-styles.css">


<style>/* Critical above-fold CSS */</style>
<link rel="preload" href="/styles.css" as="style" 
      onload="this.onload=null;this.rel='stylesheet'">

3. 资源加载缓慢


<div class="hero"></div>


<link rel="preload" href="/hero.webp" as="image" fetchpriority="high">
<img src="/hero.webp" alt="Hero" fetchpriority="high">

优先使用可被发现的 <img>,并设置 fetchpriority="high"。只有在跟踪显示资源原本会被延迟发现时才添加预加载;重复或推测性的预加载可能会争抢带宽。

4. 客户端渲染延迟

// ❌ Content loads after JavaScript
useEffect(() => {
  fetch('/api/hero-text').then(r => r.json()).then(setHeroText);
}, []);

// ✅ Server-side or static rendering
// Use SSR, SSG, or streaming to send HTML with content
export async function getServerSideProps() {
  const heroText = await fetchHeroText();
  return { props: { heroText } };
}

5. 使用 Speculation Rules API 实现即时导航

对于导航路径可预测的同源网站,预渲染可能的下一页可以显著加快后续成功导航。应将其视为经测量的导航优化,而非修复当前页面 LCP 的替代方案。

<script type="speculationrules">
{
  "prerender": [{
    "where": { "href_matches": "/*" },
    "eagerness": "moderate"
  }]
}
</script>

当前 Chrome 的行为足够具体,可据此做出选择:

eagerness触发条件
conservative按下鼠标或触摸屏幕
moderate桌面端:悬停 200ms,或更早按下鼠标;移动端:视口启发式规则
eagerChrome 143+:桌面端悬停 10ms;移动端:锚点进入视口后 50ms
immediate观察到规则后立即触发

从保守设置开始,并在扩大规则范围前测量预测命中率、传输字节数、服务器负载和导航速度提升。硬编码对时序敏感的行为前,请重新查阅 Chrome 持续维护的 eagerness 文档。

注意事项:

  • 带宽/CPU 开销。 每次预渲染大致相当于加载一个完整页面。谨慎设置 where 的范围(使用 href_matches 模式,排除注销/结账页面),并避免在小型网站以外使用 immediate。
  • 副作用会提前触发。 分析、广告以及任何在加载时运行的代码,都会在预渲染开始时触发,而非在用户导航时触发。请通过 prerenderingchange 事件或 document.prerendering 控制副作用。
  • 仅适用于 Chromium。 Safari 和 Firefox 会忽略该脚本——这是一种渐进增强,绝不会导致功能退化。
LCP 优化检查清单
- [ ] TTFB < 800ms (use CDN, edge caching)
- [ ] LCP resource is discoverable in initial HTML and prioritized; preload only if the trace shows late discovery
- [ ] LCP image optimized (WebP/AVIF, correct size)
- [ ] Critical CSS inlined (< 14KB)
- [ ] No render-blocking JavaScript in <head>
- [ ] Fonts don't block text rendering (font-display: swap)
- [ ] LCP element in initial HTML (not JS-rendered)
- [ ] Speculation Rules added for likely-next navigations (moderate eagerness)
LCP 元素识别

此代码片段用于诊断当前页面会话,不是现场数据。

// Find your LCP element
new PerformanceObserver((list) => {
  const entries = list.getEntries();
  const lastEntry = entries[entries.length - 1];
  console.log('LCP element:', lastEntry.element);
  console.log('LCP time:', lastEntry.startTime);
}).observe({ type: 'largest-contentful-paint', buffered: true });

INP:交互到下一次绘制

INP 衡量一次访问期间点击、轻触和按键操作的响应速度。应分别诊断输入延迟、处理时间和呈现延迟;交互缓慢可能是处理程序运行前主线程争用、应用程序工作开销过大,或处理程序运行后渲染延迟所致。

如果实测 INP 较差,或跟踪记录指出交互缓慢,请阅读 INP 参考,了解如何解读跟踪记录、让出主线程的模式、第三方和渲染原因、单会话观察器以及第一方归因。


CLS:累积布局偏移

CLS 衡量一次页面访问期间意外发生的布局偏移。使用实测归因或跟踪记录确定发生偏移的节点及触发原因;不要假定可见的受影响元素就是导致偏移的原因。

如果实测 CLS 较差,或跟踪记录报告了偏移,请阅读 CLS 参考,了解预留空间模式、动态内容、字体和动画修复方法、调试观察器以及验证清单。


测量来源

来源用途
浏览器性能跟踪记录(Chrome DevTools MCP:performance_start_trace)观察一次加载或交互并诊断重点问题;在可用时使用随附的 CrUX 背景信息
CrUX 或 Search Console根据 p75 优先处理汇总的真实用户体验结果
Lighthouse CLI 或 PageSpeed InsightsDevTools 工具不可用时,作为受控实验室测试的备选方案
第一方 RUM按路由、设备、版本和归因对当前生产环境中的体验进行细分
原始 PerformanceObserver调试期间检查单个页面会话

不要通过 Chrome DevTools MCP 的 lighthouse_audit 处理性能问题;该功能有意用于 Lighthouse 的非性能类别。不要直接将单个实验室测试值与实测 p75 对比,并视为等价样本。

添加或审查生产环境中的数据收集时,请阅读 第一方 RUM 参考。优先使用 web-vitals 库,因为原始浏览器 API 本身并未实现每项 Core Web Vital 的全部生命周期和报告规则。


框架快速修复

Next.js
// LCP: Use next/image with priority
import Image from 'next/image';
<Image src="/hero.jpg" priority fill alt="Hero" />

// INP: Use dynamic imports
const HeavyComponent = dynamic(() => import('./Heavy'), { ssr: false });

// CLS: Image component handles dimensions automatically
React
// LCP: Preload in head
<link rel="preload" href="/hero.jpg" as="image" fetchpriority="high" />

// INP: Memoize and useTransition
const [isPending, startTransition] = useTransition();
startTransition(() => setExpensiveState(newValue));

// CLS: Always specify dimensions in img tags
Vue/Nuxt

<NuxtImg src="/hero.jpg" preload loading="eager" />


<component :is="() => import('./Heavy.vue')" />


<img :style="{ aspectRatio: '16/9' }" />

参考资料

评论

支持 Markdown