Livraison d’images à l’ère de l’edge — Conception CDN 2025
Publié: 22 sept. 2025 · Temps de lecture: 4 min · Par la rédaction Unified Image Tools
Pour accroître le trafic de recherche, une livraison d’images rapide est non négociable. Ce guide organise les points de conception edge/CDN par cas d’usage et propose une checklist pour éviter les pièges en production.
Fondamentaux d’un CDN d’images
- Définir les unités de transformation (origine vs variantes transformées)
- Définir la clé de cache (URL,
Accept
,Accept-Encoding
, DPR, etc.) - Expiration et invalidation (empreinte,
Cache-Control
,stale-while-revalidate
) - Coordination avec les images responsives (justesse de
srcset
/sizes
)
Liens internes: Bases de srcset, Livraison focalisée INP, Priority hints & preload
En‑têtes HTTP en pratique
Cache-Control: public, max-age=86400, stale-while-revalidate=259200
Vary: Accept, DPR
Accept-Ranges: bytes
Timing-Allow-Origin: *
- Utilisez
Vary: Accept
pour alterner AVIF/WebP/JPEG - Si vous ajoutez
Vary: DPR
, générez/mettez en cache des variantes par DPR côté serveur - Pour SSG/ISR, le versionnage d’URL explicite reste le plus sûr (ex.
hero-640.avif?v=20250922
)
Priority Hints / Early Hints
<!-- Pour les candidats LCP -->
<link rel="preload" as="image" href="/images/hero-1200.avif" imagesrcset="..." imagesizes="(min-width: 1024px) 1200px, 90vw" fetchpriority="high" />
- Ne marquez pas tout en haute priorité (peut entrer en conflit avec le budget CLS)
- Si possible, envoyez un 103 Early Hints pour preconnect/preload plus tôt
Scinder transformations edge vs origine
- Edge: opérations fréquentes, négociation largeur/qualité/format (AVIF/WebP)
- Origine: étapes coûteuses, cruciales pour la fidélité (métadonnées, ICC, alpha)
Outils: Convertisseur de formats, Compression en masse, Générateur de placeholders
Pièges classiques
Vary
défini mais CDN ne met pas en cache (double configuration)- Retour AVIF à des clients anciens sans
Accept: image/avif
→ index cassés - Double transformation par service d’optimisation et CDN d’app → perte de qualité
Checklist (persistante)
- [ ] Images LCP:
fetchpriority
etsizes
corrects - [ ] Clés de cache via versionnage d’URL ou
Vary
- [ ] Fallback sûr (JPEG) en cas d’erreur de transformation
- [ ]
alt
image + données structurées pour le SEO image
Détails des clés de cache
- Clés suggérées:
URL + Accept + DPR + Width + Quality
- Normalisez
w
/q
dans les fonctions edge (ex. 320/480/640/…) - Exemple d’en‑têtes de réponse:
Cache-Control: public, max-age=604800, stale-while-revalidate=2592000
Vary: Accept, DPR
CDN-Cache-Status: HIT
Stratégie de fallback AVIF/WebP
- Choisir d’abord AVIF selon
Accept
, puis WebP, fallback JPEG - Fallback côté serveur lors de timeouts/erreurs → JPEG
- Côté client,
<picture>
avectype
aide le navigateur à choisir (utilisezsrcset type
pour expliciter la négociation)
<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>
Normaliser le redimensionnement à la volée
- Jeu de largeurs fixe: 320/480/640/768/960/1200/1600/2000, relié à
sizes
- Arrondir
w
pour éviter la fragmentation du cache - Préréglages
q
par usage: vignettes 60/photos 70/UI 80
Sécurité et abus
- URLs signées pour empêcher les transformations illimitées (
w
/h
/q
/fmt
signés) - Rate limiting et disjoncteur sur les échecs
- Interdire les filtres lourds qui peuvent provoquer du DoS CPU
Observabilité / maîtrise des coûts
- Logs: URL, fmt, w, q, dpr, cacheStatus, genTime, size
- Tableaux de bord: taux d’usage des formats, tailles médianes, p95 temps de génération
- Coûts: pré‑générer tailles chaudes; TTL longs pour réduire la charge d’origine
Fonction 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 }) })
}
Dépannage
- Pas d’image sur navigateurs anciens → corriger la négociation
Accept
ou utiliser<source type>
- Génération lente → réduire l’ensemble des largeurs, prérégler qualité, éviter double ré‑encodage
- Qualité inconstante → fixer
q
par usage; AVIFeffort
modéré
FAQ
Q. Faut‑il toujours préférer WebP/AVIF ?
R. Équilibrez compatibilité et coût de génération. Pour des surfaces marque‑critiques, JPEG peut rester gagnant.
Q. Davantage d’axes Vary
n’abaisse‑t‑il pas le taux de hit cache ?
R. Normalisez largeur/qualité pour maîtriser la fragmentation. Limitez le DPR là où il compte.
Résumé
« De bonnes clés de cache » et « une optimisation limitée aux candidats LCP » sont le chemin le plus court pour améliorer vitesse perçue et trafic de recherche. Commencez par les images héros et testez en A/B à petite échelle.