Performance Web

Performance Web

La performance est une fonctionnalité à part entière. Les Core Web Vitals, le lazy loading, la réduction de la taille des bundles et un caching intelligent déterminent si vos utilisateurs restent ou partent avant même que votre page ne s'affiche.

intermediate15 min readUpdated 15 sept. 2026
vitals.js
js
// vitals.js
new PerformanceObserver((list) => {
  for (const entry of list.getEntries()) {
    console.log("LCP:", Math.round(entry.startTime));
  }
}).observe({
  type: "largest-contentful-paint",
  buffered: true,
});
Métriques clés
LCP, CLS, INP
Données de terrain
Real user monitoring
Données de labo
Lighthouse et DevTools
Levier principal
Livrer moins de JavaScript
Images
Généralement l'asset le plus lourd
Budget
Fixer une limite et l'imposer

Pourquoi c'est important

Pourquoi la performance est une fonctionnalité

De meilleures métriques

Des pages plus rapides obtiennent de meilleurs scores Core Web Vitals, ce qui influence à la fois l'expérience utilisateur et le classement dans les moteurs de recherche.

Des utilisateurs plus satisfaits

Chaque 100ms de délai réduit mesurablement l'engagement et la conversion. La vitesse n'est pas un détail cosmétique.

Une infrastructure moins coûteuse

Des payloads plus légers et un caching intelligent réduisent la bande passante et la charge serveur à mesure que le trafic augmente.

Le tableau complet

Les trois leviers de la performance

Charger moins, charger plus tard et réduire la charge de travail du navigateur. Presque toutes les optimisations entrent dans l'une de ces catégories.

Chargement

L'acheminer

Réduire les octets, diviser les bundles, utiliser le lazy-load pour le contenu sous la ligne de flottaison et prioriser l'essentiel.

Rendu

L'afficher rapidement

Minimiser les décalages de mise en page, éviter les tâches bloquantes et garder le thread principal libre.

Runtime

Rester fluide

Maintenir la réactivité des interactions en livrant moins de JavaScript et en fractionnant les tâches longues.

La performance en un coup d'œil

Métriques et outils

LCP

Le Largest Contentful Paint mesure le moment où le contenu principal devient visible.

INP

L'Interaction to Next Paint mesure la réactivité aux entrées utilisateur.

CLS

Le Cumulative Layout Shift mesure la stabilité visuelle.

TTFB

Le Time to First Byte reflète la latence du serveur et du réseau.

Performance API

Mesurez les timings réels dans le navigateur grâce aux observers.

Budget de bundle

Plafonnez le JavaScript que vous livrez et faites échouer le build s'il dépasse la limite.

Un bref aperçu

Du temps de chargement de page aux métriques centrées sur l'utilisateur

  1. 2010

    Temps de chargement de page

    Les premiers travaux de performance se concentrent sur le temps nécessaire au chargement complet de la page.

    10
  2. 2015

    Modèle RAIL

    Google redéfinit la performance autour de la réponse, l'animation, l'inactivité et le chargement.

    15
  3. 2020

    Core Web Vitals

    LCP, CLS et FID offrent à l'industrie des métriques communes centrées sur l'utilisateur.

    20
  4. 2024

    L'INP remplace le FID

    L'Interaction to Next Paint devient la métrique de référence pour la réactivité.

    24
  5. Aujourd'hui

    Budgets de performance

    Les équipes traitent la performance comme une contrainte au moment du build, et non comme une réflexion après coup.

    Aujourd'hui

Le guide complet

Performance Web: Tout ce que vous devez savoir

Pourquoi la performance est une fonctionnalité à part entière

La performance n’est pas une étape de finition à prévoir en fin de projet. C’est elle qui détermine si les utilisateurs accèdent réellement à votre contenu. Une page qui met quatre secondes à afficher son contenu principal perd une grande partie de ses visiteurs avant même d’être utilisable, et des interactions lentes donnent l’impression qu’une application est défectueuse, même lorsqu’elle fonctionne.

La bonne nouvelle, c’est que la performance est mesurable et repose pour l’essentiel sur des principes systématiques. Quelques leviers simples — charger moins d’éléments, charger plus tard, réduire la charge de travail sur le main thread — permettent d’obtenir la grande majorité des gains. Ce guide présente les métriques, les outils et les techniques les plus importants.

Core Web Vitals

Trois indicateurs, regroupés sous le nom de Core Web Vitals, décrivent l’expérience utilisateur :

  • Largest Contentful Paint (LCP) — le moment où l’élément visible le plus volumineux termine son rendu. Un bon score se situe en dessous de 2,5 secondes.
  • Interaction to Next Paint (INP) — la latence entre l’interaction d’un utilisateur et la mise à jour visuelle suivante. Un bon score se situe en dessous de 200 millisecondes.
  • Cumulative Layout Shift (CLS) — la mesure du déplacement inattendu du contenu visible. Un bon score se situe en dessous de 0,1.

D’autres indicateurs complémentaires incluent le Time to First Byte (TTFB) pour la latence du serveur et le First Contentful Paint (FCP) pour le moment où le premier élément apparaît. Ensemble, ils vous indiquent si une page est rapide, réactive et stable.

Mesurer

Vous avez besoin à la fois de données de terrain (field data) et de données de laboratoire (lab data).

Les données de terrain proviennent d’utilisateurs réels et reflètent la diversité réelle des appareils et des réseaux. C’est l’indicateur que vous devez optimiser. Les données de laboratoire, issues de Lighthouse ou des DevTools, sont reproductibles, ce qui les rend plus adaptées pour diagnostiquer un problème spécifique.

Le navigateur expose les timings réels via la Performance API.

// observe.js
new PerformanceObserver((list) => {
  for (const entry of list.getEntries()) {
    console.log(entry.name, entry.startTime);
  }
}).observe({ type: "largest-contentful-paint", buffered: true });

Des bibliothèques comme web-vitals encapsulent ces observers et envoient les rapports à vos outils d’analyse, ce qui vous permet d’obtenir des données de terrain sans avoir à construire toute l’infrastructure vous-même.

Charger moins de ressources

Le levier le plus puissant consiste à livrer moins de code. JavaScript est la ressource la plus coûteuse car elle doit être téléchargée, analysée et exécutée, entrant ainsi en compétition avec le rendu pour l’accès au thread principal.

  • Supprimez les dépendances inutilisées et privilégiez des alternatives plus légères.
  • N’importez que les fonctions que vous utilisez réellement d’une bibliothèque.
  • Fractionnez vos routes et vos fonctionnalités lourdes avec des import() dynamiques.
  • Effectuez le rendu côté serveur dès que possible et ne livrez que les parties interactives.
  • Compressez et servez des formats modernes tels que Brotli et AVIF.
  • Définissez un budget de bundle et faites échouer la CI s’il est dépassé.

Un analyseur de bundle montre exactement ce qui se trouve dans votre build, ce qui est généralement surprenant la première fois.

Chargement différé

Tout n’est pas nécessaire pour le premier rendu (first paint). Différez le reste.

<!-- deferred.js -->
<script src="app.js" defer></script>
<script src="analytics.js" async></script>
<img src="hero.avif" fetchpriority="high" alt="Hero" />
<img src="thumb.avif" loading="lazy" decoding="async" width="400" height="300" alt="" />

defer exécute les scripts après l’analyse (parsing), async les exécute dès qu’ils sont téléchargés, fetchpriority="high" priorise l’image LCP, et loading="lazy" diffère le chargement des images hors écran. L’import dynamique import() fait la même chose pour les modules JavaScript.

Rendu et stabilité

Deux problèmes de rendu impactent majoritairement le CLS et la vitesse perçue.

Réservez l’espace pour les images, les iframes, les publicités et les contenus intégrés afin qu’ils ne déplacent pas le contenu environnant. Définissez width et height, ou utilisez aspect-ratio en CSS. Adoptez une stratégie de police qui évite le remplacement tardif (late swap), comme font-display: swap avec une police de secours correspondante ou des polices auto-hébergées.

Libérez le thread principal. Les tâches longues bloquent l’interaction et augmentent l’INP. Fractionnez les opérations coûteuses, déplacez les calculs lourds vers un Web Worker et évitez le “layout thrashing” en regroupant les lectures et écritures du DOM.

Mise en cache

La mise en cache transforme les visites répétées en chargements instantanés. Utilisez le fingerprinting pour vos assets avec des hashs de contenu et servez-les avec un max-age Cache-Control long, car tout fichier modifié recevra un nouveau nom. Servez le HTML avec un cache court et une revalidation. Pour le mode hors ligne et la rapidité des visites répétées, un service worker peut mettre en cache l’app shell et les assets, comme détaillé dans le guide PWA.

Budgets de performance

Un budget transforme la performance en une contrainte plutôt qu’en un simple souhait.

{
  "budgets": [
    { "path": "/*", "resourceSizes": [{ "resourceType": "script", "budget": 170 }] }
  ]
}

Définissez une limite réaliste pour le JavaScript, les images et le LCP, puis imposez-la dans votre CI. Lorsqu’une pull request dépasse le budget, le build échoue et l’auteur doit décider si le compromis en vaut la peine. C’est ainsi que les équipes empêchent la dégradation des performances au fil du temps.

Bonnes pratiques

  • Mesurez avant d’optimiser, et utilisez à la fois les données de terrain (field data) et les données de laboratoire (lab data).
  • Réduisez la quantité de JavaScript envoyée avant de tenter toute micro-optimisation.
  • Utilisez le lazy-loading pour les images situées sous la ligne de flottaison (below-the-fold) et fragmentez les routes lourdes.
  • Définissez des dimensions explicites pour vos médias afin de protéger le CLS.
  • Utilisez fetchpriority, defer et async de manière réfléchie.
  • Utilisez le fingerprinting pour vos assets et mettez-les en cache sur le long terme.
  • Définissez et imposez un budget de bundle dans votre CI.

Erreurs courantes

  • Optimiser le mauvais élément sans effectuer de mesures préalables.
  • Livrer un bundle client volumineux pour du contenu qui pourrait être statique.
  • Charger systématiquement toutes les images et tous les scripts (eager loading).
  • Omettre les dimensions des images, provoquant ainsi un layout shift.
  • Bloquer le thread principal avec des tâches synchrones trop longues.
  • Traiter la performance comme un projet ponctuel plutôt que comme un budget continu.

Et après ?

La performance est une discipline, pas une simple liste de tâches. Utilisez Vite pour fractionner et analyser votre bundle, réduisez le poids de votre JavaScript en suivant les modèles du guide React, ajoutez la mise en cache hors ligne avec les PWA, et libérez le thread principal grâce à un JavaScript solide. Ensuite, mesurez votre propre site avec des données de terrain et choisissez le changement unique qui aura le plus grand impact.

Chargement des images

Utilisez le lazy-load pour les images sous la ligne de flottaison et définissez des dimensions explicites. Le chargement immédiat et l'absence de dimensions nuisent au LCP et provoquent des décalages de mise en page.

À privilégier
<img
  src="hero.avif"
  width="1200"
  height="600"
  alt="Hero"
  fetchpriority="high"
/>
<img
  src="thumb.avif"
  width="400"
  height="300"
  loading="lazy"
  alt=""
/>
À éviter
<img src="hero.png" alt="Hero" />
<img src="thumb.png" alt="" />
<!-- no dimensions,
     everything eager -->

Chargement des scripts

Les scripts non critiques ne doivent pas bloquer l'analyse du HTML. Différez-les ou chargez-les à la demande.

À privilégier
<script src="app.js" defer></script>
<!-- or load when needed -->
<script type="module">
  import("./heavy.js");
</script>
À éviter
<head>
  <script src="analytics.js"></script>
  <script src="heavy-widget.js"></script>
</head>

FAQ

Foire aux questions

Keep learning

Related topics from the roadmap.

$ commencer à apprendre

Prêt à apprendre Web Performance ?

Notre tutoriel interactif vous guide à travers Web Performance pas à pas — avec des quiz et du vrai code que vous pouvez exécuter dans le navigateur.