Changer le thème

Guide complet d'optimisation d'images Astro : 5 astuces pour accélérer votre site de 50 %

Easton editorial illustration: cache waterfall instrument

Le mois dernier, j’ai lancé un blog technique avec Astro. En prod, le premier affichage mettait 6 secondes ! Des images de 2 à 3 Mo chacune, et sur mobile il fallait attendre longtemps avant de voir quoi que ce soit. Franchement, les perfs étaient catastrophiques.

J’ai passé deux jours sur l’optimisation d’images Astro : composant Image, formats, lazy loading, intégration CDN. Résultat : premier affichage à 1,8 s, Lighthouse performance de 62 à 95. Voir ce 95 m’a vraiment motivé.

Dans cet article, je partage les pièges et ce qui a marché :

  • Configuration complète du composant Image Astro
  • Comment choisir entre JPEG, PNG, WebP et AVIF
  • Bonnes pratiques de lazy loading
  • Intégration Cloudflare CDN pas à pas
  • Dépannage des problèmes courants

À la fin, vous pourrez aussi accélérer votre site Astro de plus de 50 %. C’est parti.

Pourquoi l’optimisation d’images Astro est si importante

Beaucoup pensent que ce n’est pas grave d’attendre quelques secondes de plus. Pourtant, les images représentent souvent 60 à 70 % du poids d’une page — le principal frein aux performances.

Sur mon ancien blog, une couverture non compressée faisait 2,5 Mo ; avec quelques captures dans l’article, la page dépassait facilement 5 à 6 Mo. Les visiteurs attendaient plusieurs secondes rien que pour les images, et le taux de rebond était effrayant.

Google impose des exigences strictes sur le chargement des images

Dans les Core Web Vitals, le LCP (Largest Contentful Paint) mesure le moment où le contenu principal est affiché. Google exige un LCP sous 2,5 s ; au-delà de 4 s, c’est considéré comme mauvais.

Pour la plupart des sites, le LCP correspond à la grande image de couverture ou de hero. Images lentes = LCP élevé = impact SEO.

Résultats concrets de l’optimisation

Avant / après sur mon blog :

Avant :

  • Premier affichage : 6,2 s
  • Lighthouse performance : 62
  • Poids total des images : environ 8 Mo
  • LCP : 4,8 s
71%
Temps de chargement réduit
De 6,2 s à 1,8 s
62→95
Lighthouse amélioré
Score performance +53 %
85%
Taille des images réduite
De 8 Mo à 1,2 Mo
1,8 s
Temps de premier affichage
De 6,2 s à 1,8 s, Lighthouse de 62 à 95

Après :

  • Premier affichage : 1,8 s (+70 %)
  • Lighthouse performance : 95 (+53 %)
  • Poids total des images : environ 1,2 Mo (-85 %)
  • LCP : 1,3 s (+73 %)

Au-delà de mes attentes. Surtout, le taux de rebond a baissé d’environ 35 % — les visiteurs restent plus longtemps.

Astro est pensé pour la performance ; gâcher tout ça à cause d’images mal optimisées serait dommage. Voyons comment corriger ça étape par étape.

Guide complet du composant Image Astro

Astro fournit <Image /> et <Picture /> pour optimiser les images. Au début, la doc sur widths, quality, inferSize m’a perdu ; il a fallu tester pour comprendre.

Usage de base : Image vs Picture

Le composant <Image /> est le plus courant :

---
import { Image } from 'astro:assets';
import coverImage from '../assets/blog-cover.jpg';
---

<Image
  src={coverImage}
  alt="Image de couverture du blog"
  width={1200}
  height={630}
/>

Il gère automatiquement :

  • La compression
  • La conversion WebP (par défaut)
  • Les images responsives
  • L’optimisation du chargement

<Picture /> va plus loin avec plusieurs formats en repli :

---
import { Picture } from 'astro:assets';
import heroImage from '../assets/hero.jpg';
---

<Picture
  src={heroImage}
  formats={['avif', 'webp', 'jpeg']}
  alt="Image hero"
  width={1920}
  height={1080}
/>

Le navigateur charge d’abord l’AVIF (le plus léger), sinon WebP, sinon JPEG. Performance et compatibilité.

Propriétés clés

widths — largeurs responsives

<Image
  src={image}
  widths={[400, 800, 1200]}
  sizes="(max-width: 768px) 400px, (max-width: 1024px) 800px, 1200px"
  alt="Image responsive"
/>

Astro génère trois tailles ; le navigateur choisit selon l’écran. Mobile = petite image, desktop = grande, moins de données et plus rapide.

quality — contrôle de la qualité

<Image
  src={image}
  quality="mid"  // ou un nombre : quality={80}
  alt="Illustration d'article"
/>
  • low : vignettes, arrière-plans
  • mid : la plupart des cas (recommandé)
  • high : exigence visuelle élevée
  • Nombre (0-100) : contrôle fin

J’utilise souvent mid ou 80 : visuellement identique, fichier 30 à 40 % plus léger.

inferSize — images distantes

<Image
  src="https://example.com/image.jpg"
  inferSize={true}
  alt="Image distante"
/>

Si vous ne connaissez pas les dimensions d’une image distante, inferSize les récupère automatiquement. Ça m’a sauvé plusieurs fois.

loading — lazy loading

<!-- Image above the fold, chargement immédiat -->
<Image src={hero} loading="eager" alt="Image hero" />

<!-- Sous le fold, lazy loading -->
<Image src={content} loading="lazy" alt="Image de contenu" />

format — format de sortie

<Image
  src={image}
  format="webp"  // webp | avif | jpeg | png
  alt="Format spécifié"
/>

Images locales vs distantes

Images locales (recommandé)

---
// Dans src/assets/ ou src/images/
import myImage from '../assets/photo.jpg';
---
<Image src={myImage} alt="Image locale" />

Optimisation, compression et bundling automatiques — à privilégier.

Images distantes

---
// Configurer les domaines autorisés dans astro.config.mjs
---
<Image
  src="https://images.unsplash.com/photo-xxx"
  width={800}
  height={600}
  alt="Image distante"
/>

Dans astro.config.mjs :

export default defineConfig({
  image: {
    domains: ['images.unsplash.com', 'cdn.example.com']
  }
});

Images dans public/

<!-- public/logo.png → /logo.png -->
<img src="/logo.png" alt="Logo" />

Attention : les fichiers dans public/ ne sont pas optimisés — réservés aux logos, favicons, petits fichiers.

Exemples concrets

Configuration réelle de mon blog :

Couverture d’article (hero, preload)

---
import { Image } from 'astro:assets';
import coverImage from '../assets/blog-cover.jpg';
---

<Image
  src={coverImage}
  alt="Guide complet d'optimisation d'images Astro"
  width={1200}
  height={630}
  format="webp"
  quality={85}
  loading="eager"
  class="blog-cover"
/>

Images dans l’article (lazy loading)

<Image
  src={screenshot}
  alt="Capture d'écran de configuration"
  width={800}
  height={450}
  format="webp"
  quality="mid"
  loading="lazy"
/>

Avatar auteur (petite icône, preload)

<Image
  src={avatar}
  alt="Avatar de l'auteur"
  width={48}
  height={48}
  format="webp"
  loading="eager"
/>

Passons au choix des formats — un sujet qui fait souvent hésiter.

Guide complet du choix des formats d’image

JPEG, PNG, WebP, AVIF… lequel choisir ? Après quelques tests, voici ce que j’en retiens.

Comparaison des quatre formats principaux

FormatCompressionTailleSupport navigateurCas d’usage
JPEGAvec perteMoyenne100 %Photos, images complexes
PNGSans pertePlus lourde100 %Transparence
WebPAvec/sans perteLégère97 %+Usage général (recommandé)
AVIFAvec/sans perteMinimale90 %+Compression maximale

JPEG — format historique, compatibilité totale

  • Avantages : support universel, bonne compression
  • Inconvénients : pas de transparence, moins efficace que WebP
  • Idéal : illustrations de blog, photos produit, portraits

PNG — sans perte, transparence

  • Avantages : qualité intacte, transparence
  • Inconvénients : fichiers 2 à 3× plus lourds que JPEG
  • Idéal : logos, icônes, fond transparent

WebP — poussé par Google, excellent compromis

  • Avantages : ~30 % plus léger que JPEG, transparence, bon support
  • Inconvénients : quelques vieux navigateurs (en 2025, rare)
  • Idéal : la plupart des cas — mon choix par défaut

AVIF — format récent, meilleure compression

  • Avantages : 20 à 30 % de moins que WebP, meilleure qualité
  • Inconvénients : support un peu plus faible, encodage plus lent
  • Idéal : exigences performance extrêmes

Arbre de décision

Transparence nécessaire ?
├─ Oui → WebP (priorité) ou PNG (repli)
└─ Non → suite

Photo ou image complexe ?
├─ Oui → WebP (priorité) ou AVIF (max perf)
└─ Non → suite

Logo ou icône ?
├─ Oui → SVG (vectoriel)
└─ Non → suite

Animation ?
└─ WebP (remplace le GIF)

Mon avis : WebP suffit dans 90 % des cas — bon support, bonne compression, simple.

Gestion de la compatibilité

Pour AVIF avec repli, utilisez <Picture> :

---
import { Picture } from 'astro:assets';
import heroImage from '../assets/hero.jpg';
---

<Picture
  src={heroImage}
  formats={['avif', 'webp', 'jpeg']}
  alt="Image hero"
  width={1920}
  height={1080}
/>

Ordre de chargement :

  1. AVIF (le plus léger)
  2. WebP (repli)
  3. JPEG (compatibilité maximale)

Les navigateurs modernes profitent du meilleur format ; les anciens ne restent pas bloqués.

Test de compression

Sur une image source de 2,5 Mo :

FormatTailleCompressionQualité visuelle
Original (PNG)2,5 Mo-Original
JPEG (quality=85)450 Ko82 %Quasi identique
WebP (quality=85)180 Ko93 %Quasi identique
AVIF (quality=85)120 Ko95 %Quasi identique

Même qualité perçue : WebP ~60 % plus léger que JPEG, AVIF ~73 %.

Mes recommandations :

  • Usage courant : WebP
  • Performance maximale : AVIF + WebP + JPEG en repli
  • Transparence : WebP en priorité, PNG en repli
  • Logos/icônes : SVG quand c’est possible — zoom sans perte

Ensuite : le lazy loading, un levier majeur pour le premier affichage.

Bonnes pratiques de lazy loading

Le lazy loading charge les images quand elles approchent du viewport, pas avant. Moins de données au premier affichage.

Principe

Les navigateurs le gèrent nativement via loading :

<img src="image.jpg" loading="lazy" alt="Image en lazy loading" />

Le composant Image Astro active le lazy loading par défaut. Pour un contrôle fin :

<!-- Lazy loading (défaut) -->
<Image src={image} loading="lazy" alt="Lazy loading" />

<!-- Chargement immédiat -->
<Image src={image} loading="eager" alt="Chargement immédiat" />

L’Intersection Observer API déclenche le chargement juste avant l’entrée dans le viewport.

Stratégie

Chargement immédiat (loading="eager") :

  • Images visibles au premier écran (hero, couverture)
  • Logo, icônes de navigation
  • Images métier clés (produit principal, avatar)
  • Tout le contenu above the fold

Lazy loading (loading="lazy") :

  • Images sous le fold
  • Illustrations et captures dans l’article
  • Vignettes de listes
  • Images de pied de page
  • Éléments décoratifs

Mon approche : 1 à 2 images en eager sur le premier écran, le reste en lazy. Premier affichage rapide sans surcharger le réseau.

Exemples concrets

Page d’accueil du blog

---
import { Image } from 'astro:assets';
---

<!-- Hero, chargement immédiat -->
<Image
  src={heroCover}
  loading="eager"
  alt="Couverture de la page d'accueil"
  width={1920}
  height={1080}
/>

<!-- Vignettes de la liste, lazy loading -->
{posts.map(post => (
  <Image
    src={post.thumbnail}
    loading="lazy"
    alt={post.title}
    width={400}
    height={225}
  />
))}

Page d’article

<!-- Couverture en haut, chargement immédiat -->
<Image
  src={article.cover}
  loading="eager"
  alt={article.title}
  width={1200}
  height={630}
/>

<!-- Images dans le corps, lazy loading -->
<Image
  src={screenshot1}
  loading="lazy"
  alt="Capture d'exemple de code"
  width={800}
  height={450}
/>

<Image
  src={screenshot2}
  loading="lazy"
  alt="Comparaison avant/après"
  width={800}
  height={450}
/>

Galerie (cas particulier)

<!-- Premières images en eager -->
{gallery.slice(0, 6).map(img => (
  <Image src={img} loading="eager" alt={img.alt} />
))}

<!-- Le reste en lazy -->
{gallery.slice(6).map(img => (
  <Image src={img} loading="lazy" alt={img.alt} />
))}

Mesure des performances

1. Lighthouse (Chrome DevTools)

F12 → onglet Lighthouse → « Analyze page load » :

  • Performance : viser 90+
  • LCP : sous 2,5 s
  • CLS : proche de 0

Avant : Performance 62, LCP 4,8 s. Après : Performance 95, LCP 1,3 s.

2. Panneau Réseau de Chrome DevTools

F12 → Network → cocher « Disable cache » → recharger :

  • Waterfall et ordre de chargement
  • Priorité des images du premier écran
  • Lazy loading au scroll

3. WebPageTest

Pour tester régions et appareils réels : WebPageTest.

Comparaison avant/après :

IndicateurAvantAprèsGain
Premier affichage6,2 s1,8 s71 %
LCP4,8 s1,3 s73 %
Poids images premier écran8 Mo1,2 Mo85 %
Score Performance629553 %

Différence nette pour l’utilisateur.

Lazy loading en place ? Voyons l’intégration CDN pour accélérer l’accès mondial.

Intégration CDN pour les images

J’hésitais au début — complexité, coût. Finalement, le quota gratuit Cloudflare suffisait largement et la config restait simple.

Pourquoi un CDN

Un CDN (Content Delivery Network) met en cache vos images sur des nœuds mondiaux ; l’utilisateur charge depuis le plus proche.

Avantages :

  • Accélération globale : Pékin depuis un nœud chinois, New York depuis un nœud US
  • Moins de charge sur l’origine : requêtes images via CDN
  • Optimisation automatique : conversion de format, compression
  • Résilience : repli si un nœud tombe

Après Cloudflare CDN, le chargement pour les visiteurs internationaux a gagné environ 60 %.

Cloudflare Image Resizing

Le service Image Resizing de Cloudflare s’intègre bien avec Astro.

Étape 1 : activer Image Resizing

Cloudflare Dashboard → votre domaine → Speed → Optimization → activer « Image Resizing »

Le plan gratuit inclut 50 000 transformations/mois — largement suffisant pour un blog perso.

Étape 2 : configurer astro.config.mjs

import { defineConfig } from 'astro/config';
import cloudflare from '@astrojs/cloudflare';

export default defineConfig({
  output: 'server', // ou 'hybrid'
  adapter: cloudflare({
    imageService: 'cloudflare' // service images Cloudflare
  }),
  image: {
    domains: ['images.unsplash.com', 'cdn.example.com']
  }
});

Étape 3 : domaines autorisés (images distantes)

export default defineConfig({
  image: {
    domains: [
      'images.unsplash.com',
      'cdn.example.com',
      'res.cloudinary.com'
    ]
  }
});

Le composant Image Astro utilisera alors le service Cloudflare pour l’optimisation.

Autres solutions CDN

Cloudinary

CDN images pro avec SDK Astro :

npm install @cloudinary/url-gen
---
import { CldImage } from 'astro-cloudinary';
---

<CldImage
  src="sample"
  width={800}
  height={600}
  alt="Image Cloudinary"
/>

Puissant (transformations, filtres, filigranes) ; quota gratuit limité au-delà du payant.

Uploadcare

Upload et traitement simplifiés :

// astro.config.mjs
export default defineConfig({
  image: {
    service: {
      entrypoint: 'uploadcare-astro',
      config: {
        publicKey: 'your-public-key'
      }
    }
  }
});

Cloudflare R2

Pour de gros volumes d’images, stockage objet R2 :

// astro.config.mjs
export default defineConfig({
  build: {
    assetsPrefix: 'https://your-r2-domain.com'
  }
});

Trafic sortant gratuit, facturation au stockage — bon rapport qualité-prix.

Points d’attention CDN

Pièges que j’ai rencontrés :

1. Mode SSR : activer l’optimisation par domaine

En SSR, activer Image Resizing pour chaque domaine dans le Dashboard Cloudflare.

2. Images distantes : domaines autorisés obligatoires

Sinon :

Image's component src parameter is not allowed for this image.

Ajoutez le domaine dans image.domains de astro.config.mjs.

3. Mode compile : optimisation au build uniquement

adapter: cloudflare({
  imageService: 'compile' // optimisation à la compilation
})

Images optimisées une fois au build — adapté aux sites statiques purs.

4. Quotas gratuits

ServiceQuota gratuitAu-delà
Cloudflare Image Resizing50 000/mois5 $ / 50 000
Cloudinary25 credits/moisÀ l’usage
Uploadcare3 Go stockage + 3 Go traficÀ l’usage
Cloudflare R210 Go stockage0,015 $/Go/mois

Un blog perso tient souvent dans le gratuit ; les projets pro doivent surveiller les coûts.

Exemple de coût :

~20 000 visites/mois, ~100 000 requêtes images :

  • Cloudflare : gratuit (dans les 50 000 transformations/mois)
  • Cloudinary : payant (~9 $/mois)
  • Uploadcare : payant (~25 $/mois)

J’ai choisi Cloudflare : économique et efficace.

Dernière partie : dépannage — la plupart des pièges que j’ai vécus.

Problèmes courants et dépannage

Ce que j’aurais aimé savoir plus tôt.

Images qui ne s’affichent pas

Symptôme : zone vide ou icône d’image cassée.

Causes et solutions :

1. Chemin d’import incorrect

// ❌ Erreur : mauvais niveau relatif
import image from './assets/photo.jpg';

// ✅ Correct : vérifier la profondeur
import image from '../assets/photo.jpg';

2. Domaine distant non autorisé

// astro.config.mjs
export default defineConfig({
  image: {
    domains: ['images.unsplash.com'] // ne pas oublier
  }
});

Message typique :

Image's component src parameter is not allowed for this image.

3. Format non supporté

Formats Astro : JPG, JPEG, PNG, WEBP, AVIF, GIF, SVG

TIFF, BMP, etc. : convertir d’abord.

Images floues ou de mauvaise qualité

1. Paramètre quality

<!-- Qualité trop basse -->
<Image src={img} quality="low" alt="Trop flou" />

<!-- Qualité augmentée -->
<Image src={img} quality={85} alt="Plus net" />

2. Résolution source insuffisante

400×300 affiché en 1200×900 = flou. Utilisez une source plus grande.

3. Tailles responsives mal configurées

<!-- ❌ Tailles trop petites -->
<Image
  src={img}
  widths={[200, 400]}
  sizes="(max-width: 1920px) 400px"
  alt="Flou sur desktop"
/>

<!-- ✅ Tailles suffisantes -->
<Image
  src={img}
  widths={[400, 800, 1200, 1920]}
  sizes="(max-width: 768px) 400px, (max-width: 1024px) 800px, 1200px"
  alt="Net sur tous les écrans"
/>

Erreurs au build

1. Échec d’installation Sharp

Error: Could not load the "sharp" module
# Réinstaller les dépendances
rm -rf node_modules package-lock.json
npm install

# Ou réinstaller sharp seul
npm uninstall sharp
npm install sharp

Version spécifique si besoin :

npm install [email protected]

2. Mémoire insuffisante

FATAL ERROR: Reached heap limit Allocation failed

Augmenter la heap Node :

# package.json
{
  "scripts": {
    "build": "NODE_OPTIONS='--max-old-space-size=4096' astro build"
  }
}

3. Format non géré par Sharp

HEIC, TIFF, etc. : convertir en JPG ou PNG avant le build.

Problèmes d’images en mode SSR

Symptôme : OK en local, images absentes sur Cloudflare Pages/Workers.

1. imageService correct

// astro.config.mjs
import cloudflare from '@astrojs/cloudflare';

export default defineConfig({
  output: 'server',
  adapter: cloudflare({
    imageService: 'cloudflare' // configuration clé
  })
});

2. Mode output

export default defineConfig({
  output: 'server', // ou 'hybrid'
  // output: 'static' ne supporte pas cloudflare imageService
});

3. Chemins des images locales

En SSR, images dans src/, pas dans public/ :

---
// ✅ Correct : src/assets/
import image from '../assets/photo.jpg';

// ❌ Erreur : public/ non optimisé
// <img src="/photo.jpg" />
---

<Image src={image} alt="Bonne approche" />

Checklist de dépannage

  1. ✓ Chemin d’import correct
  2. ✓ Format supporté
  3. ✓ Domaine distant en liste blanche
  4. ✓ Paramètre quality adapté
  5. ✓ Sharp installé correctement
  6. ✓ Config SSR correcte
  7. ✓ Erreurs dans la console navigateur
  8. ✓ Statut des requêtes images dans Network

Conclusion

Deux jours d’optimisation d’images Astro — j’espère que ça vous évitera mes erreurs.

Points clés :

  1. Composant Image : remplacer &lt;img&gt; par <Image /> — compression, formats, responsive automatiques
  2. Formats : WebP dans 90 % des cas ; AVIF + repli pour le max ; transparence → WebP ou PNG
  3. Lazy loading : 1 à 2 images eager au premier écran, le reste en lazy — -50 % de chargement initial
  4. CDN : Cloudflare, quota gratuit suffisant, ~+60 % vitesse internationale
  5. Dépannage : la plupart des cas = chemin, config domaine, Sharp

Mon blog : 6,2 s → 1,8 s, Lighthouse 62 → 95, rebond -35 %. Excellent ROI.

À faire maintenant :

  • Lighthouse (F12) sur votre site
  • Convertir en WebP ce qui peut l’être
  • loading="lazy" sous le fold
  • Cloudflare CDN si beaucoup d’images

L’optimisation d’images est progressive — chaque petit gain compte.

Des questions ou des astuces à partager ? Laissez un commentaire. Bonne accélération !

Guide complet d'optimisation d'images Astro : accélérer le site de 50 %

5 astuces pour passer de 6 s à 1,8 s au premier affichage et de 62 à 95 au Lighthouse

⏱️ Estimated time: 2 hr

  1. 1

    Step 1: Comprendre l'importance et les objectifs

    Importance de l'optimisation d'images :
    • Les images représentent souvent 60 à 70 % du poids d'une page
    • Sur mon ancien blog, une couverture non compressée faisait 2,5 Mo
    • Quelques captures et la page dépassait 5 à 6 Mo
    • Plusieurs secondes d'attente, taux de rebond élevé

    Exigences Google :
    • LCP (Largest Contentful Paint) dans les Core Web Vitals
    • Temps d'affichage du contenu principal
    • LCP sous 2,5 s requis ; au-delà de 4 s, mauvais
    • Souvent la grande image hero ou de couverture
    • LCP élevé = impact SEO

    Objectifs :
    • Premier affichage de 6,2 s à 1,8 s (+71 %)
    • Lighthouse performance de 62 à 95 (+53 %)
    • Poids images d'environ 8 Mo à 1,2 Mo (-85 %)
    • LCP de 4,8 s à 1,2 s (+75 %)
  2. 2

    Step 2: Astuce 1 : utiliser le composant Image Astro

    Avantages du composant Image :
    • Optimisation automatique format, tailles, lazy loading
    • Remplacer <img> par <Image />
    • Compression, conversion, responsive

    Étapes :
    1. Intégration image (npx astro add image si besoin)
    2. Configurer imageService dans astro.config.mjs (sharp ou squoosh)
    3. Utiliser le composant :
    import { Image } from 'astro:assets';
    <Image src={image} alt="description" />

    Chemins locaux :
    • En SSR, images dans src/, pas public/
    • Correct : import image from '../assets/photo.jpg'; <Image src={image} alt="..." />
    • public/ n'est pas optimisé
  3. 3

    Step 3: Astuces 2-3 : format et lazy loading

    Choix du format :
    • JPEG : photos, images complexes, compatibilité max
    • PNG : icônes, transparence, fichiers plus lourds
    • WebP : 30 à 50 % plus léger que JPEG, 90 % des cas
    • AVIF : 20 à 30 % de moins que WebP, repli si compatibilité requise

    Lazy loading :
    • 1 à 2 images eager au premier écran, le reste en lazy
    • Réduction de plus de 50 % du chargement initial
    • Attribut loading="lazy" ou propriété du composant Image
  4. 4

    Step 4: Astuces 4-5 : CDN et dimensionnement

    Intégration Cloudflare CDN :
    • Cloudflare Images ou stockage R2
    • Optimisation et conversion automatiques
    • Accélération via des centaines de nœuds
    • Quota gratuit adapté aux blogs

    Étapes :
    1. Activer Images ou R2 dans le Dashboard Cloudflare
    2. Configurer imageService Cloudflare
    3. Héberger ou référencer les images
    4. Charger via URL Cloudflare

    Dimensionnement :
    • srcset et sizes pour la bonne taille par appareil
    • width et height du composant Image pour éviter le CLS
  5. 5

    Step 5: Dépannage et bonnes pratiques

    Checklist :
    1. Chemin d'import
    2. Format supporté
    3. Domaine distant autorisé
    4. Paramètre quality
    5. Installation Sharp

    Problèmes courants :
    • Sharp → vérifier la version Node, npm install sharp
    • Image distante → liste blanche des domaines
    • SSR → output 'server' ou 'hybrid'

    Bonnes pratiques :
    • Processus progressif, gains cumulés
    • Chaque optimisation améliore l'expérience

    Actions immédiates :
    1. Lighthouse (F12) sur votre site
    2. Convertir en WebP
    3. loading="lazy" sous le fold
    4. Cloudflare CDN si volume d'images élevé

FAQ

Pourquoi l'optimisation d'images est-elle si importante ?
Importance :
• Les images représentent souvent 60 à 70 % du poids d'une page
• Couverture 2,5 Mo + captures = page de 5 à 6 Mo facilement
• Plusieurs secondes d'attente, taux de rebond élevé

Exigences Google :
• LCP (Largest Contentful Paint) dans les Core Web Vitals
• Contenu principal affiché — LCP sous 2,5 s, au-delà de 4 s c'est mauvais
• Souvent la grande image hero ou de couverture
• LCP élevé = impact sur le SEO
Quels résultats pour l'optimisation d'images Astro ?
Résultats :
• Premier affichage de 6,2 s à 1,8 s (+71 %)
• Lighthouse performance de 62 à 95 (+53 %)
• Poids images d'environ 8 Mo à 1,2 Mo (-85 %)
• LCP de 4,8 s à 1,2 s (+75 %)

Mon blog : rebond -35 %. Excellent retour sur investissement.
Comment utiliser le composant Image Astro ?
Avantages :
• Optimisation automatique format, tailles, lazy loading
• Remplacer <img> par <Image />
• Compression, conversion, responsive

Étapes :
1) Intégration image (npx astro add image)
2) imageService dans astro.config.mjs (sharp ou squoosh)
3) import { Image } from 'astro:assets'; <Image src={image} alt="description" />

Chemins locaux :
• SSR : images dans src/, pas public/
• Correct : import + <Image />
• public/ non optimisé
Comment choisir le format ? JPEG, PNG, WebP, AVIF ?
Formats :
• JPEG (photos, compatibilité max)
• PNG (transparence, fichiers plus lourds)
• WebP (30 à 50 % plus léger, 90 % des cas)
• AVIF (encore plus léger, repli recommandé)

Recommandations :
• WebP par défaut
• AVIF + repli pour le max
• Transparence : WebP ou PNG
Comment configurer lazy loading et CDN ?
Lazy loading :
• 1 à 2 images eager, le reste lazy
• -50 % de chargement initial
• loading="lazy" ou propriété Image

Cloudflare CDN :
• Images ou R2
• Optimisation et conversion auto
• Nœuds mondiaux, quota gratuit blog

Étapes :
1) Activer Images/R2 dans le Dashboard
2) imageService Cloudflare
3) Héberger les images
4) URLs Cloudflare
Comment dépanner les problèmes d'optimisation d'images ?
Checklist :
1) Chemin d'import
2) Format supporté
3) Domaine en liste blanche
4) Paramètre quality
5) Installation Sharp

Courant :
• Sharp → Node + npm install sharp
• Image distante → domains
• SSR → output server ou hybrid

90 % des cas : chemin, config domaine, Sharp.

13 min de lecture · Publié le: 3 déc. 2025 · Mis à jour le: 27 juil. 2026

Commentaires

Connectez-vous avec GitHub pour laisser un commentaire

Easton BlogEaston Blog