SEO CAMP Day Lille 2019 : Lazy Loading : « Sois fainéant, sois fainéant, tu vivras content ! »


Comment, grâce à la mise en place simple et rapide du Lazy Loading, peut-on gagner en performance et donc en visibilité ? C’est le sujet que nous avons choisi d’aborder lors du dernier SEO Camp Lille. Retour sur notre présentation.


Pierre MONCLIN et Bastien MONTOIS ont eu le plaisir d’intervenir vendredi 11 janvier au SEO CAMP Day Lille 2019, un évènement où se rencontrent spécialistes du référencement et passionnés lors de conférences consacrées au SEO. 

La présentation est également disponible directement sur SlideShare.

Rappel : le Lazy Loading, qu’est ce que c’est ?

Le Lazy Lading, ou chargement paresseux en français, est une technique qui permet de différer le chargement de contenus et ressources tant qu’ils ne sont pas nécessaires ou visibles à l’écran pour l’utilisateur.

Exemple de lazy loading d’image. Une première image est d’abord affichée lors du chargement de la page. Dès que l’utilisateur fait défiler la page, l’image finale est chargée.

Cette pratique peut être utilisée sur différentes ressources de la page. Si vous n’utilisez pas tout de suite un fichier JavaScript par exemple, il est préférable de le charger ultérieurement pour ainsi réduire le temps de chargement de la page et donc proposer une expérience utilisateur (UX) plus fluide.

On se concentre généralement sur les images car elles représentent un poids conséquent lors du chargement d’un site, mais les techniques évoquées par la suite peuvent également s’appliquer à différents types de resources (vidéo, iframe, fichier de style CSS, etc.)

Grâce à l’outil Lighthouse de Google, vous pouvez désormais identifier facilement les images qui sont susceptibles d’être chargées par défaut et donc que vous allez pouvoir optimiser.

Techniques et mise en place pour les images

La première étape consiste à empêcher le chargement des images à l’avance. Pour chaque image chargée grâce à la balise img, le navigateur utilise l’attribut src pour déclencher le chargement.

Placez d’abord l’URL de l’image dans un attribut autre que src. Nous utiliserons l’attribut data-src de la balise image.

Maintenant que src est vide, le navigateur ne déclenche pas le chargement de l’image.

Pour plus d’ergonomie et une meilleur expérience utilisateur, vous pouvez mettre une image de remplacement beaucoup plus petite dans l’attribut src de toutes vos images chargées de manière différée. Cela permettra de charger qu’une seule fois cette image réduite, et non plus l’ensemble de vos images.

Enfin, pour pouvoir identifier les images à charger de manière différée, nous leur incluons une classe à l’aide de l’attribut class. On utilisera ici lazy.

Il faut ensuite spécifier au navigateur quand charger l’image. Pour cela, nous allons devoir vérifier quand l’image entre dans l’espace visible de la fenêtre du navigateur. Deux méthodes sont disponibles.

Déclencher le chargement de l’image à l’aide d’événements Javascript

Dans cette technique, nous utilisons des écouteurs d’événement sur les événements scrollresize et orientationChange dans le navigateur. Lorsque l’utilisateur fera défiler la page, modifiera la taille de la fenêtre ou pivotera son smartphone d’un portrait à paysage, on vérifiera les images qui sont visibles à l’écran et l’on déclenchera leur chargement.

Nous trouvons toutes les images sur la page qui doivent être affichées en différé et qui n’ont pas encore été chargées. A partir de ces images, nous vérifions celles qui sont maintenant dans la fenêtre d’affichage. Si elles sont entrées dans la fenêtre d’affichage, nous choisissons l’URL de l’attribut data-src et la mettons dans l’attribut src. Cela déclenche le chargement de l’image. Nous supprimons également la classe lazy qui identifie les images à charger pour les événements qui se déclenchent ultérieurement.

Utilisation de l’API Intersection Observer pour déclencher le chargement des images

Intersection Observer API est une API qui permet de détecter le moment où un élément entre dans la fenêtre d’affichage.

Vous trouverez ci-dessous un exemple d’utilisation de l’API Intersection Observer pour charger des images en différé. Nous attachons l’observateur sur toutes les images à charger en lazy load. Une fois que l’API détecte que l’élément est entré dans la fenêtre, en utilisant la propriété isIntersecting, nous sélectionnons l’URL de l’attribut data-src et la déplaçons dans l’attribut src pour que le navigateur déclenche le chargement de l’image. Une fois que cela est fait, nous supprimons la classe lazy de l’image et supprimons également l’observateur de cette image.

Cependant, comme les technologies des navigateurs évoluent sans cess, la prise en charge de l’API Intersection Observer n’est pas disponible sur tous les navigateurs. Vous pouvez tout de même utiliser un Polyfill pour les ceux qui ne le prennent pas en charge.

Les librairies utiles

Voici quelques librairies et plugins populaires pour vous permettre d’implémenter facilement le Lazy Loading sur votre site :

Petit conseil pour bien choisir votre librairie : regardez d’abord si elle est bien compatible avec les différents navigateurs et si elle est toujours maintenu. Un bon indicateur est le nombre d’étoiles (stars) sur Github.

D’autres librairies sont disponibles pour les principaux CMS sous forme de plugins, notamment Lazy Load by WP Rocket pour WordPress, Magento Lazy Image Loader sur Magento ou Lazy loading pour Prestashop.

Tester la bonne configuration SEO du Lazy Loading

Après avoir configuré votre Lazy Loading, vous devez absolument vous assurer que Google pourra bien parcourir l’intégralité des pages et médias de votre site.

Testez d’abord votre site via l’outil de test de compatibilité mobile de Google et vérifiez si toutes vos images sont bien dans le code de votre site en version mobile (recherchez le nombre d’occurences de balise HTML img).

Résultats du test de compatibilité mobile de Google

La seconde vérification consiste à utiliser un script Puppeteer, une bibliothèque Node.js permettant de simuler une navigation sans passer par Chrome. Pour exécuter le script, vous aurez absolument besoin de Node.js.

Résultats du script Puppeteer.

La balise <noscript>

Si vous avez un doute concernant la visibilité de vos images par les moteurs de recherche, ajouter la balise<noscript>à toutes les images concernées par le Lazy Loading, cela permettra d’obtenir dans le code source de votre page un lien direct vers l’image même si le JavaScript n’est pas exécuté par le robot de crawl.


Pour aller plus loin…

Retrouvez tous nos exemples directement sur notre site démo.


N’hésitez pas à partager si ça vous a plu, et également à commenter si vous avez des remarques ou des questions.

<

ou contactez-nous au