Автор Redux здесь!
Redux не что отличается от флюса. В целом он имеет ту же архитектуру, но Redux может сократить некоторые сложности, используя функциональную композицию, в которой Flux использует регистрацию обратного вызова.
В Redux нет принципиальной разницы, но я считаю, что она делает некоторые абстракции более легкими или, по крайней мере, возможными для реализации, которые было бы трудно или невозможно реализовать в Flux.
Состав редуктора
Взять, к примеру, нумерацию страниц. Мой пример Flux + React Router обрабатывает нумерацию страниц, но код для этого ужасен. Одна из причин, по которой это ужасно, заключается в том, что Flux делает неестественным повторное использование функциональности в разных магазинах. Если двум хранилищам нужно обрабатывать нумерацию страниц в ответ на разные действия, им либо нужно наследовать от общего базового хранилища (плохо! Вы привязываетесь к конкретному дизайну, когда используете наследование), либо вызывать внешнюю функцию изнутри обработчик событий, который должен каким-то образом работать в частном состоянии магазина Flux. Все это грязно (хотя определенно в области возможного).
С другой стороны, с Redux нумерация страниц естественна благодаря составу редуктора. Это редукторы, поэтому вы можете написать фабрику редукторов, которая генерирует редукторы нумерации страниц, а затем использовать их в своем дереве редукторов . Ключ к тому, почему это так просто, заключается в том, что в Flux хранилища плоские, а в Redux редукторы могут быть вложены посредством функциональной компоновки, точно так же, как и компоненты React.
Этот шаблон также включает в себя замечательные функции, такие как отмены / повторов без кода пользователя . Можете ли вы представить, что подключение Undo / Redo к приложению Flux представляет собой две строки кода? Едва. С Redux это - снова, благодаря шаблону композиции редуктора. Я должен подчеркнуть, что в этом нет ничего нового - это образец, впервые описанный и подробно описанный в Elm Architecture, который сам был под влиянием Flux.
Рендеринг сервера
Люди хорошо выполняли рендеринг на сервере с помощью Flux, но, увидев, что у нас есть 20 библиотек Flux, каждая из которых пытается сделать процесс рендеринга на сервере «более простым», возможно, у Flux есть некоторые неровности на сервере. Правда в том, что Facebook не сильно рендерит сервер, поэтому их это не очень беспокоит, и они делают упор на экосистему.
В традиционных магазинах Flux есть синглтоны. Это означает, что трудно разделить данные для разных запросов на сервере. Не невозможно, но сложно. Вот почему большинство библиотек Flux (а также новые утилиты Flux ) теперь предлагают использовать классы вместо синглетонов, чтобы можно было создавать экземпляры хранилищ по запросу.
В Flux по-прежнему есть следующие проблемы, которые вам нужно решить (самостоятельно или с помощью вашей любимой библиотеки Flux, такой как Flummox или Alt ):
- Если магазины являются классами, как мне создавать и уничтожать их с помощью диспетчера для каждого запроса? Когда я регистрирую магазины?
- Как мне гидрировать данные из магазинов, а затем повторно скопировать их на клиенте? Нужно ли реализовывать специальные методы для этого?
По общему признанию, фреймворки Flux (не vanilla Flux) имеют решения этих проблем, но я нахожу их слишком сложными. Например, Flummox просит вас внедрить serialize()
и deserialize()
в ваших магазинах . Alt решает эту проблему, обеспечивая takeSnapshot()
автоматическую сериализацию вашего состояния в дереве JSON.
Redux идет еще дальше: поскольку существует только один магазин (управляемый многими редукторами), вам не нужен специальный API для управления (ре) гидратацией. Вам не нужно «очищать» или «увлажнять» магазины - есть только один магазин, и вы можете прочитать его текущее состояние или создать новый магазин с новым состоянием. Каждый запрос получает отдельный экземпляр магазина. Узнайте больше о рендеринге сервера с Redux.
Опять же, это случай чего-то возможного как в Flux, так и в Redux, но библиотеки Flux решают эту проблему путем введения тонны API и соглашений, и Redux даже не нужно ее решать, потому что у нее нет такой проблемы в Первое место благодаря концептуальной простоте.
Опыт разработчика
На самом деле я не собирался делать Redux популярной библиотекой Flux - я написал ее, когда работал над докладом ReactEurope о горячей перезагрузке с путешествиями во времени . У меня была одна главная цель: сделать возможным изменение кода редуктора на лету или даже «изменить прошлое», перечеркнув действия, и увидеть, как состояние пересчитывается.
Я не видел ни одной библиотеки Flux, которая могла бы сделать это. React Hot Loader также не позволяет вам этого делать - на самом деле он ломается, если вы редактируете хранилища Flux, потому что он не знает, что с ними делать.
Когда Redux необходимо перезагрузить код редуктора, он вызывает replaceReducer()
, и приложение запускается с новым кодом. В Flux данные и функции запутаны в хранилищах Flux, поэтому вы не можете «просто заменить функции». Более того, вам придется как-то перерегистрировать новые версии с помощью Dispatcher - чего у Redux даже нет.
экосистема
Redux имеет богатую и быстрорастущую экосистему . Это потому, что он предоставляет несколько точек расширения, таких как промежуточное программное обеспечение . Он был разработан с учетом вариантов использования, таких как ведение журнала , поддержка Promises , Observables , маршрутизация , проверки неизменяемости , постоянство и т. Д. Не все из них окажутся полезными, но приятно иметь доступ к набору инструментов, которые можно легко комбинировать для совместной работы.
Простота
Redux сохраняет все преимущества Flux (запись и воспроизведение действий, однонаправленный поток данных, зависимые мутации) и добавляет новые преимущества (простота отмены, горячая перезагрузка) без использования Dispatcher и регистрации магазина.
Сохранять простоту очень важно, потому что она сохраняет вас в здравом уме, пока вы реализуете абстракции более высокого уровня.
В отличие от большинства библиотек Flux, поверхность Redux API крошечная. Если вы удалите предупреждения разработчика, комментарии и проверки работоспособности, это будет 99 строк . Нет сложного асинхронного кода для отладки.
Вы действительно можете прочитать его и понять все о Redux.
Смотрите также мой ответ о недостатках использования Redux по сравнению с Flux .