
Tối ưu ảnh web: WebP, AVIF, Lazy loading, Responsive images
Ảnh thường chiếm 50-80% dung lượng trang web. Tối ưu ảnh đúng cách giảm page size, tăng tốc LCP (Largest Contentful Paint), cải thiện Core Web Vitals và tiết kiệm băng thông người dùng. Bài viết tổng hợp chiến lược hiện đại: định dạng WebP/AVIF, nén ảnh, responsive images, lazy loading, và CDN.
Chọn định dạng hiện đại: WebP và AVIF
WebP — chuẩn thực tế hiện nay
WebP (Google, dựa trên VP8) giảm 25-35% dung lượng so với JPEG/PNG tương đương, hỗ trợ lossy, lossless, alpha transparency, animation. Hỗ trợ rộng rãi: Chrome 152+, Edge, Firefox 154+, Safari 26.5+ (Baseline widely available).
# Chuyển đổi với cwebp (CLI)
cwebp -q 50 input.jpg -o output.webp
# Chuyển hàng loạt thư mục
for file in images/*; do cwebp "$file" -o "${file%.*}.webp"; done
Serve WebP với fallback JPEG qua :
AVIF — nén tốt hơn WebP
AVIF (dựa trên AV1) nén tốt hơn WebP ~20%, hỗ trợ lossy/lossless/alpha/animation. Browser support: Chrome 152+, Edge, Firefox 154+, Safari 26.5+ (Baseline widely available, trừ Opera Mini/QQ Browser).
# Chuyển đổi với avifenc
avifenc --min 0 --max 63 --speed 6 -j 4 input.jpg output.avif
# Hoặc ImageMagick 7+
magick input.jpg -quality 50 output.avif
Kết hợp AVIF → WebP → JPEG fallback:
Responsive Images — phục vụ đúng kích thước cho từng thiết bị
Hai bài toán chính: Resolution switching (cùng nội dung, khác kích thước) và Art direction (crop/chỉnh sửa khác nhau).
Resolution switching: srcset + sizes
Browser chọn ảnh từ srcset phù hợp với slot width (nhân DPR nếu cần).
Art direction: với media query
Kết hợp format + art direction
Tạo nhiều kích thước ảnh
Khuyến nghị tạo 3-5 version cho mỗi ảnh (480w, 800w, 1200w…).
# ImageMagick resize
magick input.jpg -resize 480x480 output-480w.jpg
magick input.jpg -resize 800x800 output-800w.jpg
# sharp (Node.js) batch
const sharp = require('sharp');
const sizes = [480, 800, 1200];
sizes.forEach(size =>
sharp('input.jpg').resize(size).toFile(`output-${size}w.jpg`)
);
Lazy Loading — chỉ load khi cần
Native loading="lazy" (Chrome 76+, Firefox 75+, Safari 15.4+):
Bắt buộc có width + height để tránh Cumulative Layout Shift (CLS). Ảnh lazy-loaded có width=0/height=0 trước khi load.
Không lazy load ảnh LCP (hero, above-the-fold). Dùng fetchpriority="high" cho hero image.
Công cụ nén ảnh thực tế
- Squoosh (squoosh.app) — Web app local, không upload server, so sánh side-by-side, hỗ trợ 20+ format.
- ImageOptim — macOS app lossless, drag-and-drop, xóa EXIF.
- ImageMagick (magick) — CLI cross-platform mạnh, strip metadata, progressive JPEG.
- Build-time: imagemin, sharp, gulp — tự động hóa trong CI/CD.
Đo lường hiệu quả tối ưu
Sau khi áp dụng, hãy xác minh bằng công cụ thực tế:
- Lighthouse Performance audit — Kiểm tra audit “Use modern image formats” (WebP/AVIF), “Serve images with correct dimensions”, “Efficiently encode images”.
- Chrome DevTools Network tab — Xem Size vs Transferred, kiểm tra header
Content-Type: image/webphoặcimage/avif. - WebPageTest.org — Test từ nhiều địa điểm, xem filmstrip để phát hiện LCP image chậm.
- PageSpeed Insights — Điểm số thực tế mobile/desktop, chẩn đoán ảnh quá lớn.
Mục tiêu: LCP < 2.5s, page weight giảm 30-50% so với bản chưa tối ưu.
Lỗi thường gặp cần tránh
- Thiếu width/height trên lazy-loaded image → CLS cao.
- Lazy load hero/LCP image → LCP chậm, điểm Core Web Vitals giảm.
- Chỉ dùng srcset mà không sizes → Browser không biết chọn size nào, thường chọn ảnh to nhất.
- Không strip EXIF trên ảnh public → rò rị metadata, tăng dung lượng 10-50KB/ảnh.
- Serve JPEG 100% quality — dùng quality 75-85 cho JPEG, 50-60 cho WebP/AVIF.
- Quên Vary: Accept header — CDN cache sai version (WebP cho browser không hỗ trợ).
Image CDN — tự động hóa hoàn toàn
Image CDN tự resize, convert format dựa trên Accept header, edge caching.
- Cloudinary — SaaS, free tier, f_auto/q_auto/w_800.
- Thumbor — Open-source, self-host, Python.
- Cloudflare Images — Tích hợp CF Workers.
- Next.js Image — Built-in framework.
Image CDN là giải pháp tốt nhất cho team nhỏ: chỉ cần tải ảnh gốc lên, CDN tự xử lý mọi kích thước và format phía client. Tuy nhiên, nếu cần độ kiểm soát cao hoặc muốn tự host, kết hợp ImageMagick/Sharp + Nginx rewrite là lựa chọn open-source bền vững.
Ví dụ Cloudinary:
Checklist triển khai nhanh
- [ ] Tạo WebP + AVIF cho mọi ảnh
- [ ] Tạo 3-5 responsive sizes (480w, 800w, 1200w)
- [ ] Dùng với fallback AVIF → WebP → JPEG
- [ ] Thêm width/height + alt cho mọi
- [ ] Lazy load ảnh below-the-fold: loading=”lazy”
- [ ] Không lazy load hero/LCP image, dùng fetchpriority=”high”
- [ ] Cấu hình server: Vary: Accept, Accept negotiation
- [ ] Run Lighthouse audit: “Use modern image formats”, “Serve images with correct dimensions”



Tham khảo thêm:
