Reduxの作者はこちら!
Reduxのではありませんそのフラックスは異なります。全体的には同じアーキテクチャですが、Reduxは、Fluxがコールバック登録を使用する関数構成を使用することで、複雑さの一部を削減できます。
Reduxには基本的な違いはありませんが、Fluxで実装するのが難しい、または不可能である特定の抽象化を容易にするか、少なくとも実装することが可能になると思います。
レジューサー組成
たとえば、ページネーションを見てください。私のFlux + React Routerの例はページネーションを処理しますが、そのコードはひどいです。ひどい理由の1つは、Fluxが複数のストアで機能を再利用することを不自然にしていることです。2つのストアが異なるアクションに応じてページ分割を処理する必要がある場合は、共通のベースストアから継承する必要があります(悪い!継承を使用すると、特定のデザインにロックされます)、または内から外部定義関数を呼び出すFluxストアのプライベート状態で何らかの方法で動作する必要があるイベントハンドラー。全体が散らかっています(確かに可能の領域ではありますが)。
一方、Reduxでは、リデューサーの構成により、ページネーションは自然に行われます。それの減速あなたが書くことができるようにすべての方法ダウン、ページネーションの減速を発生させる減速機工場をして、自分の減速ツリーにそれを使用します。Fluxではストアはフラットですが、Reduxでは、Reactコンポーネントをネストできるのと同じように、レデューサーを関数構成を介してネストできるため、これが非常に簡単な理由の鍵です。
このパターンは、非ユーザーコードの取り消し/やり直しなどの素晴らしい機能も有効にします。Undo / Redoを2行のコードであるFluxアプリに接続することを想像できますか?ほとんどありません。Reduxを使用すると、レデューサーコンポジションパターンのおかげで、これは再びです。何も新しいことはないことを強調する必要があります。これは、Fluxの影響を受けたElm Architectureで先駆的に説明されたパターンです。
サーバーレンダリング
人々はFluxを使用してサーバーで問題なくレンダリングしてきましたが、サーバーのレンダリングをより簡単にしようとする20のFluxライブラリがあることがわかりました。真実はFacebookがサーバーレンダリングをあまり行わないため、彼らはそれについてあまり気にしておらず、エコシステムに依存して簡単にしているのです。
従来のFluxでは、ストアはシングルトンです。これは、サーバー上の異なるリクエストのデータを分離するのが難しいことを意味します。不可能ではないが難しい。これが、ほとんどのFluxライブラリー(および新しいFlux Utils)がシングルトンの代わりにクラスを使用することを提案する理由です。これにより、リクエストごとにストアをインスタンス化できます。
Fluxで解決する必要がある次の問題がまだあります(自分で、またはFlummoxやAltなどのお気に入りのFluxライブラリを使用して)。
- ストアがクラスの場合、リクエストごとにディスパッチャーを使用してストアを作成および破棄するにはどうすればよいですか?店舗はいつ登録しますか?
- ストアからのデータをハイドレートし、後でクライアントで再ハイドレートするにはどうすればよいですか?これには特別なメソッドを実装する必要がありますか?
確かにFluxフレームワーク(バニラFluxではない)はこれらの問題の解決策を持っていますが、私はそれらが過度に複雑であることを発見しました。たとえば、Flummoxは、実装serialize()
およびdeserialize()
店舗での実装を要求します。Alt takeSnapshot()
は、JSONツリーで状態を自動的にシリアル化することで、この優れた解決策を提供します。
Reduxはさらに進んでいます:ストアが1つしかないため(多くのレデューサーによって管理されます)、(再)水分補給を管理するために特別なAPIは必要ありません。ストアを「フラッシュ」または「ハイドレート」する必要はありません。単一のストアがあり、現在の状態を読み取ったり、新しい状態で新しいストアを作成したりできます。各リクエストは個別のストアインスタンスを取得します。Reduxによるサーバーレンダリングの詳細をご覧ください。
繰り返しますが、これはFluxとReduxの両方で可能なことですが、Fluxライブラリは大量のAPIと規約を導入することでこの問題を解決します。Reduxは問題を解決しないため、第一に、概念の単純さのおかげです。
開発者の経験
Reduxを人気のあるFluxライブラリにするつもりはありませんでした。私は、ReactEuropeでタイムトラベルを伴うホットリロードに関する講演に取り組んでいたときに書いたのです。主な目的は1つでした。リデューサーコードをその場で変更したり、アクションに取り消し線を引いて「過去を変更」したり、状態が再計算されたりすることを確認することです。
これを行うことができる単一のFluxライブラリを見たことがありません。React Hot Loaderでもこれを行うことはできません。実際、Fluxストアを編集すると、何を行うかわからないため、Fluxストアが壊れます。
Reduxがレデューサーコードをリロードする必要がある場合、を呼び出しreplaceReducer()
、アプリは新しいコードで実行されます。Fluxでは、データと関数がFluxストアで絡み合っているため、「関数を置き換えるだけ」ことはできません。さらに、なんとかして新しいバージョンをDispatcherに再登録する必要があります— Reduxにはないものです。
生態系
Reduxには、豊かで急速に成長しているエコシステムがあります。これは、ミドルウェアなどのいくつかの拡張ポイントを提供するためです。これは、ロギング、Promises、Observables、ルーティング、不変性の開発チェック、永続性などのサポートケースを念頭に置いて設計されました。これらのすべてが役立つとは限りませんが、簡単に組み合わせて連携できるツールのセットにアクセスできると便利です。
シンプルさ
Reduxは、Dispatcherとストア登録を導入することなく、Fluxのすべての利点(アクションの記録と再生、単方向のデータフロー、依存する変更)を維持し、新しい利点(簡単な元に戻す、やり直し、ホットリロード)を追加します。
より高いレベルの抽象化を実装する間、それを正気に保つので、それをシンプルに保つことは重要です。
ほとんどのFluxライブラリとは異なり、Redux APIサーフェスは小さいです。開発者の警告、コメント、健全性チェックを削除すると、99行になります。デバッグするトリッキーな非同期コードはありません。
実際にそれを読んで、Reduxのすべてを理解することができます。
Fluxと比較したReduxの欠点についての私の回答も参照してください。