Depuis 2021, Google utilise les Core Web Vitals comme signal de classement officiel. Concrètement : un site rapide et stable remonte dans les résultats, un site lent ou qui "saute" est pénalisé. Voici comment comprendre ces 3 métriques et 5 actions concrètes pour booster votre score.
Qu'est-ce que les Core Web Vitals ?
Trois métriques qui mesurent l'expérience utilisateur réelle sur votre site :
| Métrique | Mesure | Objectif |
|---|---|---|
| LCP (Largest Contentful Paint) | Temps avant affichage du plus gros élément visible | < 2,5 s |
| INP (Interaction to Next Paint) | Délai entre clic/tap et réaction du site | < 200 ms |
| CLS (Cumulative Layout Shift) | Stabilité visuelle (texte qui ne saute pas) | < 0,1 |
📌 Depuis mars 2024, INP a remplacé FID comme métrique d'interactivité. Plus précis et plus exigeant.
Comment mesurer
Outil officiel : PageSpeed Insights
Va sur pagespeed.web.dev → entre l'URL → tu obtiens 2 rapports :
- Données du terrain (CrUX) : ce que vivent les vrais visiteurs sur 28 jours (= signal Google)
- Données de labo (Lighthouse) : test simulé instantané
💡 Le rapport CrUX (vrais utilisateurs) est celui qui compte pour Google. Le rapport Lighthouse est utile pour le debug.
Outil en local : Chrome DevTools
- Ouvre Chrome → F12 → onglet Lighthouse
- Mode "Navigation" + "Mobile"
- "Analyze page load"
- Tu vois le détail technique de chaque métrique
Outil de monitoring continu : Search Console
- Search Console → Expérience → Core Web Vitals
- Te montre l'évolution sur 90 jours avec les URLs problématiques
Action #1 — Optimiser le LCP (objectif < 2,5 s)
Le LCP, c'est le plus gros élément visible au chargement de la page : généralement l'image hero ou un titre H1.
Causes typiques d'un LCP lent
- Image hero trop lourde (> 200 Ko)
- Image servie en JPG/PNG au lieu de WebP/AVIF
- Image chargée en lazy alors qu'elle est dans le fold (above-the-fold)
- Police personnalisée bloquant le rendu
Solutions concrètes
1. Préchargez le LCP (image ou police)
<link rel="preload" as="image" href="/hero.webp" fetchpriority="high">
2. Utilisez Next.js Image avec priority
<Image src="/hero.webp" priority alt="..." width={1200} height={600} />
3. Format moderne
- WebP partout, AVIF si vous voulez aller plus loin
- Compression à 80 % (excellent rapport qualité/poids)
4. Tailles responsives
<Image sizes="(max-width: 768px) 100vw, 50vw" ... />
Vous ne servez pas une image 4K à un téléphone.
Action #2 — Améliorer l'INP (objectif < 200 ms)
L'INP mesure combien de temps votre site met à réagir quand l'utilisateur clique ou tape. Tout retard > 200 ms se sent.
Causes typiques d'un INP élevé
- Trop de JavaScript chargé au démarrage
- Tâches longues bloquant le thread principal
- Animations CSS coûteuses
- Re-renders React inutiles
Solutions concrètes
1. Réduire le JS du bundle initial
- Lazy load les composants non visibles immédiatement (
next/dynamic) - Supprimez les libs inutilisées (vérifiez avec
@next/bundle-analyzer)
2. Code splitting
- Pages dynamiques chargées à la demande
- Composants lourds (éditeur, carte) chargés au clic
3. Optimiser React
React.memo()pour les composants chersuseMemo()/useCallback()pour éviter les recalculs- Listes :
virtualization(react-window) si > 100 éléments
4. Décharger le main thread
- Travail lourd dans un Web Worker
requestIdleCallbackpour les tâches non critiques
Action #3 — Stabiliser le CLS (objectif < 0,1)
Le CLS mesure combien votre page "saute" au chargement. Exemples classiques :
- Une image charge et pousse tout le texte vers le bas
- Une pub apparaît et décale tout le contenu
- Une police se charge et change la hauteur des paragraphes
Solutions concrètes
1. Toujours préciser width + height sur les images
<img src="/photo.jpg" width="800" height="600" alt="...">
Le navigateur réserve l'espace avant le chargement.
2. Polices avec font-display: swap
Déjà fait avec next/font : la police de fallback affiche immédiatement, puis la police custom remplace.
3. Éviter le contenu inséré dynamiquement above-the-fold
- Pas de bannière qui apparaît en haut après 2 secondes
- Pas de pub qui pousse le contenu
4. Animer avec transform/opacity, pas avec layout
transform: translateY()ne décale pas le layout- Modifier
heightoutopdécale tout = CLS
Action #4 — CDN et cache HTTP
Un CDN (Content Delivery Network) sert vos assets depuis le serveur le plus proche du visiteur. Impact direct sur LCP.
Solutions
- Cloudflare (plan gratuit) : CDN mondial + cache HTTP automatique
- Bunny CDN : 0,01 $/Go, ultra-rapide
- Next.js sur Vercel : CDN inclus
Cache HTTP optimal
/_next/static/* → max-age=31536000, immutable
/uploads/* → max-age=2592000
/api/* → no-cache
Les visiteurs récurrents ne re-téléchargent que ce qui a vraiment changé.
Action #5 — Lazy loading intelligent
Tout ce qui n'est pas immédiatement visible doit être chargé à la demande :
- Images :
loading="lazy"(ou Next.js Image qui le fait automatiquement sauf sipriority) - Iframes (YouTube, Maps) : remplacez par une miniature qui charge la vraie iframe au clic
- Composants lourds :
next/dynamicavecssr: false - Scripts tiers :
<Script strategy="afterInteractive">
⚠️ Attention : ne pas lazy-loader le LCP (image hero) sinon vous tirez votre LCP en arrière.
Récap visuel
Voici à quoi ressemble un site bien optimisé sur PageSpeed :
┌─────────────────────────────────────┐
│ Score Performance : 97/100 ✅ │
├─────────────────────────────────────┤
│ LCP : 1.4s (< 2.5s) ✅ │
│ INP : 85ms (< 200ms) ✅ │
│ CLS : 0.02 (< 0.1) ✅ │
└─────────────────────────────────────┘
Si vous avez ça → Google adore votre site, et vos visiteurs aussi.
Notre approche chez BS Concept
Tous les sites que nous livrons sont conçus pour la performance :
- ✅ Next.js avec Static Site Generation (HTML pré-généré)
- ✅ Images optimisées en WebP/AVIF automatiquement
- ✅ Code splitting par route
- ✅ Polices préchargées avec font-display swap
- ✅ Headers de cache HTTP optimaux
- ✅ Score Lighthouse Mobile > 90 garanti
Audit gratuit de vos Core Web Vitals : demandez-le ici, on vous donne un diagnostic détaillé avec les actions prioritaires en 48h.