Prérequis
- Niveau : avoir un site déjà en ligne, bases HTML/CSS/JS.
- Outils : Chrome DevTools (Lighthouse intégré), PageSpeed Insights, GTmetrix, Squoosh (compression d’images).
- Temps estimé : 1 h 30 (audit + premières optimisations).
Pourquoi optimiser ?
Trois raisons concrètes : (1) SEO — depuis 2021, Google utilise les Core Web Vitals (LCP, INP, CLS) comme facteur de classement ; (2) conversion — chaque seconde de chargement supplémentaire fait chuter le taux de conversion ; (3) coût serveur — pages allégées = moins de bande passante = factures réduites. Ce guide donne les optimisations à 80 % d’impact pour 20 % d’effort.
Pourquoi la vitesse compte
Un site qui met plus de 3 secondes à charger perd 53% de ses visiteurs. Google pénalise les sites lents dans les résultats de recherche. Voici les optimisations concrètes qui font la plus grande différence.
1. Optimiser les images (le plus gros gain)
Les images représentent souvent 60-80% du poids d’une page.
Choisir le bon format
| Format | Utilisation | Taille |
|---|---|---|
| WebP | Photos, illustrations | 25-35% plus léger que JPEG |
| JPEG | Photos (fallback) | Qualité 75-85% suffisante |
| PNG | Logos, icônes (transparence) | Plus lourd |
| SVG | Icônes, logos simples | Ultra léger, scalable |
| AVIF | Photos (nouveau) | 50% plus léger que JPEG |
Lazy loading (chargement différé)
<!-- L'image ne se charge que quand l'utilisateur scrolle jusqu'à elle -->
<img src="photo.webp" alt="Description" loading="lazy" width="800" height="600">
<!-- Toujours spécifier width et height pour éviter le décalage de mise en page -->
Images responsive avec srcset
<img
srcset="photo-400.webp 400w,
photo-800.webp 800w,
photo-1200.webp 1200w"
sizes="(max-width: 600px) 400px,
(max-width: 1000px) 800px,
1200px"
src="photo-800.webp"
alt="Description"
loading="lazy">
2. Minifier CSS et JavaScript
Voici la mise en pratique pour 2. Minifier CSS et JavaScript. Le bloc ci-dessous est copiable directement dans votre projet, lisible ligne par ligne. Lisez-le une première fois en survol pour repérer la structure générale, puis adaptez les noms de variables, identifiants et valeurs à votre contexte avant de l’exécuter en local.
/* AVANT : style.css (2.4 Ko) */
.header {
background-color: #ffffff;
padding: 20px 40px;
box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);
}
/* APRÈS : style.min.css (120 octets) */
.header{background-color:#fff;padding:20px 40px;box-shadow:0 2px 10px rgba(0,0,0,.1)}
Outils gratuits :
- CSS : cssnano ou clean-css
- JavaScript : terser ou uglify-js
- En ligne : cssminifier.com, javascript-minifier.com
3. Réduire les requêtes HTTP
Voici la mise en pratique pour 3. Réduire les requêtes HTTP. Le bloc ci-dessous est copiable directement dans votre projet, lisible ligne par ligne. Lisez-le une première fois en survol pour repérer la structure générale, puis adaptez les noms de variables, identifiants et valeurs à votre contexte avant de l’exécuter en local.
<!-- ❌ Mauvais : 5 fichiers CSS = 5 requêtes -->
<link rel="stylesheet" href="reset.css">
<link rel="stylesheet" href="header.css">
<link rel="stylesheet" href="main.css">
<link rel="stylesheet" href="footer.css">
<link rel="stylesheet" href="responsive.css">
<!-- ✅ Bon : 1 fichier combiné = 1 requête -->
<link rel="stylesheet" href="style.min.css">
4. Préchargement des ressources critiques
Voici la mise en pratique pour 4. Préchargement des ressources critiques. Le bloc ci-dessous est copiable directement dans votre projet, lisible ligne par ligne. Lisez-le une première fois en survol pour repérer la structure générale, puis adaptez les noms de variables, identifiants et valeurs à votre contexte avant de l’exécuter en local.
<head>
<!-- Précharger la police (évite le flash de texte) -->
<link rel="preload" href="police.woff2" as="font" type="font/woff2" crossorigin>
<!-- Préconnecter aux domaines tiers -->
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://cdn.example.com">
<!-- CSS critique en inline (above the fold) -->
<style>
/* Styles pour ce qui est visible immédiatement */
body { font-family: sans-serif; margin: 0; }
.header { background: #fff; padding: 20px; }
</style>
<!-- Charger le reste du CSS en différé -->
<link rel="stylesheet" href="style.css" media="print" onload="this.media='all'">
</head>
5. Mise en cache du navigateur
Voici la mise en pratique pour 5. Mise en cache du navigateur. Le bloc ci-dessous est copiable directement dans votre projet, lisible ligne par ligne. Lisez-le une première fois en survol pour repérer la structure générale, puis adaptez les noms de variables, identifiants et valeurs à votre contexte avant de l’exécuter en local.
# .htaccess (Apache)
<IfModule mod_expires.c>
ExpiresActive On
ExpiresByType image/webp "access plus 1 year"
ExpiresByType image/jpeg "access plus 1 year"
ExpiresByType text/css "access plus 1 month"
ExpiresByType application/javascript "access plus 1 month"
ExpiresByType font/woff2 "access plus 1 year"
</IfModule>
# Compression GZIP
<IfModule mod_deflate.c>
AddOutputFilterByType DEFLATE text/html text/css application/javascript
</IfModule>
6. Optimisations JavaScript
Voici la mise en pratique pour 6. Optimisations JavaScript. Le bloc ci-dessous est copiable directement dans votre projet, lisible ligne par ligne. Lisez-le une première fois en survol pour repérer la structure générale, puis adaptez les noms de variables, identifiants et valeurs à votre contexte avant de l’exécuter en local.
<!-- ❌ Bloque le rendu de la page -->
<script src="app.js"></script>
<!-- ✅ defer : exécute après le parsing HTML -->
<script src="app.js" defer></script>
<!-- ✅ async : télécharge en parallèle (pour scripts indépendants) -->
<script src="analytics.js" async></script>
7. Tester vos performances
🔧 Outils gratuits indispensables
- Google PageSpeed Insights : score de 0 à 100 + recommandations détaillées
- GTmetrix : analyse complète avec waterfall des requêtes
- Chrome DevTools (F12) : onglet Network pour voir chaque requête, onglet Lighthouse pour un audit
- WebPageTest : test depuis différentes régions du monde
Checklist rapide d’optimisation
- ☐ Images en WebP avec lazy loading
- ☐ CSS et JS minifiés et combinés
- ☐ Compression GZIP activée
- ☐ Cache navigateur configuré
- ☐ Scripts avec
deferouasync - ☐ Polices préchargées en WOFF2
- ☐ CSS critique en inline
- ☐ Score PageSpeed > 90 sur mobile
Erreurs fréquentes
Optimiser les mauvaises ressources
Cause : on commence par minifier le CSS (gain : quelques Ko) alors que les images font 5 Mo.
Solution : ouvrez l’onglet Network des DevTools, triez par taille décroissante, et attaquez les plus lourds en premier.
Lazy loading sur l’image hero
Cause : on met loading="lazy" sur la première image visible (LCP) → le LCP s’effondre.
Solution : loading="eager" (ou rien) sur l’image hero, fetchpriority="high" recommandé. lazy uniquement sur les images sous la ligne de flottaison.
Polices web qui flashent (FOUT/FOIT)
Cause : les polices se chargent après le rendu, le texte saute.
Solution : <link rel="preload"> sur la police critique + font-display: swap dans @font-face + privilégier WOFF2.
Cache trop agressif sur les fichiers de version
Cause : cache d’un an sur style.css sans suffixe de version → les utilisateurs gardent l’ancienne version après une mise à jour.
Solution : ajoutez un hash dans le nom (style.a1b2c3.css) ou un paramètre de version (style.css?v=42).
Exercice pratique
🎯 Défi : Auditez et optimisez votre site
- Testez votre site avec PageSpeed Insights et notez le score
- Convertissez toutes les images en WebP et ajoutez
loading="lazy" - Minifiez vos fichiers CSS et JS
- Ajoutez les balises
defersur vos scripts - Retestez et comparez le nouveau score
Seuils Core Web Vitals 2026
| Métrique | Bon | À améliorer | Mauvais |
|---|---|---|---|
| LCP | ≤ 2,5 s | 2,6-4,0 s | > 4,0 s |
| INP | ≤ 200 ms | 201-500 ms | > 500 ms |
| CLS | ≤ 0,1 | 0,11-0,25 | > 0,25 |
Pour un site marchand qui sert majoritairement Dakar et Abidjan sur 4G fluctuante, viser le percentile 75 signifie qu’au moins 3 utilisateurs sur 4 doivent obtenir un LCP sous 2,5 secondes.
Étape 2 : Diffèrement du JavaScript
Voici la mise en pratique pour Étape 2 : Diffèrement du JavaScript. Le bloc ci-dessous est copiable directement dans votre projet, lisible ligne par ligne. Lisez-le une première fois en survol pour repérer la structure générale, puis adaptez les noms de variables, identifiants et valeurs à votre contexte avant de l’exécuter en local.
<script src='/app.js' defer></script>
<script src='https://exemple.com/pixel.js' async></script>
Pour les bibliothèques utilisées seulement après une interaction, passez à l’import dynamique.
document.getElementById('payer').addEventListener('click', async () => {
const { ouvrirCheckout } = await import('./checkout.js');
ouvrirCheckout();
});
Étape 3 : AVIF en priorité, WebP en repli
Voici la mise en pratique pour Étape 3 : AVIF en priorité, WebP en repli. Le bloc ci-dessous est copiable directement dans votre projet, lisible ligne par ligne. Lisez-le une première fois en survol pour repérer la structure générale, puis adaptez les noms de variables, identifiants et valeurs à votre contexte avant de l’exécuter en local.
<picture>
<source type='image/avif' srcset='hero.avif'>
<source type='image/webp' srcset='hero.webp'>
<img src='hero.jpg' alt='Centre de formation à Cotonou' width='1200' height='630' loading='eager' fetchpriority='high'>
</picture>
Étape 4 : Polices critiques
Voici la mise en pratique pour Étape 4 : Polices critiques. Le bloc ci-dessous est copiable directement dans votre projet, lisible ligne par ligne. Lisez-le une première fois en survol pour repérer la structure générale, puis adaptez les noms de variables, identifiants et valeurs à votre contexte avant de l’exécuter en local.
<link rel='preload' href='/fonts/inter-var.woff2' as='font' type='font/woff2' crossorigin>
@font-face {
font-family: 'Inter';
src: url('/fonts/inter-var.woff2') format('woff2-variations');
font-weight: 100 900;
font-display: swap;
}
Étape 5 : Cache HTTP
Voici la mise en pratique pour Étape 5 : Cache HTTP. Le bloc ci-dessous est copiable directement dans votre projet, lisible ligne par ligne. Lisez-le une première fois en survol pour repérer la structure générale, puis adaptez les noms de variables, identifiants et valeurs à votre contexte avant de l’exécuter en local.
location ~* \.(?:css|js|woff2|avif|webp)$ {
expires 1y;
add_header Cache-Control 'public, max-age=31536000, immutable';
}
location ~* \.html$ {
add_header Cache-Control 'no-cache';
}
Étape 6 : Réduire les recalculs (INP)
- scheduler.yield() Chrome 129+, rend la main au navigateur entre étapes lourdes.
- Web Worker pour tout traitement > 50 ms.
- Virtualiser les longues listes : afficher uniquement la fenêtre visible.
Étape 7 : Mesurer en conditions réelles avec CrUX
| Outil | Type de donnée | Quand l’utiliser |
|---|---|---|
| PageSpeed Insights | Lab + terrain (CrUX) | Audit ponctuel |
| Search Console > Web Vitals | Terrain CrUX | Suivi mensuel |
| web-vitals.js | Terrain temps réel | Mesure dans analytics |
import { onLCP, onINP, onCLS } from 'web-vitals';
onLCP((m) => envoyer('lcp', m.value));
onINP((m) => envoyer('inp', m.value));
onCLS((m) => envoyer('cls', m.value));
Adaptation au contexte ouest-africain : performance, équipe, marché
Pour un développeur ou une PME basée à Dakar, Abidjan, Bamako, Cotonou, Lomé, Ouagadougou, Niamey ou Conakry qui livre des sites web ou applications custom, trois adaptations pèsent sur le succès des projets. Premièrement, la connectivité 4G inégale impose de réduire le poids des pages au strict nécessaire. Deuxièmement, le profil typique des développeurs disponibles localement est majoritairement formé sur du JavaScript moderne et du PHP, avec une expertise variable sur les outils plus avancés (TypeScript, frameworks edge, design systems). Troisièmement, le coût en FCFA des services cloud doit être anticipé : Hetzner CX22 à 4 500 FCFA/mois reste imbattable pour un démarrage, Cloudflare Pages gratuit pour les sites statiques, Backblaze B2 à 6 USD/TB/mois pour les sauvegardes. Pour les projets B2C qui exigent une latence faible, héberger sur un CDN avec PoP africain (Cloudflare Lagos, Africa Data Centres) divise par trois la latence perçue par rapport à un déploiement européen sans CDN.
Tester sur appareils réels avant la mise en production
Plus important que tous les outils synthétiques, tester son site sur un Android d’entrée de gamme avec une connexion 4G locale dégradée donne le seul verdict qui compte. Galaxy A03 à 200 EUR neuf, Tecno Spark, Itel A60 sont les appareils dominants chez les visiteurs ouest-africains. Sur ces téléphones, un site qui semble rapide sur DevTools peut être laggy en réalité. Pour explorer plus loin sur les patterns frontend modernes, voir aussi le guide événements JavaScript.
Erreurs courantes à éviter en production
Trois patterns reviennent dans les projets web mal exécutés et coûtent cher à corriger plus tard. Premier pattern : copier-coller de code Stack Overflow sans comprendre le contexte d’origine. Une solution qui marche pour un cas particulier devient un bug subtil dans un autre. Deuxième pattern : ignorer les warnings de la console. Chaque warning est un signal qui mérite d’être lu et compris. Troisième pattern : ne pas tester sur de vrais appareils. DevTools simule mais ne remplace pas un test physique sur un Android d’entrée de gamme avec une 4G dégradée. Documenter chaque décision technique majeure dans un fichier ADR (Architecture Decision Record) prend dix minutes et fait gagner des heures lors d’un incident ou d’un audit.
Erreurs courantes à éviter en production
Trois patterns reviennent dans les projets web mal exécutés et coûtent cher à corriger plus tard. Premier pattern : copier-coller de code Stack Overflow sans comprendre le contexte d’origine. Une solution qui marche pour un cas particulier devient un bug subtil dans un autre. Deuxième pattern : ignorer les warnings de la console. Chaque warning est un signal qui mérite d’être lu et compris. Troisième pattern : ne pas tester sur de vrais appareils. DevTools simule mais ne remplace pas un test physique sur un Android d’entrée de gamme avec une 4G dégradée. Documenter chaque décision technique majeure dans un fichier ADR (Architecture Decision Record) prend dix minutes et fait gagner des heures lors d’un incident ou d’un audit.
Pratiques avancées et outils complémentaires
Au-delà des patterns présentés, plusieurs outils et techniques complètent une maîtrise sérieuse du sujet. Premier axe : automatiser la qualité via une pipeline CI (GitHub Actions, GitLab CI) qui exécute tests, linting et audit de sécurité avant chaque déploiement. Cela évite 80 % des régressions introduites par des modifications hâtives. Deuxième axe : monitorer en production avec un outil comme Sentry pour les erreurs JavaScript ou New Relic pour les performances applicatives — la plupart proposent un free tier qui suffit pour démarrer. Troisième axe : documenter les décisions importantes dans un dossier docs/adr/ du projet, avec un format simple (contexte, décision, conséquences). Cette traçabilité paie quand un nouveau membre rejoint l’équipe ou quand un audit externe demande de justifier les choix techniques.
Ressources francophones pour approfondir
Plusieurs ressources gratuites en français permettent de monter en compétence rapidement. MDN Web Docs reste la documentation de référence, intégralement traduite pour la majorité des sujets. FreeCodeCamp propose des parcours de 300+ heures avec exercices interactifs et certificat. JavaScript.info (en français : fr.javascript.info) couvre le langage en profondeur. Grafikart.fr offre des centaines de tutoriels vidéos en français de qualité. Pour la pratique, contribuer à un projet open source via GitHub est l’investissement le plus payant à moyen terme — recruteurs et clients regardent les contributions GitHub avant le CV.
Pratiques avancées et outils complémentaires
Au-delà des patterns présentés, plusieurs outils et techniques complètent une maîtrise sérieuse du sujet. Premier axe : automatiser la qualité via une pipeline CI (GitHub Actions, GitLab CI) qui exécute tests, linting et audit de sécurité avant chaque déploiement. Cela évite 80 % des régressions introduites par des modifications hâtives. Deuxième axe : monitorer en production avec un outil comme Sentry pour les erreurs JavaScript ou New Relic pour les performances applicatives — la plupart proposent un free tier qui suffit pour démarrer. Troisième axe : documenter les décisions importantes dans un dossier docs/adr/ du projet, avec un format simple (contexte, décision, conséquences). Cette traçabilité paie quand un nouveau membre rejoint l’équipe ou quand un audit externe demande de justifier les choix techniques.
Ressources francophones pour approfondir
Plusieurs ressources gratuites en français permettent de monter en compétence rapidement. MDN Web Docs reste la documentation de référence, intégralement traduite pour la majorité des sujets. FreeCodeCamp propose des parcours de 300+ heures avec exercices interactifs et certificat. JavaScript.info (en français : fr.javascript.info) couvre le langage en profondeur. Grafikart.fr offre des centaines de tutoriels vidéos en français de qualité. Pour la pratique, contribuer à un projet open source via GitHub est l’investissement le plus payant à moyen terme — recruteurs et clients regardent les contributions GitHub avant le CV.
Pour explorer plus loin
- Galerie photo responsive avec CSS Grid
- Site responsive avec media queries
- Référence : web.dev — Learn Performance
- Core Web Vitals : web.dev — Core Web Vitals
- Audit en ligne : PageSpeed Insights et GTmetrix
- Compression images : Squoosh (Google, gratuit, navigateur)
Site web clé-en-main
Conception, hébergement, formation, support — tout est compris. Vous repartez avec un site qui fonctionne et la maîtrise pour le faire évoluer.
À partir de 350 000 FCFA