
Code splitting basé sur les routes
Apprenez la stratégie la plus courante de code splitting en React : découper votre application par route à l'aide de React.lazy et Suspense pour un chargement optimisé.
Pourquoi découper par route : L'approche la plus logique
Lorsque l'on cherche à découper le code d'une application React pour réduire la taille du bundle initial, l'approche la plus naturelle et souvent la plus impactante est le code splitting basé sur les routes. La logique est simple : un utilisateur n'interagit généralement qu'avec une seule route (ou "page") à la fois. Il n'a pas besoin du code spécifique à la page "Profil" lorsqu'il consulte la page "Accueil", ni du code du "Panier" lorsqu'il lit un article de blog.
En découpant votre application au niveau de chaque route principale, vous vous assurez que le bundle initial contient uniquement le code commun (React, bibliothèques essentielles, layout global) et le code de la route par défaut (souvent la page d'accueil). Le code spécifique à chaque autre route est placé dans des "chunks" séparés, qui ne seront téléchargés par le navigateur que lorsque l'utilisateur naviguera effectivement vers cette route.
Cette stratégie offre généralement le meilleur retour sur investissement en termes de réduction de la taille du bundle initial et d'amélioration du temps de chargement perçu, car elle correspond directement à la manière dont les utilisateurs explorent l'application.
Implémentation avec react router, `lazy` et `Suspense`
La mise en oeuvre du code splitting basé sur les routes est rendue très simple grâce à la combinaison de React Router, React.lazy et React.Suspense.
Le pattern consiste à remplacer les importations statiques de vos composants de page par des importations dynamiques enveloppées dans React.lazy, puis à envelopper votre composant (ou une partie de celui-ci) avec un composant pour gérer l'état de chargement pendant la transition entre les routes.
Reprenons l'exemple typique de configuration de routes :
import React, { Suspense, lazy } from 'react';
import {
BrowserRouter,
Routes,
Route,
Link
} from 'react-router-dom';
// Layout commun (importé statiquement car toujours nécessaire)
import MainLayout from './layouts/MainLayout';
// Composants de page importés paresseusement
const HomePage = lazy(() => import('./pages/HomePage'));
const AboutPage = lazy(() => import('./pages/AboutPage'));
const ProfilePage = lazy(() => import('./pages/ProfilePage'));
const NotFoundPage = lazy(() => import('./pages/NotFoundPage'));
// Fallback UI pour Suspense
function LoadingFallback() {
return Chargement...;
}
function App() {
return (
{/* MainLayout contient la navigation et est toujours chargé */}
{/* Suspense enveloppe les Routes pour gérer le chargement des pages */}
}>
} />
} />
} />
{/* La page 404 peut aussi être chargée paresseusement */}
} />
);
}
export default App;Dans ce code :
- Chaque composant de page (`HomePage`, `AboutPage`, etc.) est chargé via
React.lazy. - Le composant `MainLayout` (contenant par exemple la barre de navigation et le pied de page) est importé statiquement car il est nécessaire sur toutes les pages.
- Le composant
est placé autour de. Lorsque l'utilisateur navigue vers une nouvelle route (par exemple, de `/` vers `/about`), React va commencer à charger le chunk de `AboutPage`. Pendant ce temps, `Suspense` affichera `LoadingFallback`. Une fois `AboutPage` chargé, il remplacera le fallback.
Le bundler (Webpack/Vite) créera automatiquement des fichiers JavaScript séparés pour `HomePage`, `AboutPage`, `ProfilePage`, et `NotFoundPage` en plus du bundle principal contenant `App`, `MainLayout`, React, React Router, etc.
Avantages et bonnes pratiques du découpage par route
Le principal avantage de cette approche est, comme mentionné, la réduction significative du code initial que l'utilisateur doit télécharger, menant à un chargement plus rapide et une meilleure expérience initiale.
Quelques bonnes pratiques à garder à l'esprit :
- Commencer ici : Le découpage par route est souvent le point de départ le plus logique et le plus bénéfique pour le code splitting.
- Fallback pertinent : Assurez-vous que le `fallback` de `Suspense` offre une bonne expérience utilisateur (un simple "Chargement..." peut suffire, mais un skeleton screen peut être préférable pour éviter les sauts de mise en page).
- Découpage au sein des routes : Si une page spécifique contient elle-même un composant très lourd ou rarement utilisé (par exemple, une carte interactive complexe, un éditeur de texte riche), vous pouvez appliquer à nouveau le pattern `React.lazy` et `Suspense` à l'intérieur de ce composant de page pour différer davantage le chargement.
- Routes imbriquées : Le même principe s'applique aux routes imbriquées. Vous pouvez charger paresseusement le composant de layout de la route parente, ou charger paresseusement les composants des routes enfants à l'intérieur d'un layout parent chargé statiquement.
- Analyser les bundles : Utilisez des outils d'analyse de bundle (comme `webpack-bundle-analyzer` ou les outils intégrés de Vite) pour visualiser la taille de vos différents chunks et vérifier que votre stratégie de découpage est efficace.
En adoptant le code splitting basé sur les routes comme pratique standard dans vos applications React, vous posez des bases solides pour des performances de chargement optimales, garantissant que les utilisateurs n'ont à télécharger que le code dont ils ont besoin, quand ils en ont besoin.