Redux autor tutaj!
Redux nie jest , że różni się od topnika. Ogólnie rzecz biorąc ma tę samą architekturę, ale Redux jest w stanie skrócić niektóre narożniki złożoności, wykorzystując funkcjonalną kompozycję, w której Flux używa rejestracji wywołania zwrotnego.
W Redux nie ma zasadniczej różnicy, ale uważam, że sprawia, że pewne abstrakcje są łatwiejsze lub przynajmniej możliwe do wdrożenia, które byłyby trudne lub niemożliwe do wdrożenia we Fluxie.
Skład reduktora
Weźmy na przykład paginację. Przykład routera My Flux + React obsługuje podział na strony, ale kod tego jest okropny. Jednym z powodów, dla których jest to okropne, jest to, że Flux sprawia, że nienaturalne jest ponowne używanie funkcji w różnych sklepach. Jeśli dwa sklepy muszą obsługiwać paginację w odpowiedzi na różne działania, albo muszą dziedziczyć ze wspólnego magazynu podstawowego (źle! Blokujesz się w konkretnym projekcie, gdy korzystasz z dziedziczenia), lub wywołać zewnętrznie zdefiniowaną funkcję z poziomu moduł obsługi zdarzeń, który będzie musiał jakoś działać w prywatnym stanie sklepu Flux. Cała sprawa jest bałaganiarska (choć zdecydowanie w dziedzinie możliwej).
Z drugiej strony, dzięki Redux paginacja jest naturalna dzięki składowi reduktora. Reduktory są w dół, więc możesz napisać fabrykę reduktorów, która generuje reduktory stronicowania, a następnie użyć jej w drzewie reduktorów . Kluczem do tego, dlaczego jest to tak łatwe, jest to, że we Fluxie sklepy są płaskie, ale w Redux reduktory można zagnieżdżać za pomocą funkcjonalnej kompozycji, podobnie jak można zagnieżdżać komponenty React.
Ten wzór umożliwia także wspaniałe funkcje, takie jak cofanie / ponawianie kodu bez użytkownika . Czy potrafisz sobie wyobrazić podłączanie Cofnij / Powtórz do aplikacji Flux, która jest dwoma liniami kodu? Ledwie. W Redux jest to ponownie dzięki wzorowi składu reduktora. Muszę podkreślić, że nie ma w tym nic nowego - jest to wzorzec zapoczątkowany i szczegółowo opisany w Architekturze Wiązów, na który sam wpływ miał Flux.
Renderowanie serwera
Ludzie dobrze renderowali na serwerze za pomocą Fluxa, ale widząc, że mamy 20 bibliotek Fluxa, z których każda próbuje uczynić serwer „renderowaniem łatwiejszym”, być może Flux ma pewne szorstkie krawędzie na serwerze. Prawda jest taka, że Facebook nie renderuje zbyt wiele serwerów, więc nie byli tym bardzo zaniepokojeni i polegają na ekosystemie, aby to ułatwić.
W tradycyjnym systemie Flux sklepy są singletonami. Oznacza to, że trudno jest oddzielić dane dla różnych żądań na serwerze. Nie niemożliwe, ale trudne. Właśnie dlatego większość bibliotek Flux (jak również nowe narzędzia Flux ) sugerują teraz używanie klas zamiast singletonów, dzięki czemu można tworzyć instancje sklepów na żądanie.
Nadal istnieją następujące problemy, które musisz rozwiązać we Fluxie (samodzielnie lub przy pomocy swojej ulubionej biblioteki Flux, takiej jak Flummox lub Alt ):
- Jeśli sklepy są klasami, jak je utworzyć i zniszczyć za pomocą dyspozytora na żądanie? Kiedy rejestruję sklepy?
- Jak uwodnić dane ze sklepów, a następnie uwodnić je na kliencie? Czy muszę zaimplementować do tego specjalne metody?
Wprawdzie frameworki Flux (nie Vanilla Flux) mają rozwiązania tych problemów, ale uważam, że są zbyt skomplikowane. Na przykład, speszyć kogoś prosi, aby wdrożyć serialize()
i deserialize()
w swoich sklepach . Alt rozwiązuje ten problem, zapewniając takeSnapshot()
automatyczne serializowanie stanu w drzewie JSON.
Redux idzie dalej: ponieważ istnieje tylko jeden sklep (zarządzany przez wiele reduktorów), nie potrzebujesz żadnego specjalnego API do zarządzania (ponownym) nawodnieniem. Nie musisz „przepłukiwać” ani „nawadniać” sklepów - jest tylko jeden sklep i możesz odczytać jego aktualny stan lub utworzyć nowy sklep z nowym stanem. Każde żądanie otrzymuje osobną instancję sklepu. Przeczytaj więcej o renderowaniu serwerów za pomocą Redux.
Ponownie, jest to przypadek czegoś możliwego zarówno we Fluxie, jak i Reduxie, ale biblioteki Flux rozwiązują ten problem, wprowadzając mnóstwo API i konwencji, a Redux nawet nie musi go rozwiązać, ponieważ nie ma tego problemu w pierwsze miejsce dzięki prostocie koncepcyjnej.
Doświadczenie programistów
W rzeczywistości nie zamierzałem, aby Redux stał się popularną biblioteką Flux - napisałem to, pracując nad moim wystąpieniem ReactEurope na temat przeładowywania w czasie podróży . Miałem jeden główny cel: umożliwić zmianę kodu reduktora w locie, a nawet „zmienić przeszłość” poprzez wykreślanie działań i zobaczyć, jak stan jest przeliczany.
Nie widziałem żadnej biblioteki Flux, która byłaby w stanie to zrobić. React Hot Loader również nie pozwala ci tego zrobić - w rzeczywistości psuje się, jeśli edytujesz sklepy Flux, ponieważ nie wie, co z nimi zrobić.
Kiedy Redux musi ponownie załadować kod reduktora, dzwoni replaceReducer()
, a aplikacja działa z nowym kodem. W Flux dane i funkcje są zaplątane w sklepach Flux, więc nie można „po prostu zastąpić funkcji”. Co więcej, będziesz musiał jakoś ponownie zarejestrować nowe wersje w Dispatcherze - coś, czego Redux nawet nie ma.
Ekosystem
Redux ma bogaty i szybko rozwijający się ekosystem . Wynika to z faktu, że zapewnia on kilka punktów rozszerzenia, takich jak oprogramowanie pośrednie . Został zaprojektowany z myślą o przypadkach użycia, takich jak rejestrowanie , obsługa obietnic , obserwowalności , routing , sprawdzanie twórców niezmienności , trwałość itp. Nie wszystkie z nich okażą się przydatne, ale miło jest mieć dostęp do zestawu narzędzi, które można łatwo połączyć, aby ze sobą współpracować.
Prostota
Redux zachowuje wszystkie zalety Flux (nagrywanie i odtwarzanie akcji, jednokierunkowy przepływ danych, zależne mutacje) i dodaje nowe korzyści (łatwe cofanie, ponawianie, ponowne ładowanie) bez konieczności wprowadzania dyspozytora i rejestracji w sklepie.
Utrzymanie prostoty jest ważne, ponieważ pozwala zachować rozsądek podczas wdrażania abstrakcyjnych poziomów wyższego poziomu.
W przeciwieństwie do większości bibliotek Flux, interfejs API Redux jest niewielki. Jeśli usuniesz ostrzeżenia programisty, komentarze i testy poprawności, będzie to 99 wierszy . Nie ma trudnego kodu asynchronicznego do debugowania.
Możesz go przeczytać i zrozumieć cały Redux.
Zobacz także moją odpowiedź na temat wad korzystania z Redux w porównaniu do Flux .