1.Que sont les Core Web Vitals ?
Les Core Web Vitals (CWV) sont un ensemble de trois métriques définies par Google pour évaluer la qualité de l'expérience utilisateur sur une page web. Introduites en 2020 et devenues un facteur de classement officiel en 2021, ces métriques mesurent trois aspects fondamentaux de l'interaction avec une page : la vitesse de chargement, la réactivité aux interactions et la stabilité visuelle.
Contrairement à d'autres métriques techniques, les Core Web Vitals se concentrent sur ce que l'utilisateur perçoit réellement. Un site peut avoir un temps de réponse serveur de 50 ms, mais si le contenu principal ne s'affiche qu'au bout de 4 secondes, l'expérience est mauvaise. C'est cette philosophie centrée sur l'utilisateur qui rend les CWV si pertinents.
En 2024, Google a remplacé le FID (First Input Delay) par l'INP (Interaction to Next Paint), une métrique bien plus exigeante qui mesure la réactivité globale d'une page et non plus seulement la première interaction. Ce changement a poussé de nombreux sites à revoir leur approche de l'optimisation JavaScript.
LCP
Largest Contentful Paint
Mesure le temps de chargement du plus grand élément visible dans le viewport (image, bloc de texte, vidéo). C'est la perception de vitesse de chargement pour l'utilisateur.
Bon
< 2.5s
Moyen
2.5s - 4s
Mauvais
> 4s
INP
Interaction to Next Paint
Mesure la latence globale des interactions utilisateur (clics, appuis, saisies clavier). INP prend en compte toutes les interactions, pas seulement la première.
Bon
< 200ms
Moyen
200ms - 500ms
Mauvais
> 500ms
CLS
Cumulative Layout Shift
Mesure la quantité de déplacements inattendus des éléments visuels pendant le chargement. Un CLS élevé signifie que la page 'saute' de manière imprévisible.
Bon
< 0.1
Moyen
0.1 - 0.25
Mauvais
> 0.25
Bon à savoir : Google utilise les données du Chrome User Experience Report (CrUX) — des données réelles collectées auprès d'utilisateurs Chrome — pour évaluer vos Core Web Vitals. Les données de laboratoire (Lighthouse) sont utiles pour le diagnostic, mais ce sont les données terrain qui comptent pour le classement.
2.Pourquoi Google les utilise comme facteur de classement
Depuis juin 2021, les Core Web Vitals font partie intégrante du système de classement de Google sous le nom de Page Experience. Cette intégration reflète la conviction de Google que la qualité technique d'un site est indissociable de la qualité du contenu qu'il propose.
Concrètement, à contenu égal entre deux pages concurrentes, celle qui offre de meilleurs Core Web Vitals aura un avantage de classement. Ce n'est pas un facteur dominant (la pertinence du contenu reste reine), mais c'est un facteur départageant qui peut faire la différence entre la première et la deuxième page de résultats.
L'impact est aussi indirect : un site rapide et stable retient mieux ses visiteurs. Le taux de rebond diminue, le temps passé sur le site augmente, et les signaux comportementaux envoyés à Google s'améliorent. Les études montrent qu'une amélioration de 100 ms du temps de chargement peut augmenter les conversions de 1 à 2 %.
De plus, Google Search Console affiche désormais un rapport dédié aux Core Web Vitals, avec une classification claire des URLs en « Bon », « À améliorer » et « Mauvais ». Ce rapport est devenu un outil incontournable pour tout référenceur sérieux. Ignorer les CWV en 2026, c'est se priver d'un levier d'optimisation mesurable et actionnable.
3.Comment mesurer vos Core Web Vitals
Mesurer vos CWV est la première étape indispensable. Il existe deux types de données : les données de laboratoire (simulées, reproductibles, idéales pour le débogage) et les données terrain (réelles, collectées auprès de vrais utilisateurs, utilisées par Google pour le classement).
Google PageSpeed Insights
L'outil de référence. Il combine données terrain (CrUX) et données labo (Lighthouse) en un seul rapport. Entrez votre URL et obtenez un diagnostic complet avec des recommandations priorisées.
Google Search Console
Le rapport Core Web Vitals montre l'état de santé de toutes vos URLs, regroupées par type de problème. Indispensable pour prioriser les corrections à l'échelle d'un site entier.
Lighthouse (Chrome DevTools)
Audit intégré dans Chrome (F12 > onglet Lighthouse). Permet de tester en conditions contrôlées et d'identifier précisément les éléments à optimiser. Idéal pour le développement.
Web Vitals JavaScript Library
Bibliothèque open-source de Google pour mesurer les CWV directement dans votre code. Envoyez les métriques vers votre outil d'analytics pour un suivi en temps réel sur vos vrais utilisateurs.
Conseil pro : Ne vous fiez pas uniquement à Lighthouse. Les scores de laboratoire peuvent varier selon votre machine et vos conditions réseau. Utilisez toujours les données CrUX (terrain) pour évaluer l'état réel de vos CWV. Si votre site n'a pas assez de trafic pour des données CrUX, combinez Lighthouse avec des tests sur des appareils mobiles réels.
4.Optimiser le LCP (Largest Contentful Paint)
Le LCP est souvent la métrique la plus simple à comprendre mais la plus délicate à optimiser, car elle dépend de toute la chaîne de chargement. L'objectif est de rendre le plus grand élément visible en moins de 2,5 secondes. Les quatre principaux facteurs qui dégradent le LCP sont : le temps de réponse serveur, le blocage par les ressources, le temps de chargement des ressources et le rendu côté client.
Réduire le temps de réponse serveur (TTFB)
Le Time to First Byte (TTFB) est le temps entre la requête du navigateur et le premier octet de la réponse. Un TTFB lent retarde tout le reste. Visez un TTFB inférieur à 800 ms, idéalement sous 200 ms.
- 1Utilisez un CDN (Cloudflare, Vercel Edge Network, AWS CloudFront) pour rapprocher le contenu de vos utilisateurs géographiquement.
- 2Activez la mise en cache HTTP agressive : les pages statiques doivent être servies avec des headers Cache-Control appropriés (stale-while-revalidate est votre ami).
- 3Avec Next.js, privilégiez le rendu statique (SSG) ou l'ISR (Incremental Static Regeneration) plutôt que le SSR pour les pages qui ne changent pas à chaque requête.
- 4Optimisez vos requêtes base de données : ajoutez des index, utilisez le connection pooling, et mettez en cache les résultats fréquents avec Redis ou Memcached.
Optimiser les images
Dans 70 % des cas, l'élément LCP est une image. L'optimisation des images est donc le levier le plus puissant pour améliorer votre LCP.
- 1Utilisez des formats modernes : WebP offre 25-35 % de compression en plus que JPEG, et AVIF encore davantage. Next.js Image optimise automatiquement les formats.
- 2Appliquez le lazy loading sur toutes les images sauf celle du LCP. L'image LCP doit avoir l'attribut priority (Next.js) ou loading="eager" et un fetchpriority="high".
- 3Spécifiez des dimensions explicites (width et height) sur chaque image pour éviter le layout shift et permettre au navigateur de réserver l'espace.
- 4Utilisez le srcset et sizes pour servir des images adaptées à chaque taille d'écran. Ne chargez pas une image de 2000px sur un mobile de 375px.
- 5Activez la préconnexion aux domaines d'images externes : <link rel="preconnect" href="https://votre-cdn.com" />.
Optimiser les polices web
Les polices personnalisées peuvent bloquer le rendu du texte, retardant significativement le LCP lorsque l'élément principal est un bloc de texte.
- 1Utilisez font-display: swap pour afficher immédiatement le texte avec une police de substitution, puis basculer vers la police personnalisée une fois chargée.
- 2Préchargez vos polices critiques avec <link rel="preload" as="font" crossorigin />. Cela indique au navigateur de les télécharger en priorité.
- 3Hébergez vos polices localement plutôt que de les charger depuis Google Fonts. Cela élimine une connexion DNS et TLS supplémentaire.
- 4Limitez le nombre de variantes : chaque poids (400, 500, 700) et style (italic) est un fichier supplémentaire. Ne chargez que ce que vous utilisez réellement.
5.Optimiser l'INP (Interaction to Next Paint)
L'INP mesure la réactivité globale de votre page. Il observe toutes les interactions de l'utilisateur (clics, taps, saisies clavier) et retient la pire latence (avec quelques ajustements statistiques). L'objectif est de rester sous 200 millisecondes entre le moment où l'utilisateur interagit et le moment où le navigateur affiche le résultat visuel.
L'INP se décompose en trois phases : le input delay (temps d'attente avant que le gestionnaire d'événement ne s'exécute), le processing time (durée d'exécution du gestionnaire) et le presentation delay (temps de rendu du résultat à l'écran). Chaque phase est un levier d'optimisation.
Réduire le JavaScript bloquant
Le JavaScript est la cause principale d'un mauvais INP. Chaque tâche JavaScript de plus de 50 ms est considérée comme une « Long Task » qui bloque le thread principal et empêche le navigateur de répondre aux interactions.
- 1Fragmentez les tâches longues avec yield to main thread. Utilisez scheduler.yield() (API moderne) ou setTimeout(fn, 0) pour rendre le contrôle au navigateur entre les étapes d'un traitement lourd.
- 2Utilisez le code splitting agressivement : chaque page ne doit charger que le JavaScript dont elle a besoin. Next.js le fait automatiquement par route, mais vérifiez vos imports dynamiques.
- 3Différez le chargement des scripts tiers (analytics, chatbots, widgets sociaux) avec async ou defer, ou mieux, chargez-les après l'interaction utilisateur.
- 4Évitez les re-renders React inutiles : utilisez React.memo, useMemo et useCallback avec discernement. Profilez avec React DevTools pour identifier les composants qui se re-rendent trop souvent.
Optimiser les gestionnaires d'événements
Même avec peu de JavaScript, des gestionnaires d'événements mal optimisés peuvent provoquer des latences perceptibles.
- 1Gardez vos event handlers légers : évitez les calculs lourds, les manipulations DOM complexes ou les appels API synchrones dans les gestionnaires de clics.
- 2Utilisez requestAnimationFrame pour les mises à jour visuelles et requestIdleCallback pour les traitements non urgents.
- 3Privilégiez les CSS transitions et animations plutôt que les animations JavaScript. Le navigateur peut les optimiser sur le GPU sans bloquer le thread principal.
- 4Pour les formulaires complexes, utilisez le debouncing sur les champs de saisie et déplacez la validation lourde côté serveur ou dans un Web Worker.
Maîtriser l'hydration (frameworks React/Next.js)
L'hydration est le processus par lequel le framework JavaScript « prend le contrôle » du HTML rendu côté serveur. Pendant cette phase, la page est visible mais potentiellement non interactive — un cauchemar pour l'INP.
- 1Avec Next.js App Router, utilisez les Server Components par défaut. Seuls les composants avec "use client" sont hydratés côté client, réduisant drastiquement le JavaScript envoyé au navigateur.
- 2Utilisez le Partial Prerendering (PPR) de Next.js pour combiner le rendu statique (shell) avec des composants dynamiques streamés, offrant un LCP rapide et une hydration ciblée.
- 3Appliquez le lazy loading sur les composants client lourds avec next/dynamic et l'option ssr: false pour les éléments non critiques (modals, carrousels, éditeurs).
- 4Mesurez le temps d'hydration avec les Performance Observer et React Profiler pour identifier les composants qui prennent le plus de temps à devenir interactifs.
6.Optimiser le CLS (Cumulative Layout Shift)
Le CLS mesure les décalages visuels inattendus. Chaque fois qu'un élément visible change de position sans que l'utilisateur n'ait interagi, un « layout shift » est enregistré. L'objectif est de maintenir un CLS inférieur à 0,1. Un mauvais CLS est l'une des expériences les plus frustrantes : vous êtes en train de lire un texte et soudain, une publicité ou une image fait tout sauter.
Les causes principales et leurs solutions
Images et vidéos sans dimensions
ProblèmeLe navigateur ne connaît pas la taille de l'image avant son chargement, puis redimensionne la page quand elle s'affiche.
SolutionSpécifiez toujours width et height sur vos balises <img> et <video>. Utilisez le composant Next.js Image qui gère cela automatiquement. Pour les conteneurs responsive, utilisez aspect-ratio en CSS.
Polices web provoquant un FOUT
ProblèmeLe Flash of Unstyled Text (FOUT) se produit quand la police personnalisée remplace la police système, modifiant les dimensions du texte et décalant tout le layout.
SolutionUtilisez font-display: optional (pas de swap, la police système reste si le chargement est lent) ou assurez-vous que vos fallback fonts ont des métriques similaires avec @font-face size-adjust.
Contenu injecté dynamiquement
ProblèmeLes bannières de consentement, les publicités, les notifications ou les barres d'info insérées en haut de page poussent tout le contenu vers le bas.
SolutionRéservez l'espace pour le contenu dynamique avec des placeholders de taille fixe. Pour les bannières, utilisez une position fixed ou sticky qui ne perturbe pas le flow du document.
Chargement asynchrone de composants
ProblèmeLes composants chargés dynamiquement (lazy loaded) n'ont pas de taille définie et provoquent un shift quand ils apparaissent.
SolutionUtilisez des skeletons ou des placeholders avec les dimensions exactes du composant final. Les Suspense boundaries de React avec des fallback dimensionnés sont idéales pour cela.
Animations mal implémentées
ProblèmeLes animations qui modifient width, height, top, left ou margin provoquent des reflows et des layout shifts.
SolutionUtilisez uniquement transform et opacity pour les animations. Ces propriétés sont composées sur le GPU et ne provoquent pas de layout shifts. Préférez transform: translateX() à left.