Redux Autor hier!
Redux unterscheidet sich nicht so sehr von Flux. Insgesamt hat es die gleiche Architektur, aber Redux ist in der Lage, einige Komplexitätsprobleme zu lösen, indem es die funktionale Zusammensetzung verwendet, bei der Flux die Rückrufregistrierung verwendet.
Es gibt keinen grundlegenden Unterschied in Redux, aber ich finde, dass es bestimmte Abstraktionen einfacher oder zumindest möglich macht, sie zu implementieren, die in Flux schwer oder unmöglich zu implementieren wären.
Reduziererzusammensetzung
Nehmen Sie zum Beispiel die Paginierung. Mein Beispiel für den Flux + React Router behandelt die Paginierung, aber der Code dafür ist schrecklich. Einer der Gründe, warum es schrecklich ist, ist, dass Flux es unnatürlich macht, Funktionen in Geschäften wiederzuverwenden. Wenn zwei Speicher die Paginierung als Reaktion auf unterschiedliche Aktionen verarbeiten müssen, müssen sie entweder von einem gemeinsamen Basisspeicher erben (schlecht! Sie sperren sich in ein bestimmtes Design ein, wenn Sie die Vererbung verwenden) oder eine extern definierte Funktion aus dem aufrufen Event-Handler, der irgendwie auf den privaten Status des Flux-Stores angewendet werden muss. Das Ganze ist chaotisch (obwohl definitiv im Bereich des Möglichen).
Andererseits ist bei Redux die Paginierung dank der Reduktionszusammensetzung natürlich. Es handelt sich um Reduzierungen, sodass Sie eine Reduzierungsfabrik schreiben können , die Paginierungsreduzierer generiert, und diese dann in Ihrem Reduziererbaum verwenden können . Der Schlüssel, warum es so einfach ist, liegt darin, dass in Flux die Geschäfte flach sind, aber in Redux können Reduzierungen über die funktionale Zusammensetzung verschachtelt werden, genau wie React-Komponenten verschachtelt werden können.
Dieses Muster ermöglicht auch wunderbare Funktionen wie das Rückgängigmachen / Wiederherstellen ohne Benutzercode . Können Sie sich vorstellen, Undo / Redo in zwei Codezeilen in eine Flux-App einzufügen? Kaum. Mit Redux ist es dank des Zusammensetzungsmusters des Reduzierers wieder möglich. Ich muss hervorheben, dass es nichts Neues gibt - dies ist das Muster, das in Elm Architecture, das selbst von Flux beeinflusst wurde , entwickelt und ausführlich beschrieben wurde.
Server-Rendering
Die Leute haben mit Flux gut auf dem Server gerendert, aber da wir 20 Flux-Bibliotheken haben, die jeweils versuchen, das Rendern von Servern „einfacher“ zu machen, hat Flux möglicherweise einige Ecken und Kanten auf dem Server. Die Wahrheit ist, dass Facebook nicht viel Server-Rendering macht, daher waren sie nicht sehr besorgt darüber und verlassen sich auf das Ökosystem, um es einfacher zu machen.
Im traditionellen Flux sind Geschäfte Singletons. Dies bedeutet, dass es schwierig ist, die Daten für verschiedene Anforderungen auf dem Server zu trennen. Nicht unmöglich, aber schwer. Aus diesem Grund empfehlen die meisten Flux-Bibliotheken (sowie die neuen Flux-Utils ) jetzt, Klassen anstelle von Singletons zu verwenden, damit Sie Speicher pro Anforderung instanziieren können.
Es gibt immer noch die folgenden Probleme, die Sie in Flux lösen müssen (entweder selbst oder mithilfe Ihrer bevorzugten Flux-Bibliothek wie Flummox oder Alt ):
- Wenn Geschäfte Klassen sind, wie erstelle und zerstöre ich sie mit dem Dispatcher pro Anfrage? Wann registriere ich Geschäfte?
- Wie hydratisiere ich die Daten aus den Filialen und rehydriere sie später auf dem Client? Muss ich dafür spezielle Methoden implementieren?
Zugegeben, Flux-Frameworks (nicht Vanilla Flux) haben Lösungen für diese Probleme, aber ich finde sie überkompliziert. Zum Beispiel Flummox fragt Sie zu implementieren serialize()
und deserialize()
Ihre Geschäfte in . Alt löst dieses Problem, indem es bereitstellt, takeSnapshot()
dass Ihr Status automatisch in einem JSON-Baum serialisiert wird.
Redux geht nur noch weiter: Da es nur einen einzigen Speicher gibt (der von vielen Reduzierern verwaltet wird), benötigen Sie keine spezielle API, um die (Wieder-) Flüssigkeitszufuhr zu verwalten. Sie müssen die Geschäfte nicht „spülen“ oder „hydrieren“ - es gibt nur ein einziges Geschäft, und Sie können den aktuellen Status lesen oder ein neues Geschäft mit einem neuen Status erstellen. Jede Anforderung erhält eine separate Speicherinstanz. Lesen Sie mehr über das Rendern von Servern mit Redux.
Auch dies ist ein Fall von etwas, das sowohl in Flux als auch in Redux möglich ist, aber Flux-Bibliotheken lösen dieses Problem, indem sie eine Menge APIs und Konventionen einführen, und Redux muss es nicht einmal lösen, weil es dieses Problem nicht in der erster Platz dank konzeptioneller Einfachheit.
Entwicklererfahrung
Ich hatte eigentlich nicht vor, Redux zu einer beliebten Flux-Bibliothek zu machen - ich schrieb es, als ich an meinem ReactEurope-Vortrag über das heiße Nachladen mit Zeitreisen arbeitete . Ich hatte ein Hauptziel: es möglich zu machen, den Reduzierungscode im laufenden Betrieb zu ändern oder sogar die Vergangenheit zu ändern, indem Aktionen durchgestrichen werden, und zu sehen, wie der Zustand neu berechnet wird.
Ich habe keine einzige Flux-Bibliothek gesehen, die dies kann. React Hot Loader lässt Sie dies auch nicht zu - tatsächlich bricht es ab, wenn Sie Flux-Stores bearbeiten, weil es nicht weiß, was es damit tun soll.
Wenn Redux den Reduzierungscode neu laden muss, wird es aufgerufen replaceReducer()
und die App wird mit dem neuen Code ausgeführt. In Flux sind Daten und Funktionen in Flux-Speichern verschränkt, sodass Sie die Funktionen nicht einfach ersetzen können. Außerdem müssten Sie die neuen Versionen irgendwie beim Dispatcher neu registrieren - etwas, das Redux nicht einmal hat.
Ökosystem
Redux hat ein reiches und schnell wachsendes Ökosystem . Dies liegt daran, dass einige Erweiterungspunkte wie Middleware bereitgestellt werden . Es wurde unter Berücksichtigung von Anwendungsfällen wie Protokollierung , Unterstützung für Versprechen , Observables , Routing , Unveränderlichkeitsprüfungen , Persistenz usw. entwickelt. Nicht alle davon werden sich als nützlich erweisen, aber es ist schön, Zugriff auf eine Reihe von Tools zu haben, die einfach kombiniert werden können, um zusammenzuarbeiten.
Einfachheit
Redux bewahrt alle Vorteile von Flux (Aufzeichnung und Wiedergabe von Aktionen, unidirektionaler Datenfluss, abhängige Mutationen) und fügt neue Vorteile hinzu (einfaches Rückgängigmachen, erneutes Laden im laufenden Betrieb), ohne die Dispatcher- und Store-Registrierung einzuführen.
Es ist wichtig, es einfach zu halten, da es Sie bei der Implementierung von Abstraktionen auf höherer Ebene gesund hält.
Im Gegensatz zu den meisten Flux-Bibliotheken ist die Redux-API-Oberfläche winzig. Wenn Sie die Entwicklerwarnungen, Kommentare und Überprüfungen entfernen, sind es 99 Zeilen . Es gibt keinen kniffligen asynchronen Code zum Debuggen.
Sie können es tatsächlich lesen und alles von Redux verstehen.
Siehe auch meine Antwort zu den Nachteilen der Verwendung von Redux im Vergleich zu Flux .