Qu'est-ce que le Lazy Loading ?
Diffère le chargement des ressources non critiques jusqu'à ce qu'elles soient nécessaires. Améliore LCP et bande passante.
Qu'est-ce que le lazy loading ?
Le lazy loading est un pattern de performance qui diffère le chargement des ressources non critiques jusqu'à ce qu'elles soient réellement nécessaires — typiquement quand la ressource est sur le point de défiler dans le viewport. Au lieu de récupérer chaque image, iframe et bundle JavaScript en avance, le navigateur ne charge que ce qui est immédiatement visible et tire le reste à la demande.
L'avantage côté utilisateur est direct : les pages se rendent plus rapidement parce que le navigateur a moins à télécharger avant le premier paint. L'avantage technique est plus intéressant : le lazy loading déplace le travail hors du chemin critique, ce qui améliore directement Largest Contentful Paint (LCP), Total Blocking Time (TBT) et les coûts de bande passante. Les utilisateurs mobiles sur connexions lentes ressentent cela le plus fortement.
Les quatre types de lazy loading que vous utiliserez réellement
1. Lazy loading natif d'images (le gain facile)
Les navigateurs modernes (Chrome 76+, Safari 15.4+, Firefox 75+) supportent un attribut natif qui diffère les images hors écran :
<img src="hero.jpg" loading="lazy" alt="..." width="800" height="600">C'est l'optimisation la moins chère et avec le plus gros levier sur le web. Un attribut, ~70% des utilisateurs couverts, pas de JavaScript requis. Les attributs width/height sont critiques — sans eux, les images en lazy loading causent des layout shifts (Cumulative Layout Shift) quand elles chargent enfin.
Mise en garde critique : n'appliquez pas le lazy loading aux images above-the-fold, particulièrement l'image LCP. Appliquer le lazy loading à l'image hero rend le LCP pire, pas meilleur, parce qu'il ajoute une étape de décision navigateur supplémentaire avant que l'élément LCP ne soit récupéré.
2. Lazy loading natif d'iframes
Le même attribut, appliqué aux iframes :
<iframe src="https://youtube.com/embed/..." loading="lazy"></iframe>Cela compte le plus pour les pages avec des vidéos YouTube embarquées, des cartes ou des widgets tiers — chaque iframe télécharge des centaines de KB et des dizaines de sous-requêtes. Leur appliquer le lazy loading peut couper le poids initial de page de mégaoctets.
3. Lazy loading de modules JavaScript (code splitting basé sur les routes)
Les single-page apps utilisent import() dynamique pour charger du code spécifique aux routes à la demande :
const Settings = lazy(() => import('./Settings'));Le bundle de la page settings n'est pas récupéré jusqu'à ce que l'utilisateur y navigue. Combiné avec le splitting basé sur les routes dans webpack, Vite ou Rollup, cela garde le bundle JS initial petit. Sans cela, chaque route SPA est expédiée dans le bundle initial, ce qui blesse le TTI sur chaque page.
4. Lazy loading personnalisé basé sur IntersectionObserver
Pour les choses que le lazy loading natif ne couvre pas — scripts tiers, lecteurs vidéo personnalisés, composants complexes — IntersectionObserver vous permet de déclencher du travail quand un élément défile près du viewport :
const obs = new IntersectionObserver((entries) => {
entries.forEach(entry => {
if (entry.isIntersecting) {
loadComponent(entry.target);
obs.unobserve(entry.target);
}
});
}, { rootMargin: '200px' });L'astuce rootMargin: '200px' pré-récupère les ressources 200px avant qu'elles n'entrent dans le viewport, donc l'utilisateur voit rarement un flash de chargement. C'est ainsi que les implémentations matures de lazy load se sentent vives plutôt que saccadées.
Ce que le lazy loading vous apporte vraiment (chiffres)
Vrais chiffres de sites de production que nous avons mesurés :
- Pages lourdes en images : 40-70% de réduction des octets initiaux quand les images below-fold sont différées.
- Amélioration LCP : 200-1500ms sur les pages où l'élément LCP rivalisait avec des images différées-mais-non-lazy. Le scanner de preload du navigateur arrête de se battre pour la bande passante.
- Réduction du bundle initial SPA : 50-80% avec le code splitting basé sur les routes. Un bundle monolithique de 3MB devient un bundle initial de 600KB plus des chunks par route.
- Économies de données mobiles : Les utilisateurs qui rebondissent avant de défiler ne téléchargent jamais le contenu below-fold. Pour les sites d'actualités/blog avec des taux de rebond élevés, c'est significatif tant pour les revenus soutenus par la publicité que pour la goodwill utilisateur.
Erreurs courantes de lazy loading
- Appliquer le lazy loading à l'image LCP. La plus grande erreur individuelle. Utilisez
fetchpriority="high"sur l'image hero et réservezloading="lazy"pour le contenu below-fold. Lancez un test de vitesse pour voir quelle image est votre élément LCP. - Oublier les attributs width/height. Les images en lazy loading sans dimensions explicites causent des layout shifts en chargeant. Les régressions CLS blessent votre score Core Web Vitals.
- Appliquer le lazy loading trop agressivement. Définir
rootMargin: '0px'ou aucune marge cause un flash d'espace vide quand le contenu défile. Utilisez un buffer de 200-500px. - Appliquer le lazy loading aux polices critiques. Les polices personnalisées dans votre chemin de rendu initial ne devraient pas être différées. Utilisez
font-display: swapet préchargez la police critique à la place. - Confondre le lazy loading avec la performance. Le lazy loading diffère le travail ; il ne l'élimine pas. Si vos scripts below-fold sont lents, leur appliquer le lazy loading ne fait que retarder la lenteur au lieu de la corriger.
- Utiliser des bibliothèques JavaScript quand le natif fonctionne. Si votre audience est sur des navigateurs modernes (95%+ maintenant), l'attribut natif
loading="lazy"bat chaque bibliothèque de lazy load JavaScript. Moins de code, moins de bugs, pas de bibliothèque à maintenir.
Lazy loading et SEO
Les moteurs de recherche rendent JavaScript, mais ils ne défilent pas à l'infini. Si votre contenu est gaté derrière du lazy loading qui nécessite de défiler pour se déclencher, Google peut ne jamais le voir. Bonnes pratiques :
- Utilisez
loading="lazy"natif pour les images — Googlebot le gère correctement. - Pour le contenu qui doit être indexé, rendez-le côté serveur. N'appliquez pas le lazy loading au body copy.
- Pour le contenu de carrousel/onglets, rendez tous les panneaux en HTML et utilisez CSS pour cacher ceux non actifs. N'appliquez pas le lazy loading au contenu d'onglets via JavaScript ou il ne sera pas indexé.
- Pour le scroll infini, fournissez des liens de pagination en fallback pour que les crawlers puissent les suivre.
Tester le lazy loading
Trois outils pour vérifier que le lazy loading fonctionne :
- Onglet Network de Chrome DevTools. Rechargez la page. Vous devriez voir des images PAS dans la cascade initiale, puis se chargeant en défilant.
- Lighthouse / PageSpeed Insights. L'audit "Defer offscreen images" attrape les opportunités manquées.
- Test sur appareil réel. Limitez votre connexion à Slow 4G dans DevTools et confirmez que la page est utilisable avant que le contenu below-fold n'arrive.
FAQ : Lazy Loading
Devrais-je utiliser loading="lazy" sur chaque image ?
Non. Les images above-the-fold, particulièrement votre élément LCP, ne devraient PAS être en lazy loading. Utilisez fetchpriority="high" sur les images critiques et réservez le lazy loading pour le contenu below-fold.
Le lazy loading nuit-il au SEO ?
Pas quand correctement implémenté. loading="lazy" natif est entièrement supporté par Googlebot. Le lazy loading personnalisé basé sur IntersectionObserver est aussi bien pour les images. Évitez d'appliquer le lazy loading au texte du corps ou au contenu critique à moins que vous n'ayez un fallback rendu côté serveur.
Quel est le support navigateur pour le lazy loading natif ?
Excellent — Chrome 76+, Edge 79+, Firefox 75+, Safari 15.4+, qui représentent tous ensemble ~95%+ des utilisateurs globaux en 2026. Les utilisateurs Safari plus anciens obtiennent toutes les images chargées immédiatement, ce qui est une dégradation gracieuse plutôt qu'une expérience cassée.
Comment le lazy loading diffère-t-il du code splitting ?
Le code splitting est le processus au moment du build qui casse votre bundle en chunks. Le lazy loading est la décision au moment de l'exécution de ne récupérer un chunk que quand il est nécessaire. Les bundlers modernes font les deux — ils splittent votre code ET configurent des appels import() dynamiques pour que les chunks chargent à la demande.
Le lazy loading peut-il faire sentir les pages plus lentes ?
Oui, si mal implémenté. Les flashes de chargement, layout shifts et contenu manquant pendant le défilement tous blessent la performance perçue. Utilisez rootMargin pour pré-récupérer tôt, définissez des dimensions explicites sur les images et UI squelette/placeholder pour les composants qui prennent du temps à charger.
Et le lazy loading des images de fond en CSS ?
Les images de fond CSS ne supportent pas le lazy loading natif. Soit inlinez-les comme <img> avec loading="lazy" (le mieux), utilisez IntersectionObserver pour ajouter le style background-image au défilement, ou acceptez que tous les fonds chargent en avance.
Comment LoadFocus mesure l'impact du lazy loading
Les optimisations de lazy loading apparaissent dans les métriques du monde réel. Lancez un test de vitesse de site web pour voir quelles images sont éligibles au lazy loading et confirmez que votre élément LCP est correctement priorisé. Utilisez les tests de charge pour valider que vos pages performent toujours bien sous trafic concurrent élevé — parfois le lazy loading déplace le travail pour qu'il soit déclenché par le comportement utilisateur de manières qui changent vos patterns de trafic backend.
Outils LoadFocus connexes
Mettez ce concept en pratique avec LoadFocus — la plateforme même qui propulse tout ce que vous venez de lire.