Redux & RxJS, jakieś podobieństwa?

Wiem, że Redux to lepsza "implementacja" Flux, albo lepiej mówiąc, że to przeprojektowanie w celu uproszczenia (zarządzanie stanem aplikacji).

Słyszałem wiele o programowaniu reaktywnym (rxjs), ale nie nurkowałem jeszcze, aby się tego nauczyć.

Więc moje pytanie brzmi: czy istnieje jakieś skrzyżowanie (coś wspólnego) między tymi dwoma technologiami, czy są one komplementarne? ...czy zupełnie inaczej?

Author: ROMANIA_engineer, 2015-12-28

5 answers

Krótko mówiąc, są to bardzo różne biblioteki do bardzo różnych celów, ale tak, są pewne niejasne podobieństwa.

Redux jest narzędziem do zarządzania stanem w całej aplikacji. Jest zwykle używany jako architektura interfejsu użytkownika. Pomyśl o tym jako o alternatywie dla (połowy) kątowej.

RxJS jest biblioteką programowania reaktywnego. Jest zwykle używany jako narzędzie do wykonywania zadań asynchronicznych w JavaScript. Potraktuj to jako alternatywę dla obietnic.


Reaktywne programowanie jest paradygmatem (sposobem pracy i myślenia), w którym zmiany danych są obserwowane z odległości . Dane nie są zmieniane z odległości .

Oto przykład zmieniony z dystansu :

// In the controller.js file
model.set('name', 'George');

Model zostaje zmieniony z kontrolera.

Oto przykład obserwowanego z odległości :

// logger.js
store.subscribe(function (data) {
    console.log(data);
});

W rejestratorze obserwujemy zmiany danych zachodzące w sklepie (z daleka) i zapisujemy do konsola.


Redux używa paradygmatu reaktywności tylko trochę: sklep jest reaktywny. Nie ustawiasz jej zawartości z dystansu. Dlatego nie ma store.set() w Redux. Sklep obserwuje działania z dystansu i sam się zmienia. A sklep pozwala innym obserwować swoje dane z daleka. RxJS wykorzystuje również paradygmat reaktywny, ale zamiast być architekturą, daje podstawowe elementy konstrukcyjne, Observables , aby osiągnąć to " obserwowanie z odległość " wzór.

Podsumowując, bardzo różne rzeczy do różnych celów, ale podziel się kilkoma pomysłami.

 120
Author: André Staltz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-13 07:07:30

To bardzo różne rzeczy.

RxJS może być używany do programowania reaktywnego i jest bardzo dokładną biblioteką z ponad 250 operatorami.

I Redux jest jak opisano na github repo "Redux jest przewidywalnym kontenerem stanu dla aplikacji JavaScript".

Redux to tylko narzędzie do obsługi stanu w aplikacjach. Ale w porównaniu można zbudować pełną aplikację w tylko RxJS.

Mam nadzieję, że to pomoże:)

 23
Author: cmdv,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-28 22:36:48

W skrócie:

Redux: biblioteka inspirowana Flux używana do zarządzania stanem .

RxJS: jest to kolejna biblioteka Javascript oparta na filozofii programowania reaktywnego, używana do obsługi "strumieni" (Obserwabli, itp.) [Przeczytaj o programowaniu reaktywnym, aby zrozumieć pojęcia strumienia].

 2
Author: kg11,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-16 12:54:04

Chciałem tylko dodać kilka pragmatycznych różnic od tego, kiedy robiłem inspirowany Reduxem kod RxJS.

Zmapowałem każdy typ akcji do instancji obiektu. Każdy Stanowy komponent będzie miał temat, który zostanie następnie zmapowany do funkcji reduktora. Wszystkie strumienie reduktora są łączone z merge, a następnie scan wyprowadza stan. Wartość domyślna jest ustawiana przez startWith tuż przed scan. Użyłem publishReplay(1) dla stanów, ale mogę go później usunąć.

Funkcja react pure render będzie tylko miejsce, w którym produkujesz dane o zdarzeniach, wysyłając wszystkich producentów / tematów.

Jeśli masz komponenty potomne, musisz opisać, jak te stany są połączone z Twoim. To może być dobry punkt wyjścia.

Znaczące różnice w implementacji:

  • Brak oprogramowania pośredniczącego, tylko operatorzy rxjs. Myślę, że to jest największa moc i słabość. Wciąż możesz pożyczyć pojęcia, ale trudno mi uzyskać pomoc od siostrzanych społeczności, takich jak redux i cycle.js ponieważ jest to kolejne niestandardowe rozwiązanie. Dlatego muszę napisać "ja" zamiast " my " w tym tekście.

  • Brak przełącznika/obudowy lub ciągów znaków dla typów akcji. Masz bardziej dynamiczny sposób rozdzielania akcji.

  • Rxjs może być używany jako narzędzie gdzie indziej i nie jest zawarty w zarządzaniu państwem.

  • Mniejsza liczba producentów niż rodzaje działań (?). Nie jestem tego pewien, ale możesz mieć wiele reakcji w komponentach rodzica, które słuchają dziecka komponenty. Oznacza to mniej kodu imperatywnego i mniejszą złożoność.

  • To Twoje rozwiązanie. Nie są potrzebne ramy. Dobre i złe. W końcu i tak napiszesz swój własny framework.

  • Jest to o wiele bardziej fraktalne i można łatwo subskrybować zmiany z podrzędnego drzewa lub wielu części drzewa stanu aplikacji.

    • zgadnij, jak łatwo jest robić epiki jak redux-obseravble? Naprawdę łatwe.
[7]}pracuję również nad znacznie większym korzyści, w których komponenty potomne są opisane jako strumienie. Oznacza to, że nie musimy komplikować stanu nadrzędnego i podrzędnego w reduktorach, ponieważ możemy po prostu ("tylko") rekurencyjnie łączyć Stany oparte na strukturze komponentu.

Myślę również o pominięciu Reacta i przejściu z snabbdom lub czymś innym, dopóki React lepiej nie poradzi sobie ze Stanami reaktywnymi. Dlaczego mielibyśmy budować nasz stan w górę, tylko po to, aby go ponownie rozbić za pomocą rekwizytów? Postaram się więc zrobić wersję 2 tego wzoru z Snabbdom.

Oto bardziej zaawansowany, ale mały fragment, w którym Państwo.plik ts buduje strumień stanu. Jest to stan komponentu ajax-form, który otrzymuje obiekt pól (wejść) z regułami walidacji i stylami css. W tym pliku używamy tylko nazw pól (kluczy obiektów), aby połączyć wszystkie stany potomne w stan formularza.

export default function create({
  Observable,
  ajaxInputs
}) {
  const fieldStreams = Object.keys(ajaxInputs)
  .map(function onMap(fieldName) {
    return ajaxInputs[fieldName].state.stream
    .map(function onMap(stateData) {
      return {stateData, fieldName}
    })
  })

  const stateStream = Observable.combineLatest(...fieldStreams)
  .map(function onMap(fieldStreamDataArray) {
    return fieldStreamDataArray.reduce(function onReduce(acc, fieldStreamData) {
    acc[fieldStreamData.fieldName] = fieldStreamData.stateData
    return acc
  }, {})
  })

  return {
    stream: stateStream
  }
}

Chociaż kod może nie mówić wiele w izolacji, pokazuje, jak można budować stan w górę, i jak można produkować dynamiczne zdarzenia z spokojnie. Cena jest taka, że musisz zrozumieć inny styl kodu. I uwielbiam za to płacić.

 1
Author: Marcus Nielsen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-18 10:37:57

Możesz" zaimplementować " Redux w jednej linii RxJS . Jeśli myślisz o Rx z innych powodów (do obietnic skórek, do korzystania z niego na serwerze i kliencie), to pomiń Redux i przejdź do wszystkich Rx.

 0
Author: bbsimonbb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-02 15:06:47