Ich arbeite an der Untersuchung einer Front-End-Anwendung mittlerer Komplexität. In diesem Moment ist es in reinem Javascript geschrieben und enthält viele verschiedene ereignisbasierte Nachrichten, die einige Hauptteile dieser Anwendung verbinden.
Wir haben beschlossen, im Rahmen des weiteren Refactorings eine Art Statuscontainer für diese Anwendung zu implementieren. Zuvor hatte ich einige Erfahrungen mit Redux und Ngrx Store (was eigentlich den gleichen Prinzipien folgt).
Redux ist eine Option für uns, aber einer der Entwickler schlug vor, eine auf Zustandsmaschinen basierende Bibliothek zu verwenden, insbesondere die xstate-Bibliothek .
Ich habe noch nie mit xstate gearbeitet, fand es also interessant und fing an, Dokumentation zu lesen und mir verschiedene Beispiele anzusehen. Sah vielversprechend und kraftvoll aus, aber irgendwann verstand ich, dass ich keinen signifikanten Unterschied zwischen ihm und Redux sehe.
Ich habe stundenlang versucht, eine Antwort oder andere Informationen zu finden, die xstate und redux vergleichen. Ich habe keine klaren Informationen gefunden, außer einigen Artikeln wie "Von Redux zu einer Zustandsmaschine gelangen" oder Links zu Bibliotheken, die sich darauf konzentrieren, Redux und Xstate zusammen zu verwenden (ziemlich seltsam).
Wenn jemand den Unterschied beschreiben oder mir sagen kann, wann Entwickler xstate wählen sollten, sind Sie herzlich willkommen.
quelle
Antworten:
Ich habe XState erstellt, aber ich werde Ihnen nicht sagen, ob Sie eines über dem anderen verwenden sollen. Das hängt von Ihrem Team ab. Stattdessen werde ich versuchen, einige wichtige Unterschiede hervorzuheben.
"loading"
,"success"
) von „unendlich Zustand“ oder Kontext (zBitems: [...]
).State
Objekts, das bei jedem Übergang zurückgegeben wird (aktueller Status + Ereignis).Ich werde diese Woche weitere wichtige Unterschiede zu den Dokumenten hinzufügen.
quelle
Die Zustandsmaschine weist Sie nicht an, einen unidirektionalen Datenfluss zu erzwingen. Es hat nichts mit Datenfluss zu tun. Es geht mehr darum , Zustandsänderungen und Zustandsübergänge einzuschränken . Daher werden im Allgemeinen nur einige Teile der Anwendung mit Zustandsautomaten entworfen, und zwar nur dann, wenn Sie einige Zustandsänderungen einschränken / verbieten müssen und an Übergängen interessiert sind .
Beachten Sie, dass bei Zustandsautomaten, wenn aus irgendeinem Grund (externe API-Abhängigkeit usw.) die Möglichkeit besteht, dass die App in einem Zustand gesperrt wird, in dem sie aufgrund von Einschränkungen nicht in einen anderen Zustand übergehen kann, Sie sie lösen müssen.
Aber wenn Sie nur in letzten App Staat selbst, statt interessierte Zustandsübergänge und Zustandsbeschränkungen keine Rolle, dann besser nicht Zustandsmaschine verwenden und direkt seine Aktualisierung Zustand selbst ( Sie noch Zustand in einer Singleton - Klasse Update wickeln können durch Aktionsklassen ).
Auf der anderen Seite, Redux ist unidirektional Architektur - Framework . Unidirektionale Architekturen erzwingen eine einheitliche Richtung des Datenflusses. In Redux beginnt es mit
User->View->(Action)->Store->Reducer->(Middleware)->Store->(State)->View
. Wie bei State Machines können Sie mit Middlewares in Redux Nebenwirkungen auslösen. Sie können Statusübergänge einschränken / verbieten, wenn Sie möchten. Im Gegensatz zu State Machine erzwingt Redux einen unidirektionalen Datenfluss, pur ! Reduzierfunktionen, unveränderliche Statusobjekte, einzelner beobachtbarer App-Status.quelle