Aller au contenu
useffect.sh
Planifier 30 min avec un senior
Outillage

Fast Refresh

Le rechargement à chaud de React Native : une modification de composant est appliquée en une à deux secondes en conservant l’état local.

Définition

Fast Refresh est la fonctionnalité de React Native qui applique vos modifications de code dans l’app en cours d’exécution, en général en une à deux secondes, sans redémarrer l’app ni perdre l’état des composants. Activé par défaut et débrayable depuis le dev menu, il remplace le hot reloading et le live reload des premières versions, qui étaient fragiles ou rechargeaient tout. Son comportement dépend de ce que vous éditez : un module qui n’exporte que des composants React est ré-exécuté et ses composants re-rendus en place ; un module avec d’autres exports ré-exécute aussi les modules qui l’importent ; un fichier importé hors de l’arbre React déclenche un rechargement complet. L’état local est conservé pour les composants fonction et les hooks, pas pour les classes. Les hooks à dépendances (useEffect, useMemo, useCallback) sont re-exécutés à chaque refresh en ignorant leurs dépendances. Vous rencontrez Fast Refresh à chaque sauvegarde de fichier, et vous le remarquez surtout quand il ne fonctionne plus.

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.

Sources

Les 35 termes du glossaire

Un de ces sujets bloque votre app ?

30 minutes avec un senior pour regarder le problème dans votre code. Gratuit.