Bonnes pratiques React Native
Vue d'ensemble
Guide d'optimisation des performances pour les applications React Native, couvrant les optimisations JavaScript/React, Native (iOS/Android) et bundling. Basé sur le "Ultimate Guide to React Native Optimization" de Callstack.
Format des Skills
Chaque fichier de référence suit un format hybride pour une recherche rapide et une compréhension approfondie :
- Quick Pattern : Snippets de code incorrect/correct pour un pattern matching immédiat
- Quick Command : Commandes shell pour les skills de processus/mesure
- Quick Config : Snippets de configuration pour les skills axés sur la configuration
- Quick Reference : Tableaux récapitulatifs pour les skills conceptuels
- Deep Dive : Contexte complet avec When to Use, Prerequisites, Step-by-Step, Common Pitfalls
Évaluations d'impact : CRITICAL (corriger immédiatement), HIGH (amélioration significative), MEDIUM (optimisation utile)
Quand appliquer
Consultez ces directives quand :
- Vous debuggez une UI lente/saccadée ou des animations
- Vous enquêtez sur des fuites mémoire (JS ou native)
- Vous optimisez le temps de démarrage de l'app (TTI)
- Vous réduisez la taille du bundle ou de l'app
- Vous écrivez des modules natifs (Turbo Modules)
- Vous profilez les performances React Native
- Vous reviewez du code React Native pour les performances
Notes de sécurité
- Traitez les commandes shell de ces références comme des opérations locales de développement. Reviewez-les avant de les exécuter, préférez les outils avec versions pinées, et évitez de diriger des scripts distants directement vers un shell.
- Traitez les bibliothèques et plugins tiers comme des dépendances qui nécessitent toujours les contrôles normaux de la chaîne logistique : pinez les versions, vérifiez la provenance, et mettez à jour selon votre processus de review standard.
- Traitez le code splitting Re.Pack comme une livraison d'artefacts first-party uniquement. Les chunks distants doivent venir d'origines HTTPS de confiance que vous contrôlez et être pinés à la version actuelle de l'app.
Directives ordonnées par priorité
| Priorité | Catégorie | Impact | Préfixe |
|---|---|---|---|
| 1 | FPS & Re-renders | CRITICAL | js-* |
| 2 | Bundle Size | CRITICAL | bundle-* |
| 3 | TTI Optimization | HIGH | native-*, bundle-* |
| 4 | Native Performance | HIGH | native-* |
| 5 | Memory Management | MEDIUM-HIGH | js-*, native-* |
| 6 | Animations | MEDIUM | js-* |
Référence rapide
Workflow d'optimisation
Suivez ce cycle pour tout problème de performance : Measure → Optimize → Re-measure → Validate
- Measure : Capturez les métriques de base avant les changements. Pour les problèmes d'exécution, préférez la timeline de commits, les re-render counts, les composants lents, la décomposition du commit le plus lourd, et le startup/TTI quand disponibles. La profondeur ou le nombre de composants dans l'arbre sont un contexte optionnel, pas des substituts.
- Optimize : Appliquez le fix ciblé de la référence appropriée
- Re-measure : Exécutez la même mesure pour obtenir les métriques mises à jour
- Validate : Confirmez l'amélioration (p. ex. FPS 45→60, TTI 3,2s→1,8s, bundle 2,1MB→1,6MB)
Si les métriques n'ont pas amélioré, revertez et essayez le prochain fix suggéré.
Garde-fous de Review
- Vérifiez les versions de bibliothèques avant de suggérer des fixes API-spécifiques. Exemple : FlashList v2 déprécie
estimatedItemSize, ne le signalez donc pas comme manquant là. - Ne suggérez pas de changements de dépendances
useMemoouuseCallbacksauf si le comportement est manifestement incorrect ou que le profiling montre du travail gaspillé lié à cette valeur. - Ne reportez pas les closures stales spéculativement. Montrez le stale read path, une repro, ou des preuves du profiler avant de le signaler.
- Quand vous profilez un flow, mesurez l'interaction cible elle-même. Ne traitez pas la profondeur de l'arbre de composants ou le nombre de composants comme la preuve principale de performance.
Critique : FPS & Re-renders
Profilez d'abord :
# Open React Native DevTools
# Press 'j' in Metro, or shake device → "Open DevTools"
Fixes courants :
- Remplacez ScrollView par FlatList/FlashList pour les listes
- Utilisez React Compiler pour la mémoization automatique
- Utilisez l'atomic state (Jotai/Zustand) pour réduire les re-renders
- Utilisez
useDeferredValuepour les calculs coûteux
Critique : Bundle Size
Analysez le bundle :
npx react-native bundle \
--entry-file index.js \
--bundle-output output.js \
--platform ios \
--sourcemap-output output.js.map \
--dev false --minify true
npx source-map-explorer output.js --no-border-checks
Vérifiez l'amélioration après optimisation :
# Record baseline size before changes
ls -lh output.js # e.g., Before: 2.1 MB
# After applying fixes, re-bundle and compare
npx react-native bundle --entry-file index.js --bundle-output output.js \
--platform ios --dev false --minify true
ls -lh output.js # e.g., After: 1.6 MB (24% reduction)
Fixes courants :
- Évitez les barrel imports (importez directement de la source)
- Supprimez les polyfills Intl inutiles seulement après avoir vérifié la couverture de l'API et des méthodes Hermes
- Activez tree shaking (Expo SDK 52+ ou Re.Pack)
- Activez R8 pour le shrinking du code natif Android
Haute : Optimisation TTI
Mesurez TTI :
- Utilisez
react-native-performancepour les markers - Mesurez uniquement les cold starts (excluez warm/hot/prewarm)
Fixes courants :
- Désactivez la compression du bundle JS sur Android (active Hermes mmap)
- Utilisez la navigation native (react-native-screens)
- Préchargez les écrans coûteux couramment utilisés avant de naviguer vers eux
Haute : Native Performance
Profilez native :
- iOS : Xcode Instruments → Time Profiler
- Android : Android Studio → CPU Profiler
Fixes courants :
- Utilisez les threads de fond pour les travaux natifs lourds
- Préférez les méthodes Turbo Module async aux sync
- Utilisez C++ pour le code performance-critical multiplateforme
Références
Documentation complète avec exemples de code dans references/ :
JavaScript/React (js-*)
| File | Impact | Description |
|---|---|---|
| js-lists-flatlist-flashlist.md | CRITICAL | Remplacez ScrollView par des listes virtualisées |
| js-profile-react.md | MEDIUM | Profiling React DevTools |
| js-measure-fps.md | HIGH | Monitoring et mesure FPS |
| js-memory-leaks.md | MEDIUM | Chasse aux fuites mémoire JS |
| js-atomic-state.md | HIGH | Patterns Jotai/Zustand |
| js-concurrent-react.md | HIGH | useDeferredValue, useTransition |
| js-react-compiler.md | HIGH | Mémoization automatique |
| js-animations-reanimated.md | MEDIUM | Worklets Reanimated |
| js-bottomsheet.md | HIGH | Optimisation bottom sheet |
| js-uncontrolled-components.md | HIGH | Optimisation TextInput |
Native (native-*)
| File | Impact | Description |
|---|---|---|
| native-turbo-modules.md | HIGH | Construction de modules natifs rapides |
| native-sdks-over-polyfills.md | HIGH | Native vs bibliothèques JS |
| native-measure-tti.md | HIGH | Configuration mesure TTI |
| native-threading-model.md | HIGH | Threads Turbo Module |
| native-profiling.md | MEDIUM | Profiling Xcode/Android Studio |
| native-platform-setup.md | MEDIUM | Guide outils iOS/Android |
| native-view-flattening.md | MEDIUM | Debugging hiérarchie de vues |
| native-memory-patterns.md | MEDIUM | Mémoire C++/Swift/Kotlin |
| native-memory-leaks.md | MEDIUM | Chasse aux fuites mémoire native |
| native-android-16kb-alignment.md | CRITICAL | Alignement bibliothèque tiers pour Google Play |
Bundling (bundle-*)
| File | Impact | Description |
|---|---|---|
| bundle-barrel-exports.md | CRITICAL | Évitez les barrel imports |
| bundle-analyze-js.md | CRITICAL | Visualisation bundle JS |
| bundle-tree-shaking.md | HIGH | Élimination code mort |
| bundle-analyze-app.md | HIGH | Analyse taille app |
| bundle-r8-android.md | HIGH | Shrinking code Android |
| bundle-hermes-mmap.md | HIGH | Désactivez compression bundle |
| bundle-native-assets.md | HIGH | Configuration catalog assets |
| bundle-library-size.md | MEDIUM | Évaluation dépendances |
| bundle-code-splitting.md | MEDIUM | Code splitting Re.Pack |
Recherche dans les références
# Find patterns by keyword
grep -l "reanimated" references/
grep -l "flatlist" references/
grep -l "memory" references/
grep -l "profil" references/
grep -l "tti" references/
grep -l "bundle" references/
Mapping Problème → Skill
| Problème | Commencer par |
|---|---|
| App semble lente/saccadée | js-measure-fps.md → js-profile-react.md |
| Trop de re-renders | js-profile-react.md → js-react-compiler.md |
| Démarrage lent (TTI) | native-measure-tti.md → bundle-analyze-js.md |
| Taille app grande | bundle-analyze-app.md → bundle-r8-android.md |
| Mémoire qui grandit | js-memory-leaks.md ou native-memory-leaks.md |
| Animation perd des frames | js-animations-reanimated.md |
| Bottom sheet jank/re-renders | js-bottomsheet.md → js-animations-reanimated.md |
| Scroll liste saccadé | js-lists-flatlist-flashlist.md |
| TextInput lag | js-uncontrolled-components.md |
| Module natif lent | native-turbo-modules.md → native-threading-model.md |
| Problème alignement bibliothèque native | native-android-16kb-alignment.md |
Attribution
Basé sur "The Ultimate Guide to React Native Optimization" de Callstack.