Les images et les éléments <iframe>
consomment souvent plus de bande passante que les autres types de ressources. Dans le cas des éléments <iframe>
, le chargement et le rendu des pages qu'ils contiennent peuvent nécessiter un temps de traitement supplémentaire non négligeable.
Dans le cas des images à chargement différé, il peut être utile de différer le chargement des images qui se trouvent en dehors de la fenêtre d'affichage initiale pour réduire la contention de la bande passante pour les ressources plus critiques dans la fenêtre d'affichage initiale. Dans certains cas où les connexions réseau sont mauvaises, cela peut améliorer le Largest Contentful Paint (LCP) d'une page. La bande passante réattribuée peut aider les candidats LCP à se charger et à s'afficher plus rapidement.
En ce qui concerne les éléments <iframe>
, la métrique INP (Interaction to Next Paint) d'une page peut être améliorée au démarrage en les chargeant de manière différée. En effet, un <iframe>
est un document HTML complètement distinct avec ses propres sous-ressources.
Bien que les éléments <iframe>
puissent être exécutés dans un processus distinct, il n'est pas rare qu'ils partagent un processus avec d'autres threads, ce qui peut créer des conditions dans lesquelles les pages deviennent moins réactives aux entrées utilisateur.
Par conséquent, le report du chargement des images hors écran et des éléments <iframe>
est une technique intéressante, qui nécessite un effort relativement faible pour un retour sur investissement raisonnable en termes de performances. Ce module explique comment charger ces deux types d'éléments de manière différée pour offrir une expérience utilisateur plus rapide et de meilleure qualité pendant la période de démarrage critique de la page.
Charger des images de manière différée avec l'attribut loading
L'attribut loading
peut être ajouté aux éléments <img>
pour indiquer aux navigateurs comment ils doivent être chargés :
"eager"
indique au navigateur que l'image doit être chargée immédiatement, même si elle se trouve en dehors de la fenêtre d'affichage initiale. Il s'agit également de la valeur par défaut de l'attributloading
."lazy"
diffère le chargement d'une image jusqu'à ce qu'elle se trouve à une distance définie de la fenêtre d'affichage visible. Cette distance varie selon le navigateur, mais elle est souvent suffisamment grande pour que l'image se charge au moment où l'utilisateur fait défiler la page jusqu'à elle.
Il est également important de noter que si vous utilisez l'élément <picture>
, l'attribut loading
doit toujours être appliqué à son élément enfant <img>
, et non à l'élément <picture>
lui-même. En effet, l'élément <picture>
est un conteneur qui contient des éléments <source>
supplémentaires pointant vers différents candidats d'image. Le candidat choisi par le navigateur est appliqué directement à son élément enfant <img>
.
Ne pas utiliser le chargement différé pour les images qui se trouvent dans la fenêtre d'affichage initiale
Vous ne devez ajouter l'attribut loading="lazy"
qu'aux éléments <img>
positionnés en dehors de la fenêtre d'affichage initiale. Toutefois, il peut être difficile de connaître la position exacte d'un élément par rapport à la fenêtre d'affichage avant le rendu de la page. Vous devez tenir compte des différentes tailles de fenêtre d'affichage, des différents formats et des différents appareils.
Par exemple, une fenêtre d'affichage sur ordinateur peut être très différente de celle sur un téléphone mobile, car elle affiche plus d'espace vertical. Il est donc possible d'y insérer des images qui n'apparaîtraient pas dans la fenêtre d'affichage initiale d'un appareil physiquement plus petit. Les tablettes utilisées en mode portrait affichent également une quantité considérable d'espace vertical, peut-être même plus que certains ordinateurs.
Toutefois, dans certains cas, il est assez clair que vous devez éviter d'appliquer loading="lazy"
. Par exemple, vous devez absolument omettre l'attribut loading="lazy"
des éléments <img>
dans le cas des images principales ou d'autres cas d'utilisation d'images où les éléments <img>
sont susceptibles d'apparaître au-dessus de la ligne de flottaison ou près du haut de la mise en page sur n'importe quel appareil. Ceci est d'autant plus important pour les images susceptibles d'être des candidates au LCP.
Les images à chargement différé doivent attendre que le navigateur termine la mise en page pour savoir si la position finale de l'image se trouve dans la fenêtre d'affichage. Cela signifie que si un élément <img>
dans la fenêtre d'affichage visible possède un attribut loading="lazy"
, il n'est demandé qu'après le téléchargement, l'analyse et l'application de tous les CSS à la page, au lieu d'être récupéré dès qu'il est détecté par le scanner de préchargement dans le balisage brut.
Étant donné que l'attribut loading
de l'élément <img>
est compatible avec tous les principaux navigateurs, il n'est pas nécessaire d'utiliser JavaScript pour le chargement différé des images. En effet, l'ajout de code JavaScript supplémentaire à une page pour fournir des fonctionnalités déjà proposées par le navigateur affecte d'autres aspects des performances de la page, tels que l'INP.
Démonstration du chargement différé des images
Chargement différé des éléments <iframe>
Le chargement différé des éléments <iframe>
jusqu'à ce qu'ils soient visibles dans la fenêtre d'affichage peut permettre d'économiser une quantité importante de données et d'améliorer le chargement des ressources critiques nécessaires au chargement de la page de premier niveau. De plus, comme les éléments <iframe>
sont essentiellement des documents HTML entiers chargés dans un document de premier niveau, ils peuvent inclure un nombre important de sous-ressources, en particulier JavaScript, ce qui peut affecter considérablement l'INP d'une page si les tâches de ces frames nécessitent un temps de traitement important.
Les intégrations tierces sont un cas d'utilisation courant pour les éléments <iframe>
. Par exemple, les lecteurs vidéo intégrés ou les posts sur les réseaux sociaux utilisent souvent des éléments <iframe>
et nécessitent souvent un nombre important de sous-ressources, ce qui peut également entraîner une contention de la bande passante pour les ressources de la page de premier niveau. Par exemple, le chargement différé d'une vidéo YouTube intégrée permet d'économiser plus de 500 Kio lors du chargement initial de la page, tandis que le chargement différé du plug-in du bouton "J'aime" de Facebook permet d'économiser plus de 200 Kio, dont la plupart sont du JavaScript.
Dans tous les cas, chaque fois que vous avez un <iframe>
en dessous de la ligne de flottaison sur une page, vous devriez fortement envisager de le charger de manière différée s'il n'est pas essentiel de le charger au début. En effet, cela peut améliorer considérablement l'expérience utilisateur.
Attribut loading
pour les éléments <iframe>
L'attribut loading
sur les éléments <iframe>
est également compatible avec tous les principaux navigateurs. Les valeurs de l'attribut loading
et leurs comportements sont les mêmes que ceux des éléments <img>
qui utilisent l'attribut loading
:
"eager"
est la valeur par défaut. Il indique au navigateur de charger immédiatement le code HTML de l'élément<iframe>
et ses sous-ressources."lazy"
diffère le chargement du code HTML de l'élément<iframe>
et de ses sous-ressources jusqu'à ce qu'il se trouve à une distance prédéfinie de la fenêtre d'affichage.
Démonstration du chargement différé des iFrames
Façades
Au lieu de charger un élément intégré immédiatement lors du chargement de la page, vous pouvez le charger à la demande en réponse à une interaction de l'utilisateur. Pour ce faire, vous pouvez afficher une image ou un autre élément HTML approprié jusqu'à ce que l'utilisateur interagisse avec. Une fois que l'utilisateur a interagi avec l'élément, vous pouvez le remplacer par l'intégration tierce. Cette technique est appelée façade.
Un cas d'utilisation courant des façades concerne les intégrations vidéo provenant de services tiers, où l'intégration peut impliquer le chargement de nombreuses sous-ressources supplémentaires et potentiellement coûteuses (comme JavaScript) en plus du contenu vidéo lui-même. Dans ce cas, sauf s'il existe un besoin légitime de lecture automatique d'une vidéo, les vidéos intégrées nécessitent l'interaction de l'utilisateur avant la lecture en cliquant sur le bouton de lecture.
C'est une excellente occasion d'afficher une image statique visuellement semblable à la vidéo intégrée et d'économiser ainsi une bande passante considérable. Une fois que l'utilisateur clique sur l'image, celle-ci est remplacée par l'intégration <iframe>
réelle, ce qui déclenche le téléchargement du code HTML et des sous-ressources de l'élément <iframe>
tiers.
En plus d'améliorer le chargement initial de la page, un autre avantage clé est que si l'utilisateur ne lit jamais la vidéo, les ressources nécessaires à sa diffusion ne sont jamais téléchargées. Il s'agit d'un bon modèle, car il garantit que l'utilisateur ne télécharge que ce qu'il veut réellement, sans faire d'hypothèses potentiellement erronées sur ses besoins.
Les widgets de chat sont un autre excellent cas d'utilisation de la technique de façade. La plupart des widgets de chat téléchargent des quantités importantes de code JavaScript, ce qui peut avoir un impact négatif sur le chargement des pages et la réactivité aux entrées utilisateur. Comme pour tout chargement initial, le coût est encouru au moment du chargement. Toutefois, dans le cas d'un widget de chat, tous les utilisateurs n'ont pas l'intention d'interagir avec lui.
Avec une façade, il est possible de remplacer le bouton tiers "Start Chat" par un faux bouton. Une fois que l'utilisateur interagit de manière significative avec le widget (par exemple, en pointant dessus pendant une durée raisonnable ou en cliquant dessus), le widget de chat fonctionnel est inséré lorsque l'utilisateur en a besoin.
Bien qu'il soit certainement possible de créer vos propres façades, des options Open Source sont disponibles pour les tiers les plus populaires, tels que lite-youtube-embed
pour les vidéos YouTube, lite-vimeo-embed
pour les vidéos Vimeo et React Live Chat Loader pour les widgets de chat.
Bibliothèques JavaScript de chargement différé
Si vous devez charger de manière différée des éléments <video>
, des images poster
, des images chargées par la propriété CSS background-image
ou d'autres éléments non compatibles, vous pouvez le faire avec une solution de chargement différé basée sur JavaScript, telle que lazysizes ou yall.js. En effet, le chargement différé de ces types de ressources n'est pas une fonctionnalité au niveau du navigateur.<video>
En particulier, les éléments <video>
en lecture automatique et en boucle sans piste audio constituent une alternative beaucoup plus efficace que l'utilisation de GIF animés, qui peuvent souvent être plusieurs fois plus volumineux qu'une ressource vidéo de qualité visuelle équivalente. Même si ces vidéos peuvent être importantes en termes de bande passante, le chargement différé est une optimisation supplémentaire qui peut contribuer à réduire considérablement la bande passante gaspillée.
La plupart de ces bibliothèques fonctionnent à l'aide de l'API Intersection Observer et, en plus, de l'API Mutation Observer si le code HTML d'une page change après le chargement initial, pour reconnaître quand un élément entre dans la fenêtre d'affichage de l'utilisateur. Si l'image est visible (ou s'approche de la fenêtre d'affichage), la bibliothèque JavaScript remplace l'attribut non standard (souvent data-src
ou un attribut similaire) par l'attribut correct, tel que src
.
Imaginons que vous ayez une vidéo qui remplace un GIF animé, mais que vous souhaitiez la charger de manière différée avec une solution JavaScript. C'est possible avec yall.js avec le modèle de balisage suivant :
<!-- The autoplay, loop, muted, and playsinline attributes are to
ensure the video can autoplay without user intervention. -->
<video class="lazy" autoplay loop muted playsinline width="320" height="480">
<source data-src="video.webm" type="video/webm">
<source data-src="video.mp4" type="video/mp4">
</video>
Par défaut, yall.js observe tous les éléments HTML éligibles avec une classe "lazy"
. Une fois yall.js chargé et exécuté sur la page, la vidéo ne se charge que lorsque l'utilisateur la fait défiler dans la fenêtre d'affichage. À ce moment-là, les attributs data-src
des éléments <source>
enfants de l'élément <video>
sont remplacés par des attributs src
, ce qui envoie une requête pour télécharger la vidéo et la lire automatiquement.
Tester vos connaissances
Quelle est la valeur par défaut de l'attribut loading
pour les éléments <img>
et <iframe>
?
"eager"
"lazy"
Dans quels cas est-il raisonnable d'utiliser des solutions de chargement différé basées sur JavaScript ?
loading
n'est pas pris en charge, comme dans le cas des vidéos en lecture automatique destinées à remplacer les images animées ou à charger de manière différée l'image poster d'un élément <video>
.
Quand une façade est-elle une technique utile ?
À suivre : Préchargement et prérendu
Maintenant que vous maîtrisez le chargement différé des images et des éléments <iframe>
, vous êtes bien placé pour vous assurer que les pages peuvent se charger plus rapidement tout en respectant les besoins de vos utilisateurs. Toutefois, dans certains cas, le chargement spéculatif des ressources peut être souhaitable. Dans le prochain module, découvrez le préchargement et le prérendu, et comment ces techniques, lorsqu'elles sont utilisées avec précaution, peuvent accélérer considérablement la navigation vers les pages suivantes en les chargeant à l'avance.