Maîtrisez le mécanisme de suspension, le chargement paresseux des composants et le découpage du bundle.
Ouvrir cette leçon dans KodokonSuspense repose sur un mécanisme peu connu : un composant qui n'a pas encore ses données ou son code suspend son rendu. Sous le capot, l'implémentation actuelle lève (throw) une promesse, que React intercepte comme il intercepterait une erreur. React remonte alors jusqu'à la frontière <Suspense> la plus proche, affiche son fallback, puis rejoue le rendu du sous-arbre quand la promesse se résout. C'est un détail d'implémentation (ne levez jamais de promesse vous-même), mais il explique tout le comportement observable : la frontière agit comme un catch déclaratif pour l'asynchrone. Le cas d'usage historique est le code splitting avec React.lazy.
import { lazy, Suspense } from 'react';
const Chart = lazy(() => import('./Chart'));
function Dashboard() {
return (
<Suspense fallback={<Spinner />}>
<Chart points={data} />
</Suspense>
);
}lazy attend une fonction qui retourne une promesse résolue en module possédant un export default. Le découpage lui-même est l'affaire du bundler : chaque import() dynamique devient un point de coupe et produit un chunk séparé, chargé à la demande. Subtilité fréquente en base de code réelle : vos composants sont souvent des exports nommés. Il faut alors adapter le module à la volée.
const Chart = lazy(() =>
import('./charts').then((module) => ({
default: module.Chart,
}))
);Le point délicat en production : lors d'une navigation, un contenu déjà affiché peut suspendre à nouveau (nouvelle route, nouveau chunk) et être brutalement remplacé par le fallback. Depuis React 18, une mise à jour enveloppée dans startTransition change ce comportement : React conserve l'interface précédente à l'écran pendant que le nouveau rendu suspend en arrière-plan, et ne montre le fallback que pour du contenu jamais révélé. Les frontières se composent aussi en profondeur : plusieurs <Suspense> imbriqués permettent de révéler l'interface par zones, du squelette global vers les détails.
const [isPending, startTransition] = useTransition();
function openTab(nextTab) {
startTransition(() => {
setTab(nextTab);
});
}
// L'onglet courant reste affiche pendant le
// chargement, au lieu de repasser au fallback.React.lazy ?