Core Web Vitals (LCP, INP, CLS) — 3 số Google chấm điểm tốc độ web bạn

Google chấm web bạn qua 3 metric: LCP (web load trong bao lâu), INP (web phản hồi click bao nhanh), CLS (layout có nhảy không). Web 'pass Core Web Vitals' xếp hạng cao hơn + bounce rate thấp hơn 30-50%. Hiểu cả 3 + cách đo qua PageSpeed Insights miễn phí.

9 phút đọcCập nhật 2026-05-22
Nghe bài viết
Để Claude đọc bài cho bạn — vừa nghe vừa làm việc khác
Mục lục bài viết(22)
Sơ đồ Web Performance — các metric đo lường trải nghiệm tốc độ

Web Performance fundamentals — các metric đo lường trải nghiệm tốc độ web từ user. Core Web Vitals là tập con quan trọng nhất Google chấm điểm + dùng làm ranking factor SEO. Có thêm các metric phụ (TTFB, FCP, TBT) bổ sung context khi debug. Nguồn: Wikimedia Commons (CC BY-SA 4.0).

Hiểu đơn giản nhất

Tưởng tượng bạn đến nhà hàng. 3 yếu tố quyết định bạn quay lại:

Yếu tốNhà hàngWeb tương đương
Có nhanh khôngOrder xong, đồ ăn lên bao lâuLCP — load main content bao lâu
Có mượt khôngBạn vẫy tay, bồi bàn phản hồi ngay hay đợi 5 phútINP — click button, web phản hồi bao nhanh
Có ổn định khôngĐang ăn, bàn lung lay, ly đổCLS — content nhảy lung tung lúc đang đọc

3 chỉ số này gọi là Core Web Vitals — Google công bố 2020, dùng làm ranking factor SEO từ 2021.

MetricĐo gìGOODNEED IMPROVEMENTPOOR
LCP (Largest Contentful Paint)Element lớn nhất hiển thị trong viewport (thường ảnh hero/H1)<2.5s2.5-4s>4s
INP (Interaction to Next Paint)Lag click/tap → repaint screen<200ms200-500ms>500ms
CLS (Cumulative Layout Shift)Tổng "nhảy" của layout (0-1 unitless)<0.10.1-0.25>0.25

Pass Core Web Vitals = cả 3 đều GOOD ở P75 (75% user). Đây là gold standard Google dùng để xếp hạng.

Tại sao bạn cần biết

  • SEO ranking factor xác nhận — 2 web cùng nội dung, pass CWV xếp trước fail CWV. Google công bố từ 2021.
  • Bounce rate giảm 30-50% khi web load < 2.5s. Mỗi 1 giây chậm = mất ~7% conversion.
  • Mobile-first indexing. Google dùng data MOBILE để rank. Web "đẹp trên Mac, fail mobile" sẽ tụt ranking.
  • Marketing budget hiệu quả hơn. Chạy Facebook Ads $1000 dẫn về web load 5s = 70% bỏ trước khi xem. Fix CWV = ROI tăng 2-3x.
  • Đo được, fix được. Khác với "trải nghiệm tốt" mơ hồ, CWV có số cụ thể. Bạn biết cần fix gì + đo được kết quả.

LCP — Largest Contentful Paint

Đo: Thời gian từ lúc bạn gõ URL đến lúc element LỚN NHẤT trong viewport hiện ra.

Element lớn nhất thường là:

  • <img> hero
  • Background image của hero section
  • Block text H1 lớn
  • Video poster
  • <svg> lớn

Nguyên nhân LCP chậm

Nguyên nhân% web bịCách fix
Server response chậm (TTFB > 1s)60%CDN cache, optimize backend, upgrade hosting
Ảnh hero không optimize50%WebP/AVIF, responsive srcset, lazy load NON-hero
Render-blocking CSS/JS40%Critical CSS inline, defer JS, preload font
Web font load chậm30%font-display: swap, preload, self-host font
Third-party script đè25%Async/defer/Partytown

Quick wins LCP

  1. Preload hero image: <link rel="preload" as="image" href="/hero.webp">
  2. fetchpriority="high" trên hero <img>
  3. Font display swap: @font-face { font-display: swap; }
  4. CDN cho static (Cloudflare miễn phí)
  5. Next.js Image component với priority prop cho hero

INP — Interaction to Next Paint

Đo: Lag từ user action (click/tap/type) → screen update.

INP thay thế FID từ 2024-03-12. Khác biệt:

  • FID đo chỉ first interaction
  • INP đo MỌI interaction trong session, lấy worst case (P98)

Nguyên nhân INP cao

Nguyên nhânTriệu chứng
Long JS task (> 50ms)Click → loading spinner đợi 1 giây
Heavy React re-renderType vào input lag, ký tự xuất hiện chậm
Synchronous network callClick nút → freeze 2s đợi API
Third-party script chạy main threadLag random khi GA4/Hotjar load script
Layout thrashingDOM measure + mutate liên tục trong loop

Quick wins INP

  1. Debounce input handleruseDeferredValue (React 18+) hoặc setTimeout 100ms
  2. Code split — chỉ load component khi cần (lazy import)
  3. Web Worker cho computation nặng (Workerize, Comlink)
  4. Async cho mọi click handler — không block UI thread
  5. Defer/async cho third-party script

Đo INP local

// Add to your page (Chrome DevTools console):
new PerformanceObserver((list) => {
  list.getEntries().forEach((entry) => {
    if (entry.duration > 200) {
      console.warn(`Slow interaction: ${entry.duration}ms`, entry);
    }
  });
}).observe({ type: 'event', durationThreshold: 200, buffered: true });

CLS — Cumulative Layout Shift

Đo: Tổng "khoảng nhảy" của layout trong session. Unit: ratio (0-1+).

CLS = (impact fraction) × (distance fraction). Mỗi shift được tính.

Ví dụ CLS

Bạn đang đọc paragraph → quảng cáo banner load chậm → đè header → mọi content đẩy xuống 60px → bạn mất chỗ đọc.

Trước (height 100vh):
[ Header  ]
[ Paragraph 1 ]
[ Paragraph 2 ]

Sau (banner load, +80px):
[ Header  ]
[ Banner  ]  ← chèn vào, đẩy mọi thứ xuống
[ Paragraph 1 ]
[ Paragraph 2 ]

User đang đọc Paragraph 1 → giờ đọc Paragraph 2 (vì đã đẩy xuống). Cực bực bội, nhất là khi định click button → button bị đẩy → click nhầm.

Nguyên nhân CLS cao

Nguyên nhân% bị
Ảnh không có width/height70% — browser không reserve space
Ad/embed iframe không size50% — GA4/Facebook embed load chậm đè content
Web font swap30% — fallback font → web font đổi metrics → reflow
Inject content trên scroll20% — infinite scroll, "load more"
Animation thay đổi top/left15% — dùng transform thay vì

Quick wins CLS

  1. Mọi <img> PHẢI có width + height (browser tính aspect ratio):
    <img src="hero.jpg" width="800" height="500" alt="...">
  2. Reserve space cho ad/iframe:
    .ad-container { min-height: 250px; }
  3. font-display: optional thay vì swap (không có fallback nếu font load > 100ms)
  4. Skeleton loader thay vì empty space cho dynamic content
  5. Transform animation thay vì top/left/width

Đo Core Web Vitals — 3 cách

1. PageSpeed Insights (chuẩn nhất)

URL: https://pagespeed.web.dev/?url=YOUR-URL

Trả về:

  • Lab data (synthetic test): score 0-100 + waterfall + opportunities
  • Field data (Chrome UX Report, 28 ngày user thật): LCP/INP/CLS distribution

⚠️ Field data > Lab data. Lab có thể đẹp nhưng field chậm (vì lab dùng máy mạnh + mạng nhanh).

2. Chrome DevTools Lighthouse

Mở DevTools → tab Lighthouse → Generate Report:

  • Categories: Performance, Accessibility, Best Practices, SEO
  • Throttling: Slow 4G + 4x CPU slowdown (mô phỏng mobile thật)
  • Trả score + actionable suggestions

Hữu ích khi dev local, before/after edit.

3. Google Search Console (production tracking)

search.google.com/search-console → property → Core Web Vitals report:

  • Mobile + Desktop tabs riêng
  • URLs grouped by status (GOOD/NEEDS IMPROVEMENT/POOR)
  • Trend chart 28 ngày

Đây là nguồn data Google dùng để rank — track hàng tuần.

Ví dụ thực tế: vietcodex.com Core Web Vitals

Đo https://wiki.vietcodex.com/co-ban/api-la-gi qua PSI mobile:

LCP:  1.8s  ✅ GOOD     (hero image preload + WebP)
INP:  120ms ✅ GOOD     (MDX static, ít JS interaction)
CLS:  0.05  ✅ GOOD     (image có width/height + font display swap)

Lighthouse score:
- Performance:    95
- Accessibility:  98
- Best Practices: 100
- SEO:           100

3 lý do pass:

  1. Cloudflare CDN + Next.js standalone → TTFB ~120ms
  2. Static MDX prerender HTML → no React hydration cost
  3. Image hero có width/height + lazy loading + WebP via Cloudflare Polish

Tools bổ trợ

ToolUse caseGiá
PageSpeed InsightsAudit 1 URL ad-hocFree
Google Search ConsoleMonitor toàn site, 28 ngàyFree
Lighthouse CICI pipeline check trước deployFree
WebPageTestDeep waterfall + filmstripFree + paid
CalibreTrack lịch sử + alerts$79/tháng
SpeedCurveMonitor real user (RUM)$114/tháng
Vercel AnalyticsBuilt-in cho Vercel deployFree trên Pro

Cái gì có thể sai

Vấn đềTriệu chứngCách fix
Lab LCP 1.5s nhưng field LCP 4sLab dùng datacenter, user thật 4GTest bằng mobile thật, throttle DevTools
INP đẹp ở first load, fail sau scrollHeavy listener gắn sau hydrationOptimize event handler, debounce, lazy attach
CLS đẹp PC, fail mobileViewport mobile hẹp, image không responsivesrcset + sizes cho responsive image
LCP fail vì hero là videoVideo metadata chưa load → no LCP candidateSet poster attribute cho <video>
Pass tất cả nhưng SEO không tăngCWV chỉ là 1 trong nhiều ranking factorCombine với content quality + backlink
Sau bật Cloudflare, INP tệ hơnCloudflare Rocket Loader phá ReactDisable Rocket Loader trong Cloudflare Speed
Image lazy load heroloading="lazy" trên hero = fail LCPHero ALWAYS loading="eager" + fetchpriority="high"

Tóm tắt 1 dòng

Core Web Vitals = 3 chỉ số Google chấm điểm web: LCP < 2.5s (load nhanh), INP < 200ms (phản hồi mượt), CLS < 0.1 (layout không nhảy). Pass cả 3 ở P75 mobile = SEO rank tốt + bounce rate giảm 30-50%. Đo qua PageSpeed Insights (lab + field) hoặc Search Console (production). Quick wins: CDN + image width/height + font-display swap + defer third-party JS.

Đọc tiếp

Câu hỏi thường gặp

FID đã thay thế bằng INP — có gì khác?
FID (First Input Delay) đo độ trễ click ĐẦU TIÊN trên trang. Google retired FID 2024-03-12, thay bằng INP (Interaction to Next Paint) đo MỌI interaction trong session (click, type, tap). INP nghiêm khắc hơn — web có FID đẹp có thể fail INP nếu interaction thứ 5 chậm. Tốt: INP < 200ms. Cần cải thiện: 200-500ms. Kém: > 500ms. Nếu PageSpeed Insights cũ còn báo FID, đó là tool outdated — Google official đo INP từ tháng 3/2024.
LCP, INP, CLS — pass mức nào thì 'tốt'?
Google chia 3 mức: GOOD / NEED IMPROVEMENT / POOR. (1) LCP: <2.5s GOOD / 2.5-4s / >4s POOR. (2) INP: <200ms GOOD / 200-500ms / >500ms POOR. (3) CLS: <0.1 GOOD / 0.1-0.25 / >0.25 POOR. 'Pass Core Web Vitals' = cả 3 đều GOOD ở P75 (75% user). Google dùng metric này làm ranking factor từ 2021 — không pass thì bị penalize SEO. Đo thực tế qua Google Search Console > Core Web Vitals report (data thực, không phải lab).
PageSpeed Insights và Lighthouse khác nhau thế nào?
PageSpeed Insights (PSI) là tool web tại pagespeed.web.dev. Lighthouse là tool tích hợp trong Chrome DevTools (mở DevTools → Lighthouse tab). Khác biệt chính: (1) Source data: PSI dùng cả LAB data (mô phỏng) + FIELD data (Chrome User Experience Report — user thật trong 28 ngày). Lighthouse chỉ LAB. (2) Lab data có thể đẹp nhưng field user thật vẫn chậm — phải pass field. (3) Google ranking dùng FIELD data, không phải lab. Quy tắc: chạy Lighthouse khi dev local. Track PSI Field data qua Search Console mỗi tuần.
Web React/Next.js có dễ pass Core Web Vitals không?
Tốt hơn raw React SPA — Next.js có SSR + ISR + Image component + Font optimization built-in. Cụ thể: (1) SSR trả HTML đầy đủ → LCP nhanh (không phải đợi React render); (2) `next/image` lazy load + AVIF/WebP + size hint → giảm CLS; (3) `next/font` preload + display swap → giảm LCP; (4) Code splitting tự động → giảm JS bundle. Nhưng KHÔNG miễn phí — config sai (image không có size, font không swap, third-party JS đè) vẫn fail. Vercel deployment Next.js có dashboard 'Web Vitals' built-in để track.
Bật Cloudflare có cải thiện Core Web Vitals không?
Có — đặc biệt LCP. (1) CDN cache static → giảm TTFB (Time To First Byte) → LCP nhanh hơn 100-500ms; (2) Cloudflare Brotli compression → giảm 20-30% size HTML/CSS; (3) Polish + Mirage tự optimize image (Pro tier); (4) Early Hints (HTTP 103) preload critical resource; (5) DDoS protection → server không bị overload làm slow. CLS + INP ít liên quan CDN — phải fix ở code (size ảnh, debounce input). Pattern: Cloudflare free + Next.js Image + good font loading → 80% pass CWV mặc định.
JS third-party (GA4, Hotjar, Facebook Pixel) ảnh hưởng INP thế nào?
Rất ảnh hưởng. Mỗi script bên ngoài thêm 100-500ms parse + execute, đè main thread → INP tăng. 5 script tracking trên cùng trang có thể đẩy INP từ 50ms → 500ms. Cách fix: (1) `defer` hoặc `async` attribute cho mọi `<script>` ngoài; (2) Lazy load Hotjar/Intercom — chỉ load sau khi user scroll; (3) Self-host critical analytics (Plausible self-host, không Google); (4) Dùng Partytown move script vào web worker (off main thread). Audit qua PSI > Diagnose > 'Reduce the impact of third-party code'.
Mobile và Desktop có CWV khác nhau không? Pass cái nào?
Khác nhau RẤT — Google ranking dùng MOBILE data (mobile-first indexing từ 2021). Mobile thường fail vì: (1) Mạng 3G/4G chậm; (2) CPU mobile yếu hơn desktop 3-5x → JS execute chậm; (3) Màn hình nhỏ → CLS dễ xảy ra (ad chèn đè content). Cần pass MOBILE > Desktop. PSI có 2 tab Mobile + Desktop — focus Mobile. Test thật trên điện thoại 3-4 năm tuổi (Samsung A50, iPhone 11) thay vì iPhone 15 Pro. Chrome DevTools có 'Throttling: Slow 4G + 4x CPU slowdown' để mô phỏng.