Optimisation des performances Next.js : Guide pratique pour accélérer vos applications
Apprenez à accélérer les applications Next.js avec l'optimisation d'images, le fractionnement de code, la génération statique, le chargement de polices et la réduction de la taille des bundles.

Créer des applications web rapides est essentiel. Next.js fournit de nombreuses fonctionnalités de performance intégrées, mais il est important de suivre les évolutions récentes (v14/v15) :
- Node.js minimum : 18.17.
- La commande
next export
est remplacée paroutput: 'export'
dansnext.config.js
. - Le package
@next/font
est supprimé, utiliseznext/font
intégré. - Les APIs
cookies
,headers
,draftMode
sont désormais asynchrones (await
requis) en Next.js 15. - Les requêtes
fetch
ne sont plus mises en cache par défaut (cache: 'force-cache'
si besoin). - Certaines options de configuration ont changé (
experimental-edge
→edge
). - Pensez à mettre à jour
@types/react
et@types/react-dom
si vous utilisez TypeScript.
Voir le guide officiel de migration pour plus de détails.
Optimisation des Images
Les images volumineuses ou non optimisées sont un goulot d'étranglement courant. Le composant <Image>
intégré de Next.js aide à optimiser automatiquement les images pour vous. Il sert des images de taille correcte dans des formats modernes (comme WebP/AVIF) et active le chargement paresseux par défaut. Par exemple, utilisez simplement <Image>
dans votre composant :
1import Image from "next/image";
2
3export default function Hero() {
4 return (
5 <div>
6 <Image
7 src="/images/hero.jpg"
8 alt="Section Hero"
9 width={1200}
10 height={600}
11 priority
12 />
13 <p>Bienvenue sur le site !</p>
14 </div>
15 );
16}
- Chargement paresseux : Les images se chargent uniquement lorsqu'elles entrent dans la fenêtre d'affichage, réduisant le poids de chargement initial.
- Tailles réactives :
<Image>
sélectionne automatiquement une taille et un format appropriés (par exemple WebP) pour chaque appareil. - Espaces réservés : Vous pouvez utiliser
placeholder="blur"
pour afficher un aperçu de faible qualité pendant que l'image complète se charge.
En utilisant <Image>
, vous obtenez une compression intelligente, un dimensionnement approprié et un Cumulative Layout Shift (CLS) amélioré automatiquement.
Fractionnement de Code et Chargement Paresseux
Next.js fractionne automatiquement votre code au niveau de la page. Chaque page et Composant Serveur est regroupé séparément, donc seul le JavaScript nécessaire pour la page actuelle est chargé initialement. Cependant, vous pouvez réduire davantage le temps de chargement initial en chargeant paresseusement des composants ou des bibliothèques non critiques.
1import dynamic from "next/dynamic";
2
3const DynamicChart = dynamic(() => import("../components/Chart"), {
4 loading: () => <p>Chargement du graphique...</p>,
5});
6
7export default function Dashboard() {
8 return (
9 <div>
10 <h1>Tableau de Bord des Ventes</h1>
11 <DynamicChart />
12 </div>
13 );
14}
Dans l'exemple ci-dessus, le composant Chart
(qui pourrait être une grande bibliothèque de graphiques) n'est pas inclus dans le bundle principal.
Génération Statique (SSG) et Mises à Jour Incrémentales
Next.js prend en charge plusieurs stratégies de rendu. La Génération de Site Statique (SSG) est souvent la plus rapide : les pages sont pré-construites au moment de la construction et servies en tant que HTML statique.
1// pages/index.js
2export async function getStaticProps() {
3 const res = await fetch("https://api.example.com/posts");
4 const posts = await res.json();
5 return { props: { posts } };
6}
7
8export default function HomePage({ posts }) {
9 return (
10 <div>
11 <h1>Derniers Articles</h1>
12 <ul>
13 {posts.map((post) => (
14 <li key={post.id}>{post.title}</li>
15 ))}
16 </ul>
17 </div>
18 );
19}
Cela indique à Next.js de générer le HTML pour /
une fois pendant next.build
. Le résultat est une page extrêmement rapide et statique.
Chargement et Optimisation des Polices
Les polices web peuvent ajouter du temps de chargement supplémentaire et causer des décalages de mise en page. Next.js fournit le module next/font
pour aider à optimiser les polices.
1// app/layout.tsx
2import { Roboto } from "next/font/google";
3
4const roboto = Roboto({
5 weight: "400",
6 subsets: ["latin"],
7});
8
9export default function RootLayout({ children }) {
10 return (
11 <html lang="fr" className={roboto.className}>
12 <body>{children}</body>
13 </html>
14 );
15}
Ce code récupère automatiquement la police Roboto au moment de la construction et intègre le CSS nécessaire, éliminant une requête de police supplémentaire.
Minimisation de la Taille du Bundle JavaScript
Réduire votre bundle JavaScript aide tout à se charger plus rapidement :
- Analysez votre bundle : Utilisez le plugin
@next/bundle-analyzer
pour visualiser et inspecter la taille de votre bundle. - Tree-shaking et optimisation des imports : Importez seulement ce dont vous avez besoin.
- Utilisez des bibliothèques plus petites : Considérez des alternatives légères.
- Composants Serveur (App Router) : Si vous utilisez le nouvel App Router, les composants serveur n'envoient pas leur code au client du tout.
Conseils Supplémentaires et Outils
- Utilisez la mise en cache HTTP : Les actifs statiques de Next.js peuvent être mis en cache par les CDN.
- Activez gzip/Brotli : Compressez les réponses si vous hébergez sur un serveur personnalisé.
- Mesurez les Core Web Vitals : Utilisez Lighthouse ou Next.js Analytics pour auditer les performances de votre application.
Conclusion
L'optimisation des performances Next.js consiste à combiner plusieurs petites améliorations. Utilisez les fonctionnalités intégrées de Next.js avec les meilleures pratiques. Ces étapes amélioreront les temps de chargement, les scores Core Web Vitals et, finalement, la satisfaction des utilisateurs.