0Pricing
React Academy · Leçon

Le problème des abonnements aux magasins externes

Comprenez le tearing et pourquoi les abonnements à des magasins externes avec useState ou useRef ne sont pas sûrs dans React concurrent.

Le problème des abonnements aux magasins externes est une leçon React Academy gratuite sur CoddyKit. Ceci est la leçon 1 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage React Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours React Academy comprend 4 leçons au total.

Qu’est-ce qu’une source d’état externe

Une source d’état externe est toute source d’état située en dehors de l’arbre React, comme un magasin Redux, une API du navigateur telle que matchMedia ou un simple objet défini au niveau d’un module avec son propre mécanisme d’abonnement.

React ne possède pas cet état. Il doit donc s’abonner aux changements et lire des instantanés afin de maintenir les composants synchronisés avec ce que la source contient actuellement.

L’abonnement naïf avec useState + useEffect

Une approche courante consiste à lire la valeur de la source dans useState, puis à utiliser useEffect pour s’abonner et appeler setState chaque fois que la source change. En apparence, cela semble maintenir le composant à jour.

Cette approche fonctionne pour un rendu synchrone simple, mais elle présente un défaut subtil qui devient visible lorsque React effectue un rendu concurrent et peut suspendre ou relancer le travail en cours.

Le problème du déchirement

Un déchirement se produit lorsque différentes parties de l’interface affichent des valeurs différentes d’une même source pendant une seule phase de rendu. Le rendu concurrent peut interrompre puis reprendre le travail, et la source peut changer entre-temps.

Il en résulte un écran incohérent : un composant affiche l’ancienne valeur tandis qu’un autre affiche la nouvelle. Une telle incohérence était pratiquement impossible avant les fonctionnalités concurrentes.

Exemple : déchirement du mode sombre en plein rendu

Imaginez que de nombreux composants lisent une source de thème pendant que React effectue un rendu concurrent. Si l’utilisateur active le mode sombre en cours de route, les composants rendus avant l’activation affichent le thème clair et ceux rendus après affichent le thème sombre.

Vous obtenez pendant une image un écran à moitié clair et à moitié sombre, car la valeur de la source a changé au cours d’un rendu que React n’a pas traité de manière atomique.

Pourquoi useEffect arrive trop tard

Les effets s’exécutent après la validation du rendu. Un abonnement fondé sur useEffect ne peut donc pas garantir que la valeur lue pendant le rendu correspond encore à celle de la source au moment de la validation. L’abonnement se déclenche trop tard pour empêcher un affichage incohérent.

Lorsque l’effet se réabonne et met à jour l’état, l’image incohérente a peut-être déjà été affichée à l’utilisateur.

Le useMutableSource obsolète

Une ancienne API expérimentale appelée useMutableSource tentait de résoudre le problème des lectures concurrentes sûres depuis une source externe, mais son utilisation correcte s’est révélée difficile et elle n’a jamais été publiée comme API stable.

L’équipe React l’a remplacée par un mécanisme plus simple et plus ergonomique, qui offre les mêmes garanties de cohérence sans ces pièges.

useSyncExternalStore comme solution

useSyncExternalStore est le mécanisme officiel pour s’abonner de manière sûre aux sources externes en contexte concurrent. Il se coordonne avec React afin que les lectures restent cohérentes pendant un rendu et que les composants ne se déchirent jamais.

Il est devenu le mécanisme recommandé aux auteurs de bibliothèques qui doivent intégrer de manière fiable un état externe dans React pendant un rendu concurrent.

Quelles bibliothèques ont été concernées

Les bibliothèques d’état qui s’abonnent à des sources externes ont été directement concernées, notamment Redux, MobX et Valtio. Chacune devait adopter le nouveau mécanisme pour rester sûre après l’arrivée des fonctionnalités concurrentes.

C’est pourquoi leurs liaisons React ont été mises à jour pour appeler useSyncExternalStore en interne plutôt que de s’appuyer sur l’ancien modèle useState associé à useEffect.

Instantané cohérent et sécurité en contexte concurrent

Le crochet garantit que chaque composant qui lit la source d’état pendant un rendu voit le même instantané, et force un nouveau rendu synchrone si la source d’état change d’une manière qui provoquerait sinon un déchirement.

Cette combinaison d’un instantané cohérent et d’une sécurité en contexte concurrent constitue la principale valeur que le crochet apporte par rapport aux abonnements écrits manuellement.

Une primitive pérenne

En utilisant useSyncExternalStore, vos abonnements restent corrects à mesure que React fait évoluer son modèle de rendu. Vous bénéficiez des garanties du cadre au lieu de les réimplémenter de manière imparfaite.

Il s’agit donc de la méthode durable et recommandée pour relier n’importe quelle source de vérité externe aux composants React.

Vérification rapide : le problème du déchirement

Confirmez ce que signifie le déchirement dans le rendu concurrent.

Récapitulatif : problèmes liés aux abonnements aux sources d’état externes

Les sources d’état externes vivent en dehors de React, et l’abonnement naïf combinant useState et useEffect ne peut pas empêcher le déchirement lorsque le rendu devient concurrent. Les effets s’exécutent trop tard pour maintenir des lectures cohérentes au sein d’un rendu.

useSyncExternalStore remplace useMutableSource, désormais abandonné, et fournit un instantané cohérent ainsi qu’une sécurité en contexte concurrent. Des bibliothèques comme Redux, MobX et Valtio l’ont adopté comme primitive pérenne pour les abonnements aux sources d’état.

Questions Fréquemment Posées

La leçon « Le problème des abonnements aux magasins externes » est-elle gratuite ?

Oui — le texte complet de « Le problème des abonnements aux magasins externes » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours React Academy, passe à CoddyKit PRO. Le cours React Academy comprend 4 leçons au total.

Qu'est-ce que j'apprendrai dans « Le problème des abonnements aux magasins externes » ?

Comprenez le tearing et pourquoi les abonnements à des magasins externes avec useState ou useRef ne sont pas sûrs dans React concurrent. Tu pratiques React Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.

Dois-je avoir de l'expérience pour commencer React Academy ?

Aucune expérience préalable n'est requise. React Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 1 sur 4.

Combien de temps prend la leçon « Le problème des abonnements aux magasins externes » ?

La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.

Peux-tu écrire et exécuter du code dans cette leçon React Academy ?

Oui. Chaque leçon React Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.

Toutes les leçons de ce cours

  1. Le problème des abonnements aux magasins externes
  2. API et paramètres de useSyncExternalStore
  3. S’abonner aux API du navigateur
  4. Construire un magasin personnalisé avec useSyncExternalStore
← Retour à React Academy