Vercel React Best Practices
Guide complet d'optimisation des performances pour les applications React et Next.js, maintenu par Vercel. Contient 57 règles réparties dans 8 catégories, priorisées par impact pour guider la refonte automatisée et la génération de code.
Déclencheurs
- react
- component
- hook
- useState
- useEffect
- jsx
- tsx
- react performance
- memo
- useMemo
- useCallback
- react render
- virtual dom
- react app
Quand appliquer
Référencez 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 passez en revue le code pour 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 Waterfalls | 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 des Re-rendus | MOYEN | rerender- |
| 6 | Performance du Rendu | MOYEN | rendering- |
| 7 | Performance JavaScript | BAS-MOYEN | js- |
| 8 | Modèles Avancés | BAS | advanced- |
Référence rapide
1. Élimination des Waterfalls (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, attendez 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 fichiers barrelbundle-dynamic-imports- Utilisez next/dynamic pour les composants lourdsbundle-defer-third-party- Chargez les analytics/logs 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 (ÉLEVÉE)
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 le cache LRU pour le caching entre requêtesserver-dedup-props- Évitez la sérialisation dupliquée dans les props RSCserver-serialization- Minimisez les données transmises aux composants clientserver-parallel-fetching- Restructurez les composants pour paralléliser les récupérationsserver-after-nonblocking- Utilisez after() pour les opérations non-bloquantes
4. Récupération de données côté Client (MOYEN-ÉLEVÉ)
client-swr-dedup- Utilisez SWR pour la déduplication automatique des requêtesclient-event-listeners- Déduplicapez les écouteurs d'événements globauxclient-passive-event-listeners- Utilisez les écouteurs passifs pour le scrollclient-localstorage-schema- Versionnez et minimisez les données localStorage
5. Optimisation des Re-rendus (MOYEN)
rerender-defer-reads- Ne vous abonnez pas à l'état utilisé seulement dans les callbacksrerender-memo- Extrayez le travail coûteux dans des composants mémoïsésrerender-memo-with-default-value- Remontez les props par défaut non-primitivesrerender-dependencies- Utilisez les 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 functional setState 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 gestionnaires d'événementsrerender-transitions- Utilisez startTransition pour les mises à jour non-urgentesrerender-use-ref-transient-values- Utilisez les refs pour les valeurs fréquentes temporaires
6. Performance du Rendu (MOYEN)
rendering-animate-svg-wrapper- Animez le wrapper div, 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 avertissements sur les désaccords attendusrendering-activity- Utilisez le composant Activity pour afficher/masquerrendering-conditional-render- Utilisez l'opérateur ternaire, pas && pour les conditionnellesrendering-usetransition-loading- Préférez useTransition pour l'état de chargement
7. Performance JavaScript (BAS-MOYEN)
js-batch-dom-css- Regroupez 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 de fonction 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 une comparaison coûteusejs-early-exit- Retournez tôt des fonctionsjs-hoist-regexp- Remontez la création 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 O(1)js-tosorted-immutable- Utilisez toSorted() pour l'immuabilité
8. Modèles Avancés (BAS)
advanced-event-handler-refs- Stockez les gestionnaires d'événements dans les refsadvanced-init-once- Initialisez l'app une fois par chargementadvanced-use-latest- useLatest pour les refs de callback stables
Comment utiliser
Lisez les fichiers de règles individuels pour les explications détaillées et les exemples de code :
rules/async-parallel.md
rules/bundle-barrel-imports.md
Chaque fichier de règle contient :
- Une brève explication de son importance
- Un exemple de code incorrect avec explication
- Un exemple de code correct avec explication
- Un 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
Vérifier
- Le changement a été rendu dans un navigateur/simulateur et une capture d'écran ou un snapshot DOM a été capturé, pas seulement examiné en relecture de code
- La mise en page a été vérifiée aux points de rupture que le guide react-best-practices signale (mobile + desktop minimum) ; des preuves de chacun sont jointes
- Les valeurs de couleur, typographie et espacement utilisées proviennent des design tokens/thème du projet, pas de valeurs ad-hoc codées en dur
- La navigation au clavier et l'ordre de focus ont été exercés sur chaque élément interactif introduit
- Les variantes reduced-motion / dark-mode (quand supportées) ont été vérifiées, pas supposées hériter
- Aucune erreur de console ou avertissement d'hydratation n'a été émis durant le rendu de vérification