SEO technique

Qu’est-ce que le Largest Contentful Paint (LCP) et comment l’améliorer ?

Patrick Stox
Patrick Stox est conseiller produit, spécialiste SEO technique et ambassadeur à Ahrefs. Il co-organise divers évènements comme le Raleigh SEO Meetup, Raleigh SEO Conference, Beer & SEO Meetup et Findability Conference. Il est aussi modérateur sur /r/TechSEO.
Le Largest Contentful Paint (LCP) correspond au temps nécessaire pour charger le plus grand élément visible dans la fenêtre d’affichage. Il représente le chargement visuel du site et constitue l’un des trois indicateurs Core Web Vitals (CWV) utilisés par Google pour mesurer l’expérience utilisateur d’une page.

La première impression que les utilisateurs ont de votre site, c’est sa vitesse de chargement perçue.

Le plus grand élément est en général une image mise en avant ou la balise <h1>. Mais il peut aussi s’agir de l’un des éléments suivants :

  • Un élément <img>
  • Un élément <image> à l’intérieur d’un élément <svg>
  • Une image à l’intérieur d’un élément <video>
  • Une image d’arrière-plan chargée via la fonction url()
  • Des blocs de texte
  • La première frame affichée pour un élément <video> en lecture automatique
  • La première frame d’un format d’image animée, comme un GIF animé

Tout ce qui se trouve en dehors de la fenêtre d’affichage, ou qui dépasse de son conteneur, n’est pas pris en compte dans le calcul de la taille. Si une image occupe l’intégralité de la fenêtre d’affichage, elle n’est pas considérée pour le LCP.

Voyons ce qu’est un bon score LCP et comment l’améliorer.

Un bon score LCP, mesuré à partir des données du Chrome User Experience Report (CrUX), est inférieur à 2,5 secondes. Il s’agit de données provenant de véritables utilisateurs de Chrome ayant accepté de les partager lorsqu’ils visitent votre site. Il faut que 75 % des visites de page se chargent en 2,5 secondes ou moins.

Votre page peut être classée dans l’une des catégories suivantes :

  • Bon : <= 2,5s
  • À améliorer : > 2,5s et <= 4s
  • Médiocre : > 4s
Schéma des seuils LCP : bon (≤ 2,5 s), à améliorer (entre 2,5 et 4 s) et médiocre (></noscript> 4 s)
BonA améliorerMauvais
LCP<=2.5s<=4s>4s
FIDv<=100ms<=300ms>300ms
CLS<=0.1<=0.25>0.25

Données sur le LCP

57,1 % des sites se situent dans la catégorie « bon » pour le LCP en avril 2023. Cette moyenne porte sur l’ensemble du site : pour qualifier un site, le seuil doit être tenu sur 75 % des visites de page.

Graphique indiquant que 57,1 % des sites obtiennent un bon score LCP en avril 2023

Le LCP est le Core Web Vital que les éditeurs ont le plus de mal à améliorer.

Graphique montrant que le LCP est l'indicateur Core Web Vital le plus difficile à améliorer pour les éditeurs

Lorsque nous avons mené une étude sur les Core Web Vitals, nous avons constaté que les pages obtiennent moins souvent de bonnes valeurs de LCP sur mobile que sur ordinateur.

Comparaison des bonnes valeurs LCP entre ordinateur et mobile, les pages obtenant moins souvent un bon score LCP sur mobile

Vérifiez gratuitement vos CWV (dont le LCP) avec Site Audit

Gratuit pour les sites dont la propriété est vérifiée

La vérification de propriété peut se faire en :

  • Connectant Google Search Console (recommandé) ;
  • Téléversant un fichier HTML ;
  • Ajoutant un enregistrement TXT à votre configuration DNS ;
  • Ajoutant une balise HTML meta à votre page d’accueil.

Voir le tutoriel vidéo

En savoir plus

L’inscription ici vous donne accès gratuitement à Ahrefs Webmaster Tools ↗

Le seuil LCP semble quasiment impossible à atteindre sur les connexions lentes.

Graphique des bonnes valeurs LCP par type de connexion, montrant que le seuil semble quasi impossible à atteindre sur les connexions lentes

Il existe deux façons de mesurer le LCP à examiner : les données de terrain (field data) et les données de laboratoire (lab data).

Les données de terrain proviennent du Chrome User Experience Report (CrUX), c’est-à-dire de véritables utilisateurs de Chrome ayant choisi de partager leurs données. Elles donnent la meilleure idée des performances réelles du LCP dans différentes conditions de réseau, sur différents appareils, avec ou sans cache, etc. Ce sont aussi les données qui seront effectivement utilisées par Google pour évaluer les Core Web Vitals.

Les données de laboratoire reposent sur des tests réalisés dans des conditions identiques afin d’être reproductibles. Google ne les utilise pas pour les Core Web Vitals, mais elles sont utiles pour vos tests : les données CrUX (de terrain) correspondent à une moyenne glissante sur 28 jours, il faut donc patienter avant de voir l’impact de vos modifications.

Le meilleur outil pour mesurer le LCP dépend du type de données souhaité (laboratoire ou terrain) et du nombre d’URL à analyser.

Mesurer le LCP pour une seule URL

PageSpeed Insights récupère des données de terrain au niveau de la page que vous ne pouvez pas interroger directement dans le jeu de données CrUX. L’outil exécute également des tests en laboratoire basés sur Google Lighthouse et fournit des données d’origine afin de comparer les performances d’une page à celles de l’ensemble du site.

Mesurer le LCP pour plusieurs URL ou un site entier

Vous pouvez obtenir les données CrUX dans Google Search Console, classées dans les catégories bon, à améliorer et médiocre.

Capture d'écran du rapport Core Web Vitals dans Google Search Console, avec les données LCP classées en bon, à améliorer et médiocre

En cliquant sur l’un des problèmes, vous obtenez une répartition par groupes de pages affectées. Ces groupes rassemblent des pages ayant des valeurs similaires, vraisemblablement issues d’un même modèle. Une seule modification appliquée au modèle suffira à corriger toutes les pages du groupe.

Capture d'écran de Google Search Console affichant la répartition par groupes de pages affectées partageant des valeurs LCP similaires

Si vous souhaitez obtenir à la fois des données de laboratoire et des données de terrain à grande échelle, le seul moyen est de passer par l’API PageSpeed Insights. Vous pouvez vous y connecter facilement avec Site Audit d’Ahrefs et obtenir des rapports détaillés sur vos performances. C’est gratuit pour les sites vérifiés disposant d’un compte Ahrefs Webmaster Tools (AWT).

Capture d'écran de Site Audit d'Ahrefs présentant un rapport détaillé sur les performances CWV via l'API PageSpeed Insights

Notez que les données Core Web Vitals affichées dépendent du user-agent sélectionné pour votre crawl lors de la configuration. Si vous explorez le site en mode mobile, vous obtiendrez les valeurs CWV mobiles renvoyées par l’API.

Outil gratuit : vérifiez les CWV et Lighthouse jusqu’à 10 pages

Voici un autre outil gratuit qui vous permet d’analyser jusqu’à 10 pages ou sites simultanément pour vous comparer à vos concurrents.

Configuration :

  • Saisissez votre clé d’API Google PageSpeed Insights dans le champ prévu à cet effet. (Voici comment générer une clé d’API.)
  • Ajoutez les URL à analyser (une par ligne).

Lancement de l’analyse :

  • Cliquez sur le bouton « Check CWV » pour démarrer la récupération des indicateurs. Une barre de progression affichera l’état des requêtes.

Consultation des résultats :

Les résultats sont présentés sous forme de cartes de score classées par catégorie :

  • CWV Desktop pour la page
  • CWV Desktop pour l’origine
  • Lighthouse Desktop
  • CWV Mobile pour la page
  • CWV Mobile pour l’origine
  • Lighthouse Mobile

Chaque indicateur est associé à un code couleur reflétant la performance :

  • Vert : Bon
  • Jaune : À améliorer
  • Rouge : Médiocre

Vérificateur en masse des Core Web Vitals

Voici un aperçu des cartes de score. L’outil peut aussi être utilisé de manière autonome comme test de vitesse de site web (en anglais).

Aperçu de l'outil gratuit de test de vitesse de site web affichant les cartes de score CWV et Lighthouse pour desktop et mobile

Dans PageSpeed Insights, l’élément LCP est identifié dans la section « Diagnostics ». Notez également la présence d’un onglet permettant de sélectionner uniquement les problèmes liés au LCP. Ce sont ceux remontés par le test en laboratoire qu’il faudra résoudre.

Capture d'écran de PageSpeed Insights présentant la section Diagnostics et l'onglet permettant de filtrer les problèmes liés au LCP

Les problèmes liés au LCP sont nombreux, ce qui en fait l’indicateur le plus difficile à améliorer.

La théorie générale paraît assez simple : afficher le plus grand élément plus rapidement. Mais en pratique, cela peut devenir complexe. Certains fichiers exigent que d’autres soient chargés au préalable, et il peut exister des priorités contradictoires dans le navigateur. Vous risquez de corriger toute une série de problèmes sans constater la moindre amélioration, ce qui peut être frustrant.

Si vous n’êtes pas très technique et que vous ne souhaitez pas engager quelqu’un, cherchez des plugins, modules ou packages d’optimisation des performances ou de la vitesse de page adaptés à votre système. Les informations ci-dessous vous serviront de guide pour identifier les fonctionnalités dont vous aurez besoin.

Voici plusieurs façons d’améliorer le LCP :

1. Identifiez votre élément LCP

Dans PageSpeed Insights, vous pouvez cliquer sur « Largest Contentful Paint element » dans la section « Diagnostics » : l’outil identifiera votre élément LCP.

Capture d'écran de PageSpeed Insights identifiant l'élément Largest Contentful Paint de la page dans la section Diagnostics

2. Priorisez le chargement des ressources

Pour valider le test LCP, vous devez hiérarchiser le chargement de vos ressources dans le chemin de rendu critique. Concrètement, il s’agit d’indiquer au navigateur quelles ressources télécharger en priorité, et lesquelles peuvent attendre, en utilisant des attributs HTML détaillés plus bas (fetchpriority, preload, defer, async).

Vous devez d’abord charger les ressources nécessaires à votre élément LCP, ainsi que toutes les autres ressources requises pour le contenu situé au-dessus de la ligne de flottaison. Une fois les éléments initialement visibles chargés pour les utilisateurs, le reste est chargé ensuite.

De nombreux sites peuvent valider le seuil LCP simplement en ajoutant quelques Early Hints ou directives de preload pour des éléments comme l’image principale, ainsi que les feuilles de style et polices indispensables. Examinons comment optimiser les différents types de ressources.

Images en priorité

Si vous n’avez pas besoin de l’image, la solution la plus efficace consiste simplement à la supprimer. Si l’image est indispensable, mieux vaut en optimiser la taille et la qualité pour qu’elle reste la plus légère possible. L’objectif est de rester sous les 200 ko, voire sous 100 ko sur mobile. Les formats modernes comme WebP ou AVIF compriment 30 à 50 % mieux que JPEG ou PNG.

Vous pouvez aussi utiliser les Early Hints. L’attribut fetchpriority="high" peut être appliqué aux balises <img> ou <link> et indique au navigateur de récupérer l’image en priorité. Elle s’affichera ainsi un peu plus tôt.

Les Early Hints ne fonctionnent pas sur tous les navigateurs, vous pouvez donc également précharger l’image avec un preload. Cela lance le téléchargement de l’image un peu plus tôt, mais pas aussi tôt qu’avec fetchpriority="high".

Une directive de preload pour une image responsive ressemble à ceci :

<link rel="preload" as="image" href="cat.jpg" imagesrcset="cat_400px.jpg 400w, cat_800px.jpg 800w, cat_1600px.jpg 1600w" imagesizes="50vw">

Vous pouvez même combiner fetchpriority="high" et preload !

Images en différé

Vous devez charger en différé toutes les images qui ne sont pas nécessaires immédiatement. Cela permet de charger les images plus tard dans le processus, ou au moment où l’utilisateur est sur le point de les voir. Ajoutez la balise loading="lazy" à chaque image de cette façon :

<img src="cat.jpg" alt="cat" loading="lazy">

Ne chargez jamais en différé les images situées au-dessus de la ligne de flottaison !

Un CSS simplifié

Le CSS doit être minifié, c’est-à-dire allégé en supprimant espaces, commentaires et caractères inutiles. Si possible, supprimez également le CSS inutilisé. C’est un conseil encore plus important maintenant qu’on a tendance à vibe coder des sites : les IA ajoutent beaucoup de HTML et CSS inutiles.

L’autre point majeur est d’inliner le CSS critique. Le principe : vous prenez la partie du CSS nécessaire à l’affichage du contenu visible immédiatement par l’utilisateur, et vous l’intégrez directement dans le HTML. Lorsque le HTML est téléchargé, tout le CSS requis pour afficher ce que voient les utilisateurs est déjà disponible.

Schéma illustrant l'inlining du CSS critique directement dans le HTML pour afficher immédiatement le contenu situé au-dessus de la ligne de flottaison

CSS en différé

Pour tout CSS supplémentaire qui n’est pas critique, il faudra l’appliquer plus tard dans le processus. Vous pouvez lancer le téléchargement du CSS avec une directive de preload, mais ne l’appliquer que plus tard via un événement onload. Cela donne :

<link rel="preload" href="stylesheet.css" as="style" onload="this.rel='stylesheet'">

Optimiser les polices

Voici plusieurs options :

Niveau 1 : préchargez vos polices. C’est encore mieux si vous utilisez le même serveur pour éviter une connexion supplémentaire.

Niveau 2 : font-display: optional. Cette propriété peut être combinée avec une directive de preload. Elle accorde à votre police une courte fenêtre temporelle pour se charger. Si la police n’arrive pas à temps, le chargement initial affichera simplement une police par défaut. Votre police personnalisée sera ensuite mise en cache et apparaîtra lors des chargements suivants.

Niveau 3 : utilisez simplement une police système. Il n’y a rien à charger, donc aucun délai. C’est la meilleure solution.

JavaScript en priorité

Nous avons déjà évoqué la suppression du JavaScript inutilisé et la minification du reste. Si vous utilisez un framework JavaScript, vous pouvez envisager le pre-rendering ou le rendu côté serveur (SSR) de la page.

Vous pouvez également inliner le JavaScript nécessaire en début de chargement. Le principe est le même que pour le CSS : vous déplacez certaines parties de vos fichiers JavaScript pour les charger directement avec le HTML.

Autre option : précharger les fichiers JavaScript pour les obtenir plus tôt. Ne le faites que pour les ressources nécessaires au chargement du contenu au-dessus de la ligne de flottaison, ou si certaines fonctionnalités dépendent de ce JavaScript.

JavaScript en différé

Tout JavaScript dont vous n’avez pas besoin immédiatement doit être chargé plus tard. Il existe deux principales méthodes pour cela : les attributs defer et async. Ces attributs peuvent être ajoutés à vos balises <script>.

Habituellement, un script bloque le parseur pendant son téléchargement et son exécution. async permet au parsing et au téléchargement de se dérouler simultanément, mais bloque tout de même le parsing pendant l’exécution du script. defer ne bloque pas le parsing pendant le téléchargement, et le script n’est exécuté qu’une fois le parsing du HTML terminé.

Schéma comparant le comportement des attributs standard, async et defer lors du téléchargement et de l'exécution des scripts par rapport au parsing HTML

Lequel choisir ? Pour tout ce que vous voulez charger plus tôt ou qui comporte des dépendances, j’aurais tendance à privilégier async.

Par exemple, j’utilise généralement async pour les balises analytics afin de comptabiliser davantage d’utilisateurs. Privilégiez defer pour tout ce qui n’est pas nécessaire immédiatement ou qui n’a pas de dépendances. Ces attributs sont très simples à ajouter.

Voici quelques exemples :

Standard :

<script src="https://www.domain.com/file.js"></script>

Async :

<script src="https://www.domain.com/file.js" async></script>

Defer :

<script src="https://www.domain.com/file.js" defer></script>

3. Réduisez la taille des fichiers

Si vous pouvez supprimer des fichiers ou en réduire la taille, votre page se chargera plus rapidement. Une bonne cible : viser un poids total inférieur à 1,5 Mo, et idéalement sous 1 Mo sur mobile. Cela signifie qu’il faudra supprimer les fichiers inutilisés ou les portions de code qui ne servent pas.

La façon de procéder dépend largement de votre configuration, mais le processus de suppression des parties inutiles d’un fichier est généralement appelé tree shaking.

Il est couramment réalisé via un processus automatisé avec Webpack ou Grunt, dans le cadre des frameworks JavaScript, voire parfois avec des systèmes comme WordPress, mais la plupart des CMS courants ne le prennent pas en charge.

Vous pouvez ignorer cette étape ou vérifier si des plugins offrent cette option pour votre système.

Pour réduire la taille des fichiers, vous voulez en général les compresser.

Pratiquement tous les types de fichiers utilisés pour construire votre site peuvent être compressés : CSS, JavaScript, images et HTML. Et la quasi-totalité des systèmes et serveurs prennent en charge la compression.

Elle s’effectue généralement au niveau du serveur ou du CDN, mais certains plugins l’assurent également, comme WP Rocket pour WordPress.

4. Utilisez un CDN

L’information met du temps à voyager. Plus vous êtes éloigné d’un serveur, plus le transfert des données est long. À moins de cibler une zone géographique restreinte, il est judicieux de mettre en place un Content Delivery Network (CDN).

Les CDN permettent de connecter et de servir votre site depuis un point plus proche des utilisateurs. C’est comme si vous disposiez de copies de votre serveur réparties à travers le monde.

5. Hébergez vos ressources sur le même serveur

Lorsque vous vous connectez à un serveur pour la première fois, il y a un processus qui parcourt le web et établit une connexion sécurisée entre vous et ce serveur.

Cela prend un certain temps, et chaque nouvelle connexion ajoute un délai supplémentaire, car il faut repasser par le même processus. En hébergeant vos ressources sur le même serveur, vous éliminez ces délais supplémentaires.

Si vous ne pouvez pas utiliser le même serveur, vous pouvez recourir à preconnect ou dns-prefetch pour initier les connexions plus tôt. Un navigateur attend normalement la fin du téléchargement du HTML avant d’amorcer une connexion. Avec preconnect ou dns-prefetch, elle démarre plus tôt qu’à l’accoutumée. Notez que dns-prefetch bénéficie d’un meilleur support que preconnect.

Pour chaque ressource que vous souhaitez obtenir plus tôt, vous ajoutez une nouvelle directive comme celle-ci :

<link rel="preconnect" href="https://fonts.googleapis.com/"> <link rel="dns-prefetch" href="https://fonts.googleapis.com/" />

6. Utilisez le cache

Lorsque vous mettez vos ressources en cache, elles sont téléchargées lors de la première vue de page, mais n’ont plus besoin de l’être pour les vues suivantes. Les ressources étant déjà disponibles, les chargements de page ultérieurs sont nettement plus rapides.

Regardez le peu de fichiers téléchargés lors du second chargement dans les graphiques en cascade ci-dessous.

Premier chargement de la page :

Graphique en cascade illustrant le premier chargement de la page, avec l'ensemble des fichiers téléchargés

Second chargement de la page :

Graphique en cascade illustrant le second chargement de la page, avec un nombre nettement réduit de fichiers téléchargés grâce à la mise en cache

Si vous le pouvez, mettez également en cache au niveau du CDN. La durée de cache doit être aussi longue que vous l’acceptez.

L’idéal est de mettre en cache sur une très longue période, mais de purger le cache à chaque modification apportée à une page.

7. Divers

D’autres technologies peuvent contribuer à améliorer les performances. Parmi elles : le Speculative Prerendering, les Signed Exchanges et HTTP/3.

Conclusion

Existe-t-il une meilleure métrique pour mesurer le chargement visuel ? Je ne vois rien de nouveau à l’horizon pour le moment. Nous avons déjà assisté à plusieurs évolutions visant à mesurer le chargement.

load et DOMContentLoaded ne reflètent pas vraiment ce que voit l’utilisateur. Le First Contentful Paint (FCP) marque le début de l’expérience de chargement. Le First Meaningful Paint (FMP) et le Speed Index (SI) sont complexes et n’identifient pas réellement le moment où le contenu principal a été chargé.

Si vous avez des questions, contactez-nous sur LinkedIn pour les francophones.