# ✅ Checklist Tối Ưu Core Web Vitals Toàn Diện > **Phiên bản:** 2024 | **Chuẩn:** Google CWV Thresholds — LCP ≤ 2.5s | INP ≤ 200ms | CLS ≤ 0.1 --- ## 📋 Mục Lục - [1. Checklist LCP](#1-checklist-lcp) - [2. Checklist INP](#2-checklist-inp) - [3. Checklist CLS](#3-checklist-cls) - [4. Checklist Đo Lường](#4-checklist-đo-lường) - [5. Thứ Tự Ưu Tiên](#5-thứ-tự-ưu-tiên) --- ## 1. Checklist LCP > **Mục tiêu:** LCP ≤ 2.5 giây tại p75 (75th percentile) > **LCP element thường gặp:** Hero image, H1 heading, background image đầu trang ### 🖼️ Tối Ưu Định Dạng Ảnh - [ ] **Chuyển đổi ảnh sang AVIF/WebP** > Dùng `` tag với fallback: AVIF → WebP → JPEG/PNG. AVIF nhỏ hơn JPEG ~50%, WebP ~30%. Dùng Squoosh, Sharp, hoặc ImageMagick để convert batch. ```html Hero ``` - [ ] **Thiết lập `fetchpriority="high"` cho LCP image** > Chỉ áp dụng cho **duy nhất 1** ảnh LCP. Nếu dùng nhiều sẽ phản tác dụng. Thêm vào thẻ `` hoặc ``. ```html Hero ``` - [ ] **Thêm `` cho LCP image** > Đặt trong ``, trước mọi script. Dùng `imagesrcset` nếu ảnh có responsive sizes. Tránh preload quá nhiều tài nguyên (≤ 3 items). ```html ``` - [ ] **Thêm `loading="eager"` cho LCP image (không dùng `lazy`)** > Ảnh above-the-fold tuyệt đối không được `loading="lazy"`. Chỉ dùng lazy cho ảnh below-the-fold (cách viewport > 1 màn hình). ```html Hero ``` - [ ] **Thiết lập `decoding="async"` cho ảnh non-LCP** > Giúp browser decode ảnh không block main thread. LCP image nên dùng `decoding="sync"` hoặc không đặt thuộc tính này. - [ ] **Nén ảnh đúng chuẩn chất lượng** > AVIF: quality 60-70, WebP: quality 75-85, JPEG: quality 80-85. Dùng tool: Squoosh.app, Sharp (Node.js), `cwebp`, `avifenc`. - [ ] **Dùng CDN Image Optimization (Cloudinary, Imgix, Next.js Image)** > Tự động serve đúng format/size theo device. Next.js `` component xử lý tự động AVIF/WebP, lazy loading, và sizes. ### ⚡ Tối Ưu TTFB (Time to First Byte) - [ ] **TTFB ≤ 800ms (ideal ≤ 200ms)** > Đo bằng: `curl -o /dev/null -s -w "%{time_starttransfer}" https://yoursite.com`. Target: < 200ms với cache, < 800ms cold. - [ ] **Bật Server-Side Caching (HTML Cache)** > Với WordPress: dùng WP Rocket, LiteSpeed Cache. Với custom server: Redis, Varnish. Cache HTML tĩnh response trong 1-24h với stale-while-revalidate. ```nginx # Nginx example proxy_cache_valid 200 1h; add_header Cache-Control "public, max-age=3600, stale-while-revalidate=86400"; ``` - [ ] **Bật HTTP/2 hoặc HTTP/3 (QUIC)** > Kiểm tra: `curl -I --http2 https://yoursite.com`. HTTP/2 multiplexing giảm latency. Cloudflare tự động bật HTTP/3. - [ ] **Thiết lập CDN với edge caching** > Cloudflare, Fastly, AWS CloudFront. Đặt origin gần nhất với user. Bật Tiered Caching để giảm origin requests. - [ ] **Giảm server response time: tối ưu database queries** > Dùng EXPLAIN ANALYZE trong PostgreSQL/MySQL. Index các cột thường WHERE/JOIN. Dùng query cache Redis/Memcached. - [ ] **Bật Brotli/Gzip compression** > Brotli giảm ~20% so với Gzip. Kiểm tra: `curl -H "Accept-Encoding: br" -I https://yoursite.com | grep content-encoding`. ```nginx brotli on; brotli_comp_level 6; brotli_types text/html text/css application/javascript; ``` - [ ] **Resource Hints: `dns-prefetch`, `preconnect` cho third-party origins** > Preconnect cho origins quan trọng (fonts, analytics). Chỉ dùng ≤ 3 preconnect để tránh lãng phí connections. ```html ``` ### 🎨 Tối Ưu CSS & Render Blocking - [ ] **Inline Critical CSS (above-the-fold styles)** > Extract CSS cần thiết cho first viewport bằng Critical, Penthouse. Inline trực tiếp trong ` ``` - [ ] **Dùng `aspect-ratio` CSS cho dynamic images** > Khi không biết trước dimensions, dùng aspect-ratio để reserve space. ```css .image-container { aspect-ratio: 16 / 9; width: 100%; overflow: hidden; } .image-container img { width: 100%; height: 100%; object-fit: cover; } ``` - [ ] **Khai báo dimensions cho `