JL
Johan Lorck
PERFORMANCE
25 janvier 20258 min de lecture

Comment optimiser les performances de votre application Next.js

Next.js est aujourd'hui l'un des frameworks React les plus populaires pour créer des applications web rapides, performantes et optimisées pour le SEO.

Cependant, utiliser Next.js ne garantit pas automatiquement des performances optimales. De bonnes pratiques sont nécessaires pour exploiter tout son potentiel.

Dans cet article, nous allons voir les principales stratégies pour optimiser les performances d'une application Next.js, aussi bien côté serveur que côté client.

1. Choisir la bonne méthode de rendu

Next.js propose plusieurs modes de rendu, et le choix a un impact direct sur les performances. C'est un peu comme choisir entre cuire un plat à l'avance ou le préparer à la commande dans un restaurant.

Static Site Generation (SSG)

Analogie : Comme préparer tous les plats à l'avance et les servir instantanément.

  • Génère les pages au moment du build
  • Temps de chargement ultra-rapide (pages servies depuis un CDN)
  • Idéal pour les pages peu dynamiques (blog, landing pages, portfolios)
export async function getStaticProps() {
  const data = await fetchData();
  return { props: { data } };
}

💡 En pratique : Utilisez SSG pour un blog d'entreprise. Les articles sont générés une fois au build, puis servis instantanément. Résultat : chargement en < 500ms.

Server Side Rendering (SSR)

Analogie : Comme préparer chaque plat à la commande, frais mais plus lent.

  • Génère la page à chaque requête
  • Utile pour du contenu très dynamique (tableau de bord, données en temps réel)
  • Plus coûteux en ressources serveur et plus lent

⚠️ Attention : SSR ralentit le temps de réponse car chaque visite nécessite une génération côté serveur. À n'utiliser que si les données changent constamment.

Incremental Static Regeneration (ISR)

Analogie : Le meilleur des deux mondes – préparer à l'avance, mais rafraîchir régulièrement.

  • Combine performance du SSG et fraîcheur des données du SSR
  • Régénération des pages après un certain délai (ex: toutes les 60 secondes)
  • Idéal pour e-commerce, news, contenu mis à jour régulièrement
export async function getStaticProps() {
  const data = await fetchData();
  return {
    props: { data },
    revalidate: 60 // Régénère toutes les 60 secondes
  };
}

💡 En pratique : Un site e-commerce avec ISR : les pages produits sont rapides comme du SSG, mais les prix/stocks sont rafraîchis toutes les minutes automatiquement.

→ Voir notre guide Shopify Headless avec Next.js

👉 Astuce : Privilégiez le SSG ou l'ISR dès que possible pour des performances optimales.

2. Optimiser le chargement des images

Les images représentent souvent la plus grosse part du poids d'une page (parfois 70% du poids total). Une image mal optimisée peut ruiner vos performances.

Utiliser le composant next/image

Next.js fournit un composant <Image> qui optimise automatiquement vos images. C'est comme avoir un assistant qui redimensionne et compresse chaque image pour vous.

  • Lazy loading automatique : les images ne chargent que quand elles deviennent visibles
  • Redimensionnement intelligent : adapte la taille selon l'écran (mobile vs desktop)
  • Formats modernes : convertit automatiquement en WebP ou AVIF (jusqu'à 30% plus légers)
  • Pas de CLS : réserve l'espace pour éviter le décalage de mise en page
❌ Avant (balise classique) :
<img src="/hero.png" alt="Hero" />
✅ Après (next/image) :
import Image from "next/image";

<Image
  src="/hero.png"
  alt="Hero"
  width={1200}
  height={600}
  priority // Pour les images "above the fold"
/>

📌 Résultat : Sur un site e-commerce, passer de <img> à <Image> a réduit le poids de la page de 3.2 Mo à 800 Ko, et le LCP (Largest Contentful Paint) est passé de 4.2s à 1.1s.

3. Réduire le JavaScript envoyé au client

Moins de JavaScript = chargement plus rapide. Chaque kilooctet de JavaScript doit être téléchargé, parsé et exécuté par le navigateur. C'est coûteux, surtout sur mobile.

Dynamic Imports (chargement à la demande)

Au lieu de charger tout le code d'un coup, chargez certains composants uniquement quand ils sont nécessaires. C'est comme ne sortir les outils du garage que quand vous en avez besoin.

❌ Avant (tout est chargé au démarrage) :
import HeavyComponent from "./HeavyComponent";

export default function Page() {
  return <HeavyComponent />;
}
✅ Après (chargement dynamique) :
import dynamic from "next/dynamic";

const HeavyComponent = dynamic(() => import("./HeavyComponent"), {
  ssr: false, // Ne charge pas côté serveur
  loading: () => <p>Chargement...</p>
});

export default function Page() {
  return <HeavyComponent />;
}

💡 Cas d'usage : Un composant de chat en direct ? Chargez-le uniquement quand l'utilisateur clique sur le bouton "Support". Gain : -150 Ko de JavaScript au chargement initial.

Supprimer le code inutile

  • Évitez les librairies lourdes

    Exemple : moment.js (232 Ko) → utilisez date-fns (13 Ko) ou dayjs (7 Ko)

  • Nettoyez les dépendances non utilisées

    Vérifiez votre package.json régulièrement avec npx depcheck

  • Utilisez le tree-shaking

    Importez uniquement ce dont vous avez besoin : import {useEffect} from 'react' au lieu de import * as React

4. Exploiter le caching intelligemment

Le cache permet d'éviter de refaire le même travail plusieurs fois. C'est comme sauvegarder vos réponses pour ne pas avoir à recalculer à chaque fois.

Cache côté serveur

  • Utilisez les headers HTTP (Cache-Control)
  • Activez le cache avec ISR
  • Utilisez un CDN (Vercel, Cloudflare)

Cache côté client

  • Utilisez SWR ou React Query
  • Données mises en cache automatiquement
  • Révalidation en arrière-plan
Exemple avec SWR :
import useSWR from 'swr';

const { data } = useSWR('/api/data', fetcher);
// Les données sont mises en cache automatiquement
// Pas de rechargement inutile

✔️ Résultat : Moins de requêtes réseau, navigation plus fluide, expérience utilisateur améliorée.

5. Optimiser les polices et les CSS

Polices optimisées avec next/font

Next.js 13+ intègre next/font qui optimise automatiquement le chargement des polices Google Fonts ou personnalisées.

  • Chargement plus rapide (polices auto-hébergées)
  • Moins de CLS (Cumulative Layout Shift) – le texte ne "saute" pas au chargement
  • Pas de requête externe vers Google Fonts
import { Inter } from "next/font/google";

const inter = Inter({ subsets: ['latin'] });

export default function Layout({ children }) {
  return <body className={inter.className}>{children}</body>;
}

CSS efficace

  • Utilisez CSS Modules ou Tailwind CSS

    Évite les conflits, génère uniquement le CSS nécessaire

  • Supprimez le CSS inutilisé

    Tailwind le fait automatiquement avec PurgeCSS

  • Évitez les fichiers CSS globaux trop lourds

    Préférez des styles scopés par composant

6. Surveiller et analyser les performances

Vous ne pouvez pas améliorer ce que vous ne mesurez pas. Utilisez ces outils pour surveiller vos performances.

Outils recommandés

  • Lighthouse (dans Chrome DevTools)
  • Web Vitals (librairie @vercel/analytics)
  • Next.js Analytics (sur Vercel)
  • Chrome DevTools (onglet Performance)

Métriques à surveiller

  • LCP (Largest Contentful Paint)

    Temps pour afficher le contenu principal (< 2.5s)

  • CLS (Cumulative Layout Shift)

    Stabilité visuelle (< 0.1)

  • INP (Interaction to Next Paint)

    Réactivité des interactions (< 200ms)

💡 Conseil : Visez un score Lighthouse de 95+ sur toutes les métriques (Performance, Accessibilité, SEO, Best Practices).

7. Déployer sur une infrastructure adaptée

Le choix de l'hébergement influence fortement les performances. Une app Next.js optimisée sur un mauvais serveur restera lente.

Bonnes pratiques d'infrastructure

Utiliser un CDN

Vos fichiers statiques (images, CSS, JS) sont distribués mondialement. L'utilisateur récupère les fichiers depuis le serveur le plus proche. Résultat : chargement 3-5x plus rapide.

Déployer sur Vercel ou Netlify

Ces plateformes sont optimisées pour Next.js : edge functions, CDN intégré, cache intelligent, build ultra-rapide.

Activer le edge rendering

Avec Vercel Edge Functions, votre code s'exécute au plus près de l'utilisateur (latence < 50ms).

Conclusion

Optimiser les performances d'une application Next.js ne repose pas sur une seule technique, mais sur une combinaison de bonnes pratiques :

  • Choisir le bon mode de rendu (SSG, ISR > SSR)
  • Optimiser les images avec next/image
  • Réduire le JavaScript avec les dynamic imports
  • Exploiter le caching (serveur + client)
  • Surveiller les Web Vitals régulièrement
  • Déployer sur une infrastructure optimisée (Vercel, CDN)

En appliquant ces conseils, vous offrirez à vos utilisateurs une expérience plus rapide, plus fluide et mieux référencée.

🚀 Passez à l'action !

Commencez par auditer votre site avec Lighthouse, identifiez les 2-3 optimisations prioritaires, et implémentez-les progressivement. Les résultats seront visibles immédiatement.

JL

Johan Lorck

Développeur Next.js freelance spécialisé dans la création de sites web performants et optimisés. J'aide les entreprises à exploiter tout le potentiel de Next.js.

Discutons de votre projet →