Автор Redux здесь!
Redux не намного отличается от Flux. В целом он имеет ту же архитектуру, но 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 Utils) теперь предлагаем вам использовать классы вместо синглтонов, чтобы вы могли создавать экземпляры хранилищ для каждого запроса.
Есть еще следующие проблемы, которые вам нужно решить в Flux (либо самостоятельно, либо с помощью вашей любимой библиотеки Flux, такой как Flummox или Alt):
- Если магазины являются классами, как мне создавать и уничтожать их с помощью диспетчера по запросу? Когда я регистрирую магазины?
- Как гидратировать данные из хранилищ, а затем повторно гидратировать их на клиенте? Нужно ли для этого реализовывать специальные методы?
По общему признанию, фреймворки Flux (не ванильный 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.
person
Dan Abramov
schedule
03.10.2015