Bonnes pratiques React Vercel
Guide complet d'optimisation des performances pour les applications React et Next.js, maintenu par Vercel. Contient 62 règles réparties dans 8 catégories, classées par impact pour guider la refactorisation automatisée et la génération de code.
Quand appliquer
Référencez ces directives lors de :
- L'écriture de nouveaux composants React ou pages Next.js
- L'implémentation du fetching de données (côté client ou serveur)
- La révision du code pour détecter les problèmes de performance
- La refactorisation du code React/Next.js existant
- L'optimisation de la taille du bundle ou des temps de chargement
Catégories de règles par priorité
| Priorité | Catégorie | Impact | Préfixe |
|---|---|---|---|
| 1 | Élimination des cascades | CRITIQUE | async- |
| 2 | Optimisation de la taille du bundle | CRITIQUE | bundle- |
| 3 | Performance côté serveur | HAUTE | server- |
| 4 | Fetching de données côté client | MOYEN-HAUT | client- |
| 5 | Optimisation du re-render | MOYEN | rerender- |
| 6 | Performance du rendu | MOYEN | rendering- |
| 7 | Performance JavaScript | BAS-MOYEN | js- |
| 8 | Patterns avancés | BAS | advanced- |
Référence rapide
1. Élimination des cascades (CRITIQUE)
async-defer-await- Déplacez await dans les branches où il est réellement utiliséasync-parallel- Utilisez Promise.all() pour les opérations indépendantesasync-dependencies- Utilisez better-all pour les dépendances partiellesasync-api-routes- Démarrez les promises tôt, await tard dans les API routesasync-suspense-boundaries- Utilisez Suspense pour streamer le contenu
2. Optimisation de la taille du bundle (CRITIQUE)
bundle-barrel-imports- Importez directement, évitez les barrel filesbundle-dynamic-imports- Utilisez next/dynamic pour les composants lourdsbundle-defer-third-party- Chargez l'analytics/logging après l'hydratationbundle-conditional- Chargez les modules seulement quand la fonctionnalité est activéebundle-preload- Préchargez au survol/focus pour la vitesse perçue
3. Performance côté serveur (HAUTE)
server-auth-actions- Authentifiez les server actions comme les API routesserver-cache-react- Utilisez React.cache() pour la déduplication par requêteserver-cache-lru- Utilisez LRU cache pour la mise en cache inter-requêteserver-dedup-props- Évitez la sérialisation dupliquée dans les props RSCserver-hoist-static-io- Remontez les I/O statiques (fonts, logos) au niveau du moduleserver-serialization- Minimisez les données passées aux composants clientserver-parallel-fetching- Restructurez les composants pour paralléliser les fetchesserver-after-nonblocking- Utilisez after() pour les opérations non-bloquantes
4. Fetching de données côté client (MOYEN-HAUT)
client-swr-dedup- Utilisez SWR pour la déduplication automatique des requêtesclient-event-listeners- Déduplicisez les event listeners globauxclient-passive-event-listeners- Utilisez les listeners passifs pour le scrollclient-localstorage-schema- Versionnez et minimisez les données localStorage
5. Optimisation du re-render (MOYEN)
rerender-defer-reads- N'abonnez-vous pas à l'état seulement utilisé dans les callbacksrerender-memo- Extrayez le travail coûteux dans les composants mémoïsésrerender-memo-with-default-value- Remontez les props non-primitives par défautrerender-dependencies- Utilisez des dépendances primitives dans les effectsrerender-derived-state- Abonnez-vous aux booléens dérivés, pas aux valeurs brutesrerender-derived-state-no-effect- Dérivez l'état pendant le rendu, pas dans les effectsrerender-functional-setstate- Utilisez setState fonctionnel pour les callbacks stablesrerender-lazy-state-init- Passez une fonction à useState pour les valeurs coûteusesrerender-simple-expression-in-memo- Évitez memo pour les primitives simplesrerender-move-effect-to-event- Mettez la logique d'interaction dans les event handlersrerender-transitions- Utilisez startTransition pour les updates non-urgentesrerender-use-ref-transient-values- Utilisez les refs pour les valeurs transientes fréquentesrerender-no-inline-components- Ne définissez pas les composants à l'intérieur de composants
6. Performance du rendu (MOYEN)
rendering-animate-svg-wrapper- Animez le div wrapper, pas l'élément SVGrendering-content-visibility- Utilisez content-visibility pour les longues listesrendering-hoist-jsx- Extrayez le JSX statique en dehors des composantsrendering-svg-precision- Réduisez la précision des coordonnées SVGrendering-hydration-no-flicker- Utilisez un script inline pour les données client-onlyrendering-hydration-suppress-warning- Supprimez les incompatibilités attenduesrendering-activity- Utilisez le composant Activity pour show/hiderendering-conditional-render- Utilisez ternaire, pas && pour les conditionnellesrendering-usetransition-loading- Préférez useTransition pour l'état de chargementrendering-resource-hints- Utilisez les resource hints React DOM pour le préchargementrendering-script-defer-async- Utilisez defer ou async sur les script tags
7. Performance JavaScript (BAS-MOYEN)
js-batch-dom-css- Groupez les changements CSS via les classes ou cssTextjs-index-maps- Construisez une Map pour les recherches répétéesjs-cache-property-access- Mettez en cache les propriétés d'objet dans les bouclesjs-cache-function-results- Mettez en cache les résultats des fonctions dans une Map au niveau du modulejs-cache-storage- Mettez en cache les lectures localStorage/sessionStoragejs-combine-iterations- Combinez plusieurs filter/map en une seule bouclejs-length-check-first- Vérifiez la longueur du tableau avant la comparaison coûteusejs-early-exit- Retournez tôt depuis les fonctionsjs-hoist-regexp- Remontez la création de RegExp en dehors des bouclesjs-min-max-loop- Utilisez une boucle pour min/max au lieu de sortjs-set-map-lookups- Utilisez Set/Map pour les recherches en O(1)js-tosorted-immutable- Utilisez toSorted() pour l'immuabilitéjs-flatmap-filter- Utilisez flatMap pour mapper et filtrer en une seule passe
8. Patterns avancés (BAS)
advanced-event-handler-refs- Stockez les event handlers dans les refsadvanced-init-once- Initialisez l'app une fois par chargement d'appadvanced-use-latest- useLatest pour les refs de callback stables
Comment utiliser
Lisez les fichiers de règles individuels pour des explications détaillées et des exemples de code :
rules/async-parallel.md
rules/bundle-barrel-imports.md
Chaque fichier de règle contient :
- Une brève explication de pourquoi c'est important
- Un exemple de code incorrect avec explication
- Un exemple de code correct avec explication
- Un contexte supplémentaire et des références
Document compilé complet
Pour le guide complet avec toutes les règles développées : AGENTS.md