Pengiriman Gambar Era Edge — Desain CDN 2025
Diterbitkan: 22 Sep 2025 · Waktu baca: 4 mnt · Redaksi Unified Image Tools
Untuk menumbuhkan trafik pencarian, pengiriman gambar yang cepat tidak bisa ditawar. Panduan ini menyusun poin desain edge/CDN menurut use case dan menyajikan checklist untuk menghindari jebakan produksi.
Dasar‑dasar Image CDN
- Definisikan unit transformasi (origin vs varian transform)
- Definisikan cache key (URL,
Accept
,Accept-Encoding
, DPR, dsb.) - Kadaluarsa dan invalidasi (fingerprint,
Cache-Control
,stale-while-revalidate
) - Koordinasi dengan gambar responsif (ketepatan
srcset
/sizes
)
Tautan internal: Dasar desain srcset, Pengiriman fokus INP, Priority hints & preload
Header HTTP dalam praktik
Cache-Control: public, max-age=86400, stale-while-revalidate=259200
Vary: Accept, DPR
Accept-Ranges: bytes
Timing-Allow-Origin: *
- Gunakan
Vary: Accept
untuk beralih AVIF/WebP/JPEG - Jika menambah
Vary: DPR
, hasilkan/cache varian per DPR di server - Untuk SSG/ISR, versioning URL eksplisit paling aman (mis.
hero-640.avif?v=20250922
)
Priority Hints / Early Hints
<!-- Untuk kandidat LCP -->
<link rel="preload" as="image" href="/images/hero-1200.avif" imagesrcset="..." imagesizes="(min-width: 1024px) 1200px, 90vw" fetchpriority="high" />
- Jangan menandai semuanya high priority (bisa bentrok dengan anggaran CLS)
- Jika tersedia, kirim 103 Early Hints untuk preconnect/preload lebih dini
Memisahkan transform edge vs origin
- Edge: frekuensi tinggi, negosiasi lebar/kualitas/format (AVIF/WebP)
- Origin: langkah mahal, kritis untuk fidelitas (metadata, ICC, alpha compositing)
Alat: Konverter format, Kompresi massal, Generator placeholder
Jebakan klasik
Vary
diset tapi CDN tidak cache (konfigurasi ganda)- Mengirim AVIF ke klien lama tanpa
Accept: image/avif
→ indeks rusak - Transform ganda oleh layanan optimizer dan CDN aplikasi → kehilangan kualitas
Checklist (persisten)
- [ ] Gambar LCP:
fetchpriority
dansizes
benar - [ ] Cache key via versioning URL atau
Vary
- [ ] Fallback aman (JPEG) saat transform error
- [ ]
alt
gambar + data terstruktur untuk SEO gambar
Rincian cache key
- Key yang disarankan:
URL + Accept + DPR + Width + Quality
- Normalisasi
w
/q
di fungsi edge (mis. 320/480/640/…) - Contoh header respons:
Cache-Control: public, max-age=604800, stale-while-revalidate=2592000
Vary: Accept, DPR
CDN-Cache-Status: HIT
Strategi fallback AVIF/WebP
- Pilih AVIF dahulu berdasar
Accept
, lalu WebP, fallback ke JPEG - Fallback sisi server saat timeout/error → JPEG
- Di klien,
<picture>
dengantype
membantu browser memilih (gunakansrcset type
untuk memperjelas)
<picture>
<source type="image/avif" srcset="hero.avif 1x, hero@2x.avif 2x" />
<source type="image/webp" srcset="hero.webp 1x, hero@2x.webp 2x" />
<img src="hero.jpg" alt="..." width="1200" height="630" />
</picture>
Menormalkan resize on‑the‑fly
- Set lebar tetap: 320/480/640/768/960/1200/1600/2000, terkait
sizes
- Bulatkan
w
masuk untuk hindari fragmentasi cache - Preset
q
per guna: thumbnail 60/foto 70/UI 80
Keamanan dan kontrol penyalahgunaan
- URL bertanda tangan untuk mencegah transform tak terbatas (
w
/h
/q
/fmt
bertanda tangan) - Rate limit dan circuit breaker saat gagal
- Larang filter berat yang bisa membebani CPU
Observabilitas / kontrol biaya
- Log: URL, fmt, w, q, dpr, cacheStatus, genTime, size
- Dashboard: hit rate format, ukuran median, p95 waktu generasi
- Biaya: pra‑hasilkan ukuran panas; TTL panjang untuk kurangi beban origin
Fungsi edge (pseudo)
export default async function handle(req) {
const u = new URL(req.url)
const w = normalizeWidth(u.searchParams.get('w'))
const q = normalizeQuality(u.searchParams.get('q'))
const fmt = negotiate(req.headers.get('Accept'))
const key = `${u.pathname}?w=${w}&q=${q}&fmt=${fmt}`
const cached = await caches.default.match(key)
if (cached) return cached
const out = await transform(u.pathname, { w, q, fmt })
return new Response(out.body, { headers: responseHeaders({ fmt, w, q }) })
}
Troubleshooting
- Tidak ada gambar di browser lama → perbaiki negosiasi
Accept
atau gunakan<source type>
- Generasi lambat → kurangi set lebar, preset kualitas, hindari re‑encode ganda
- Kualitas tidak konsisten → tetapkan
q
per guna; gunakan AVIFeffort
moderat
FAQ
T. Haruskah selalu memilih WebP/AVIF?
J. Seimbangkan kompatibilitas dan biaya generasi. Untuk permukaan yang kritis brand, JPEG masih bisa unggul.
T. Lebih banyak sumbu Vary
menurunkan hit rate cache?
J. Normalisasi lebar/kualitas untuk mengendalikan fragmentasi. Batasi DPR di tempat penting saja.
Ringkasan
“Cache key yang benar” dan “optimasi terbatas untuk kandidat LCP” adalah jalan tercepat meningkatkan kecepatan persepsi dan trafik pencarian. Mulai dari gambar hero dan uji A/B kecil.