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í.
Mục lục bài viết(22)

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àng | Web tương đương |
|---|---|---|
| Có nhanh không | Order xong, đồ ăn lên bao lâu | LCP — load main content bao lâu |
| Có mượt không | Bạn vẫy tay, bồi bàn phản hồi ngay hay đợi 5 phút | INP — 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ì | GOOD | NEED IMPROVEMENT | POOR |
|---|---|---|---|---|
| LCP (Largest Contentful Paint) | Element lớn nhất hiển thị trong viewport (thường ảnh hero/H1) | <2.5s | 2.5-4s | >4s |
| INP (Interaction to Next Paint) | Lag click/tap → repaint screen | <200ms | 200-500ms | >500ms |
| CLS (Cumulative Layout Shift) | Tổng "nhảy" của layout (0-1 unitless) | <0.1 | 0.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 optimize | 50% | WebP/AVIF, responsive srcset, lazy load NON-hero |
| Render-blocking CSS/JS | 40% | Critical CSS inline, defer JS, preload font |
| Web font load chậm | 30% | font-display: swap, preload, self-host font |
| Third-party script đè | 25% | Async/defer/Partytown |
Quick wins LCP
- Preload hero image:
<link rel="preload" as="image" href="/hero.webp"> fetchpriority="high"trên hero<img>- Font display swap:
@font-face { font-display: swap; } - CDN cho static (Cloudflare miễn phí)
- Next.js Image component với
priorityprop 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ân | Triệu chứng |
|---|---|
| Long JS task (> 50ms) | Click → loading spinner đợi 1 giây |
| Heavy React re-render | Type vào input lag, ký tự xuất hiện chậm |
| Synchronous network call | Click nút → freeze 2s đợi API |
| Third-party script chạy main thread | Lag random khi GA4/Hotjar load script |
| Layout thrashing | DOM measure + mutate liên tục trong loop |
Quick wins INP
- Debounce input handler —
useDeferredValue(React 18+) hoặcsetTimeout 100ms - Code split — chỉ load component khi cần (lazy import)
- Web Worker cho computation nặng (Workerize, Comlink)
- Async cho mọi click handler — không block UI thread
- 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/height | 70% — browser không reserve space |
| Ad/embed iframe không size | 50% — GA4/Facebook embed load chậm đè content |
| Web font swap | 30% — fallback font → web font đổi metrics → reflow |
| Inject content trên scroll | 20% — infinite scroll, "load more" |
Animation thay đổi top/left | 15% — dùng transform thay vì |
Quick wins CLS
- Mọi
<img>PHẢI cówidth+height(browser tính aspect ratio):<img src="hero.jpg" width="800" height="500" alt="..."> - Reserve space cho ad/iframe:
.ad-container { min-height: 250px; } font-display: optionalthay vì swap (không có fallback nếu font load > 100ms)- Skeleton loader thay vì empty space cho dynamic content
- 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:
- Cloudflare CDN + Next.js standalone → TTFB ~120ms
- Static MDX prerender HTML → no React hydration cost
- Image hero có width/height + lazy loading + WebP via Cloudflare Polish
Tools bổ trợ
| Tool | Use case | Giá |
|---|---|---|
| PageSpeed Insights | Audit 1 URL ad-hoc | Free |
| Google Search Console | Monitor toàn site, 28 ngày | Free |
| Lighthouse CI | CI pipeline check trước deploy | Free |
| WebPageTest | Deep waterfall + filmstrip | Free + paid |
| Calibre | Track lịch sử + alerts | $79/tháng |
| SpeedCurve | Monitor real user (RUM) | $114/tháng |
| Vercel Analytics | Built-in cho Vercel deploy | Free trên Pro |
Cái gì có thể sai
| Vấn đề | Triệu chứng | Cách fix |
|---|---|---|
| Lab LCP 1.5s nhưng field LCP 4s | Lab dùng datacenter, user thật 4G | Test bằng mobile thật, throttle DevTools |
| INP đẹp ở first load, fail sau scroll | Heavy listener gắn sau hydration | Optimize event handler, debounce, lazy attach |
| CLS đẹp PC, fail mobile | Viewport mobile hẹp, image không responsive | srcset + sizes cho responsive image |
| LCP fail vì hero là video | Video metadata chưa load → no LCP candidate | Set poster attribute cho <video> |
| Pass tất cả nhưng SEO không tăng | CWV chỉ là 1 trong nhiều ranking factor | Combine với content quality + backlink |
| Sau bật Cloudflare, INP tệ hơn | Cloudflare Rocket Loader phá React | Disable Rocket Loader trong Cloudflare Speed |
| Image lazy load hero | loading="lazy" trên hero = fail LCP | Hero 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
- CDN là gì — vì sao web load nhanh ở Hà Nội nhưng chậm ở Mỹ — CDN giảm LCP đáng kể
- Caching toàn cảnh — 5 tầng cache giữa user và database — cache pattern để fix TTFB (sắp có)
- Cloud, VPS, Shared Hosting — chọn nhà cho web theo quy mô — VPS gần user giảm TTFB
- HTML, CSS, JavaScript — 3 ngôn ngữ tạo nên mọi website — render-blocking CSS/JS là nguyên nhân #1 LCP chậm