Auteur Redux ici!
Redux n'est pas si différent de Flux. Dans l'ensemble, il a la même architecture, mais Redux est capable de réduire certains coins de complexité en utilisant une composition fonctionnelle où Flux utilise l'enregistrement de rappel.
Il n'y a pas de différence fondamentale dans Redux, mais je trouve que cela rend certaines abstractions plus faciles, ou du moins possibles à implémenter, qui seraient difficiles ou impossibles à implémenter dans Flux.
Composition du réducteur
Prenez, par exemple, la pagination. Mon exemple Flux + React Router gère la pagination, mais le code est horrible. L'une des raisons pour lesquelles c'est horrible est que Flux rend peu naturel la réutilisation des fonctionnalités dans les magasins. Si deux magasins doivent gérer la pagination en réponse à des actions différentes, ils doivent soit hériter d'un magasin de base commun (mauvais! Vous vous enfermez dans une conception particulière lorsque vous utilisez l'héritage), soit appeler une fonction définie en externe à partir du gestionnaire d'événements, qui devra en quelque sorte opérer sur l'état privé du magasin Flux. Le tout est désordonné (bien que certainement dans le domaine du possible).
En revanche, avec Redux la pagination est naturelle grâce à la composition réductrice. Il s'agit de réducteurs jusqu'en bas, vous pouvez donc écrire une usine de réducteurs qui génère des réducteurs de pagination , puis l' utiliser dans votre arborescence de réducteurs . La raison pour laquelle c'est si facile est que dans Flux, les magasins sont plats, mais dans Redux, les réducteurs peuvent être imbriqués via la composition fonctionnelle, tout comme les composants React peuvent être imbriqués.
Ce modèle permet également des fonctionnalités merveilleuses telles que l' annulation / la restauration sans code utilisateur . Pouvez-vous imaginer brancher Undo / Redo dans une application Flux avec deux lignes de code? À peine. Avec Redux, c'est encore une fois, grâce au schéma de composition du réducteur. Je dois souligner qu'il n'y a rien de nouveau à ce sujet - c'est le modèle mis au point et décrit en détail dans Elm Architecture qui a lui-même été influencé par Flux.
Rendu du serveur
Les gens ont bien rendu sur le serveur avec Flux, mais vu que nous avons 20 bibliothèques Flux chacune essayant de rendre le rendu du serveur "plus facile", peut-être que Flux a des bords rugueux sur le serveur. La vérité est que Facebook ne fait pas beaucoup de rendu de serveur, ils ne se sont donc pas beaucoup inquiétés à ce sujet et comptent sur l'écosystème pour le rendre plus facile.
Dans Flux traditionnel, les magasins sont des singletons. Cela signifie qu'il est difficile de séparer les données pour différentes demandes sur le serveur. Pas impossible, mais difficile. C'est pourquoi la plupart des bibliothèques Flux (ainsi que les nouveaux Flux Utils ) vous suggèrent désormais d'utiliser des classes au lieu de singletons, afin que vous puissiez instancier des magasins par demande.
Il y a encore les problèmes suivants que vous devez résoudre dans Flux (vous-même ou avec l'aide de votre bibliothèque Flux préférée telle que Flummox ou Alt ):
- Si les magasins sont des classes, comment puis-je les créer et les détruire avec le répartiteur par demande? Quand dois-je enregistrer les magasins?
- Comment hydrater les données des magasins et les réhydrater ensuite sur le client? Dois-je implémenter des méthodes spéciales pour cela?
Certes, les frameworks Flux (pas Vanilla Flux) ont des solutions à ces problèmes, mais je les trouve trop compliqués. Par exemple, Flummox vous demande de l'implémenter serialize()
et deserialize()
dans vos magasins . Alt résout ce problème en fournissant takeSnapshot()
une sérialisation automatique de votre état dans une arborescence JSON.
Redux va plus loin: puisqu'il n'y a qu'un seul magasin (géré par de nombreux réducteurs), vous n'avez pas besoin d'API spéciale pour gérer la (ré) hydratation. Vous n'avez pas besoin de «vider» ou «hydrater» les magasins - il n'y a qu'un seul magasin, et vous pouvez lire son état actuel ou créer un nouveau magasin avec un nouvel état. Chaque demande obtient une instance de magasin distincte. En savoir plus sur le rendu du serveur avec Redux.
Encore une fois, il s'agit de quelque chose de possible à la fois dans Flux et Redux, mais les bibliothèques Flux résolvent ce problème en introduisant une tonne d'API et de conventions, et Redux n'a même pas à le résoudre car il n'a pas ce problème dans le première place grâce à la simplicité conceptuelle.
Expérience développeur
Je n'avais pas vraiment l'intention que Redux devienne une bibliothèque Flux populaire - je l'ai écrite pendant que je travaillais sur mon exposé ReactEurope sur le rechargement à chaud avec le voyage dans le temps . J'avais un objectif principal: permettre de changer le code réducteur à la volée ou même «changer le passé» en biffant les actions, et voir l'état se recalculer.
Je n'ai vu aucune bibliothèque Flux capable de le faire. React Hot Loader ne vous permet pas non plus de le faire - en fait, il casse si vous modifiez les magasins Flux parce qu'il ne sait pas quoi en faire.
Lorsque Redux doit recharger le code réducteur, il appelle replaceReducer()
et l'application s'exécute avec le nouveau code. Dans Flux, les données et les fonctions sont enchevêtrées dans les magasins Flux, vous ne pouvez donc pas «simplement remplacer les fonctions». De plus, il faudrait en quelque sorte réenregistrer les nouvelles versions avec Dispatcher, ce que Redux n'a même pas.
Écosystème
Redux possède un écosystème riche et à croissance rapide . En effet, il fournit quelques points d'extension tels que le middleware . Il a été conçu en tenant compte des cas d'utilisation tels que la journalisation , la prise en charge des promesses , des observables , du routage , des vérifications des développeurs d'immuabilité , la persistance , etc. Tout cela ne s'avérera pas utile, mais il est agréable d'avoir accès à un ensemble d'outils qui peuvent être facilement combinés pour fonctionner ensemble.
Simplicité
Redux conserve tous les avantages de Flux (enregistrement et relecture des actions, flux de données unidirectionnel, mutations dépendantes) et ajoute de nouveaux avantages (annulation facile à refaire, rechargement à chaud) sans introduire Dispatcher et l'enregistrement du magasin.
Il est important de rester simple, car il vous garde sain d'esprit pendant que vous implémentez des abstractions de niveau supérieur.
Contrairement à la plupart des bibliothèques Flux, la surface de l'API Redux est minuscule. Si vous supprimez les avertissements, commentaires et vérifications d'intégrité du développeur, c'est 99 lignes . Il n'y a pas de code asynchrone délicat à déboguer.
Vous pouvez le lire et comprendre tout Redux.
Voir aussi ma réponse sur les inconvénients de l'utilisation de Redux par rapport à Flux .