Meilleures Pratiques React Vercel
Guide complet d'optimisation des performances pour les applications React et Next.js, maintenu par Vercel. Contient 70 règles réparties en 8 catégories, hiérarchisées par impact pour guider la refactorisation automatisée et la génération de code.
Quand appliquer
Consultez ces directives quand :
- Vous écrivez de nouveaux composants React ou pages Next.js
- Vous implémentez la récupération de données (côté client ou serveur)
- Vous examinez le code pour identifier les problèmes de performance
- Vous refactorisez du code React/Next.js existant
- Vous optimisez la taille du bundle ou les 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 | ÉLEVÉE | server- |
| 4 | Récupération de données côté client | MOYEN-ÉLEVÉ | client- |
| 5 | Optimisation du rendu | MOYEN | rerender- |
| 6 | Performance du rendu | MOYEN | rendering- |
| 7 | Performance JavaScript | BAS-MOYEN | js- |
| 8 | Motifs avancés | BAS | advanced- |
Référence rapide
1. Élimination des cascades (CRITIQUE)
async-cheap-condition-before-await- Vérifier les conditions sync bon marché avant d'attendre les flags ou valeurs distantesasync-defer-await- Déplacer await dans les branches où il est réellement utiliséasync-parallel- Utiliser Promise.all() pour les opérations indépendantesasync-dependencies- Utiliser better-all pour les dépendances partiellesasync-api-routes- Commencer les promesses tôt, attendre tard dans les routes APIasync-suspense-boundaries- Utiliser Suspense pour diffuser le contenu en streaming
2. Optimisation de la taille du bundle (CRITIQUE)
bundle-barrel-imports- Importer directement, éviter les fichiers barrelbundle-analyzable-paths- Préférer les chemins d'importation et de système de fichiers statiquement analysables pour éviter les bundles et traces largesbundle-dynamic-imports- Utiliser next/dynamic pour les composants lourdsbundle-defer-third-party- Charger l'analytique/logging après l'hydratationbundle-conditional- Charger les modules uniquement quand la fonctionnalité est activéebundle-preload- Précharger au survol/focus pour la vitesse perçue
3. Performance côté serveur (ÉLEVÉE)
server-auth-actions- Authentifier les Server Actions comme les routes APIserver-cache-react- Utiliser React.cache() pour la déduplication par requêteserver-cache-lru- Utiliser le cache LRU pour la mise en cache inter-requêtesserver-dedup-props- Éviter la sérialisation dupliquée dans les props RSCserver-hoist-static-io- Placer l'I/O statique (fonts, logos) au niveau du moduleserver-no-shared-module-state- Éviter l'état mutable au niveau du module dans RSC/SSRserver-serialization- Minimiser les données passées aux composants clientserver-parallel-fetching- Restructurer les composants pour paralléliser les récupérationsserver-parallel-nested-fetching- Chaîner les récupérations imbriquées par élément dans Promise.allserver-after-nonblocking- Utiliser after() pour les opérations non-bloquantes
4. Récupération de données côté client (MOYEN-ÉLEVÉ)
client-swr-dedup- Utiliser SWR pour la déduplication automatique des requêtesclient-event-listeners- Dédupliquer les écouteurs d'événements globauxclient-passive-event-listeners- Utiliser des écouteurs passifs pour le scrollclient-localstorage-schema- Versionner et minimiser les données localStorage
5. Optimisation du rendu (MOYEN)
rerender-defer-reads- Ne pas s'abonner à un état utilisé uniquement dans les callbacksrerender-memo- Extraire le travail coûteux dans des composants mémoïzésrerender-memo-with-default-value- Placer les props non-primitives par défaut au niveau supérieurrerender-dependencies- Utiliser les dépendances primitives dans les effetsrerender-derived-state- S'abonner aux booléens dérivés, pas aux valeurs brutesrerender-derived-state-no-effect- Dériver l'état lors du rendu, pas dans les effetsrerender-functional-setstate- Utiliser setState fonctionnel pour les callbacks stablesrerender-lazy-state-init- Passer une fonction à useState pour les valeurs coûteusesrerender-simple-expression-in-memo- Éviter memo pour les primitives simplesrerender-split-combined-hooks- Diviser les hooks avec des dépendances indépendantesrerender-move-effect-to-event- Mettre la logique d'interaction dans les gestionnaires d'événementsrerender-transitions- Utiliser startTransition pour les mises à jour non-urgentesrerender-use-deferred-value- Différer les rendus coûteux pour garder l'entrée réactivererender-use-ref-transient-values- Utiliser refs pour les valeurs transitoires fréquentesrerender-no-inline-components- Ne pas définir de composants à l'intérieur de composants
6. Performance du rendu (MOYEN)
rendering-animate-svg-wrapper- Animer le wrapper div, pas l'élément SVGrendering-content-visibility- Utiliser content-visibility pour les longues listesrendering-hoist-jsx- Extraire le JSX statique en dehors des composantsrendering-svg-precision- Réduire la précision des coordonnées SVGrendering-hydration-no-flicker- Utiliser un script inline pour les données client-onlyrendering-hydration-suppress-warning- Supprimer les incompatibilités attenduesrendering-activity- Utiliser le composant Activity pour montrer/cacherrendering-conditional-render- Utiliser ternaire, pas && pour les conditionnelsrendering-usetransition-loading- Préférer useTransition pour l'état de chargementrendering-resource-hints- Utiliser les hints de ressources React DOM pour le préchargementrendering-script-defer-async- Utiliser defer ou async sur les balises script
7. Performance JavaScript (BAS-MOYEN)
js-batch-dom-css- Grouper les changements CSS via des classes ou cssTextjs-index-maps- Construire une Map pour les recherches répétéesjs-cache-property-access- Mettre en cache les propriétés d'objet dans les bouclesjs-cache-function-results- Mettre en cache les résultats de fonction dans une Map au niveau du modulejs-cache-storage- Mettre en cache les lectures localStorage/sessionStoragejs-combine-iterations- Combiner plusieurs filter/map en une seule bouclejs-length-check-first- Vérifier la longueur du tableau avant la comparaison coûteusejs-early-exit- Retourner tôt des fonctionsjs-hoist-regexp- Placer la création RegExp en dehors des bouclesjs-min-max-loop- Utiliser une boucle pour min/max au lieu de sortjs-set-map-lookups- Utiliser Set/Map pour les recherches en O(1)js-tosorted-immutable- Utiliser toSorted() pour l'immuabilitéjs-flatmap-filter- Utiliser flatMap pour mapper et filtrer en une seule passejs-request-idle-callback- Différer le travail non-critique au temps d'inactivité du navigateur
8. Motifs avancés (BAS)
advanced-effect-event-deps- Ne pas mettre les résultats deuseEffectEventdans les dépendances d'effetadvanced-event-handler-refs- Stocker les gestionnaires d'événements dans des refsadvanced-init-once- Initialiser l'app une fois par chargement d'appadvanced-use-latest- useLatest pour les refs de callback stables
Comment utiliser
Consultez 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
- Du contexte supplémentaire et des références
Document complet compilé
Pour le guide complet avec toutes les règles développées : AGENTS.md