Dans une vraie app
La règle qui rend Fast Refresh fiable est simple : un fichier, un composant exporté, et rien d’autre. Les constantes, hooks utilitaires et helpers vont dans leurs propres fichiers. Un composant défini dans un fichier qui exporte aussi un objet de configuration ou une fonction perd son état à chaque édition, et un export default anonyme (export default () => …) empêche React de l’identifier. Pour forcer un remount à chaque sauvegarde, par exemple sur un écran dont l’état d’initialisation compte, la directive // @refresh reset en haut du fichier le fait.
Quand « ça ne refresh plus », les causes habituelles sont dans l’ordre : une erreur de syntaxe toujours présente (la redbox disparaît à la correction), un module d’initialisation qui a levé une erreur au chargement, un fichier modifié qui est importé par du code hors de l’arbre React (un store créé au niveau module, une config de navigation) et qui force un rechargement complet, ou un watcher Metro saturé sur un gros monorepo (Watchman aide sur macOS).
Fast Refresh n’existe qu’en debug avec Metro connecté ; un development build qui charge une update publiée ne l’a pas. Et il ne couvre que le JavaScript : une modification native demande toujours une recompilation.
Termes liés
Metro
Le bundler JavaScript de React Native : il résout, transforme et sérialise votre code en un bundle, et sert le dev server.
React Native DevTools
Le débogueur intégré de React Native depuis la 0.76, basé sur Chrome DevTools : console, points d’arrêt, réseau, profiling, arbre React.
Development build
Un build debug de votre propre app qui embarque expo-dev-client : vos modules natifs, plus un launcher pour se connecter à Metro.
Expo Go
L’app bac à sable d’Expo, avec un jeu fixe de modules natifs : pour apprendre et prototyper, pas pour produire.