Skip to content

Tối ưu hình ảnh

Hình ảnh thường chiếm 60–70% kích thước trang. Tối ưu ảnh là một trong những việc có tác động lớn nhất đến hiệu năng.

Chọn đúng định dạng

FormatDùng khiƯu điểm
WebPHầu hết trường hợpNhỏ hơn JPEG ~25–34%, hỗ trợ transparency
AVIFMuốn nén tối đaNhỏ hơn WebP ~20%, nhưng encode chậm
SVGIcon, logo, đồ họa vectorScale không vỡ, kích thước nhỏ
JPEGẢnh chụp khi cần fallbackPhổ biến, hỗ trợ rộng
PNGCần transparency, fallbackLossless

Dùng <picture> cho fallback

html
<picture>
  <source srcset="/hero.avif" type="image/avif" />
  <source srcset="/hero.webp" type="image/webp" />
  <img src="/hero.jpg" alt="Hero image" width="1200" height="600" />
</picture>

Lazy Loading

Chỉ tải ảnh khi user scroll đến gần — tránh tải ảnh không cần thiết khi vào trang.

html
<!-- Native lazy loading -->
<img src="/photo.webp" alt="Photo" loading="lazy" />

<!-- Không lazy load ảnh above the fold -->
<img src="/hero.webp" alt="Hero" loading="eager" fetchpriority="high" />

Responsive Images với srcset

Phục vụ ảnh có kích thước phù hợp với màn hình:

html
<img
  src="/photo-800.webp"
  srcset="
    /photo-400.webp  400w,
    /photo-800.webp  800w,
    /photo-1200.webp 1200w
  "
  sizes="(max-width: 600px) 400px, (max-width: 900px) 800px, 1200px"
  alt="Photo"
  width="1200"
  height="800"
/>

Kích thước & Width/Height

Luôn khai báo widthheight để tránh CLS (Cumulative Layout Shift):

html
<!-- Tốt — browser biết trước tỉ lệ ảnh, không bị layout shift -->
<img src="/photo.webp" alt="Photo" width="800" height="450" />

Nén ảnh

  • Squoosh (squoosh.app) — nén online, hỗ trợ WebP/AVIF
  • Sharp — xử lý ảnh phía server/build time với Node.js
js
// sharp — resize và convert sang WebP
import sharp from 'sharp'

await sharp('input.jpg')
  .resize(800)
  .webp({ quality: 80 })
  .toFile('output.webp')

Với React

jsx
// Next.js — dùng <Image> component (tự động tối ưu)
import Image from 'next/image'

<Image
  src="/hero.jpg"
  alt="Hero"
  width={1200}
  height={600}
  priority // tương đương loading="eager"
/>

// Vite project — dùng HTML native attributes
<img src="/hero.webp" alt="Hero" width={1200} height={600} loading="eager" />

Dựa trên roadmap.sh/frontend-performance-best-practices