Performance And Web Vitals

dembrandt/dembrandt-skills/skills/performance-and-web-vitals

作者 dembrandt20de5f225ea7cffe2a721ac18c1077a92769a013無授權條款68 個星標收錄於 2026年10月9日更新於 2026年10月9日儲存庫今天更新

Lighthouse audits and Core Web Vitals — LCP, CLS, INP. Use when optimising page load, layout shift, input delay, images, fonts or render-blocking resources.

AI 產生的概覽

指導使用 Lighthouse 稽核並修復網頁的 LCP、CLS、INP 等核心網頁指標。

功能
提供透過命令列、DevTools 或 Lighthouse CI 執行 Lighthouse 稽核的說明與程式碼片段,並附上目標分數表。它說明核心網頁指標(LCP、CLS、INP)的意義、目標值、常見原因與修正方式,並涵蓋圖片、字型與 JavaScript 載入。最後提供效能、無障礙與 SEO 的檢查清單。
適用情境
適用於最佳化頁面載入速度、版面位移、輸入延遲、圖片、字型或阻擋算繪的資源。也適合在部署流程中設定自動化 Lighthouse 稽核。
執行需求
僅為說明文件,未附帶指令碼。執行所述稽核需要 Node.js/npx 執行 Lighthouse 命令列,可選安裝 @lhci/cli 用於 Lighthouse CI,並需要 Chrome/Chromium 瀏覽器進行無頭稽核以及連線至受測頁面的網路存取。

Performance and Web Vitals

Run a Lighthouse Audit

bash
# CLI audit — outputs JSON and HTML reportnpx lighthouse https://example.com --output html --output-path ./lighthouse-report.html
# Headless, useful in CInpx lighthouse https://example.com --chrome-flags="--headless" --output json --output-path ./report.json
# Audit specific categories onlynpx lighthouse https://example.com --only-categories=performance,accessibility,seo

Or open Chrome DevTools → Lighthouse tab → Analyse page load.

Target scores:

CategoryTarget
Performance≥ 90
Accessibility100
Best Practices≥ 95
SEO≥ 95

Core Web Vitals

LCP — Largest Contentful Paint

How fast does the main content appear?

Target: ≤ 2.5s

LCP measures when the largest visible element (hero image, heading, video poster) renders. It is the user's perception of "did the page load?"

Common causes and fixes:

CauseFix
Unoptimised hero imageUse WebP/AVIF, correct size, fetchpriority="high"
Image not preloaded<link rel="preload" as="image" href="hero.webp">
Render-blocking CSS/JSDefer non-critical JS, inline critical CSS
Slow server responseCDN, caching headers, edge delivery
Web font blocking renderfont-display: swap or optional
html
<!-- Preload LCP image --><link rel="preload" as="image" href="hero.webp" fetchpriority="high">
<!-- LCP image: no lazy loading --><img src="hero.webp" alt="..." fetchpriority="high" width="1200" height="600">

Never use loading="lazy" on the LCP image — it delays the most important render.


CLS — Cumulative Layout Shift

Does content jump around while loading?

Target: ≤ 0.1

CLS measures unexpected layout shifts — content moving after it has rendered. Caused by images without dimensions, late-loading ads, fonts swapping, or dynamic content injected above existing content.

Common causes and fixes:

CauseFix
Images without width/heightAlways set width and height on <img>
Web font swapUse font-display: optional or preload fonts
Dynamic content above foldReserve space with min-height on containers
Late-loading ads or embedsReserve fixed dimensions for ad slots
Animations that shift layoutAnimate transform only, never top/left/width/height
html
<!-- Always include dimensions --><img src="product.jpg" width="400" height="300" alt="...">
css
/* Reserve space for dynamic content */.ad-slot { min-height: 250px; }
/* Animate transform, not layout properties */.slide-in { transform: translateY(0); transition: transform 300ms; }

INP — Interaction to Next Paint

How quickly does the page respond to user input?

Target: ≤ 200ms

INP measures the delay between a user interaction (click, tap, keyboard) and the next visual update. High INP makes the UI feel sluggish or frozen.

Common causes and fixes:

CauseFix
Heavy JS on main threadBreak into smaller tasks, use requestIdleCallback
Large event handlersDebounce/throttle scroll and resize handlers
Synchronous DOM updatesBatch DOM writes with requestAnimationFrame
Third-party scripts blockingLoad third-party scripts with async or defer
React re-rendersMemoize with useMemo, useCallback, React.memo

Images

Images are the single biggest performance lever on most pages.

html
<!-- Modern formats with fallback --><picture>  <source srcset="image.avif" type="image/avif">  <source srcset="image.webp" type="image/webp">  <img src="image.jpg" width="800" height="600" alt="..." loading="lazy"></picture>
<!-- Responsive images --><img  srcset="image-400.webp 400w, image-800.webp 800w, image-1200.webp 1200w"  sizes="(max-width: 600px) 100vw, 50vw"  src="image-800.webp"  alt="..."  width="800"  height="600"  loading="lazy">

Rules:

  • Always set width and height — prevents CLS
  • Use loading="lazy" below the fold, never on LCP image
  • Serve WebP or AVIF — typically 30–50% smaller than JPEG
  • Size images to their display size — do not serve 2000px image for a 400px slot
  • Use a CDN with automatic format conversion where possible

Fonts

Web fonts block rendering if not handled correctly.

html
<!-- Preconnect to font origin --><link rel="preconnect" href="https://fonts.googleapis.com"><link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<!-- Preload critical font file --><link rel="preload" href="/fonts/brand.woff2" as="font" type="font/woff2" crossorigin>
css
@font-face {  font-family: 'Brand';  src: url('/fonts/brand.woff2') format('woff2');  font-display: swap;     /* show fallback immediately, swap when loaded */  /* font-display: optional; — never swap, use fallback if not cached */}
  • font-display: swap — good for headings, acceptable CLS
  • font-display: optional — zero CLS, font only used if cached (best for body text)
  • Subset fonts to the characters actually used — reduces file size by 60–80%

JavaScript

html
<!-- Defer non-critical scripts --><script src="analytics.js" defer></script><script src="chat-widget.js" async></script>
<!-- Module scripts are deferred by default --><script type="module" src="app.js"></script>
  • defer: executes after HTML parsed, in order — use for most scripts
  • async: executes as soon as downloaded, out of order — use for independent scripts (analytics)
  • Never block the main thread with synchronous <script> in <head>

Lighthouse CI (automated audits)

Run Lighthouse in CI to catch regressions before deployment.

bash
# Installnpm install -g @lhci/cli
# Runlhci autorun --upload.target=temporary-public-storage
yaml
# .lighthouserc.json{  "ci": {    "assert": {      "assertions": {        "categories:performance": ["warn", { "minScore": 0.9 }],        "categories:accessibility": ["error", { "minScore": 1.0 }],        "categories:seo": ["warn", { "minScore": 0.95 }]      }    }  }}

Review Checklist

  • Lighthouse performance score ≥ 90
  • Lighthouse accessibility score = 100
  • LCP ≤ 2.5s — LCP image preloaded, no loading="lazy" on it
  • CLS ≤ 0.1 — all images have width and height, no layout-shifting animations
  • INP ≤ 200ms — no heavy synchronous JS on main thread
  • Images served as WebP or AVIF with correct dimensions
  • loading="lazy" on all below-fold images
  • Web fonts use font-display: swap or optional
  • Non-critical JS loaded with defer or async
  • Lighthouse CI configured to catch regressions in deployment pipeline

來源與署名

來源:dembrandt/dembrandt-skills位於skills/performance-and-web-vitals提交20de5f2

授權條款: 無授權條款

內容歸原作者所有。SourceWeft 從公開儲存庫中收錄這些內容。

檢舉或申請下架