Зачем использовать Redux над Facebook Flux?
Я читал ответ,снижение шаблонный, посмотрел на несколько примеров GitHub и даже попробовал redux немного (todo apps).
Как я понимаю, официальные redux doc мотивации обеспечить плюсы по сравнению с традиционными архитектурами MVC. Но это не дает ответа на вопрос:
почему вы должны использовать Redux над Facebook Flux?
это только вопрос стили программирования: функциональный против нефункционального? Или вопрос в способностях / dev-инструментах, которые следуют из подхода redux? Может быть, масштабирование? Или тестирование?
я прав, если скажу, что redux-это поток для людей, которые происходят из функциональных языков?
чтобы ответить на этот вопрос, вы можете сравнить сложность реализации мотивационных точек redux на flux vs redux.
вот мотивационные очки от официальные redux doc мотивации:
- обработка оптимистичных обновлений (как я понимаю, это вряд ли зависит от 5-й точки. Трудно ли реализовать его в facebook flux?)
- рендеринг на сервере (facebook flux также может сделать это. Любые преимущества по сравнению с redux?)
- выборка данных перед выполнением переходов маршрута (почему это не может быть достигнуто в facebook flux? Что преимущества?)
- горячая перезагрузка (С React Hot Reload. Зачем нужен баланс?)
- функция отмены/повтора
- есть еще вопросы? Как упорствующее состояние...
7 ответов:
Redux автор здесь!
Redux не это отличается от флюса. В целом он имеет ту же архитектуру, но Redux может сократить некоторые углы сложности, используя функциональную композицию, где Flux использует регистрацию обратного вызова.
нет принципиальной разницы в Redux, но я считаю, что это делает некоторые абстракции проще или, по крайней мере, возможно реализовать, что было бы трудно или невозможно реализовать в потоке.
редуктор Композиция
Возьмем, к примеру, разбиение на страницы. Мой Flux + React пример маршрутизатора обрабатывает разбиение на страницы, но код для этого ужасен. Одна из причин, почему это ужасно, что флюс делает его неестественным для повторного использования функциональности в разных магазинах. если два магазина должны обрабатывать разбиение на страницы в ответ на различные действия, они либо должны наследовать от общего базового магазина (плохо! вы блокируете себя в определенном дизайне при использовании наследования), или вызовите функция от обработчика, которая должна будет каким-то образом работать с частным состоянием хранилища Flux. Все это грязно (хотя определенно в области возможного).
С другой стороны, с разбиением на страницы Redux естественные спасибо состав редуктора. Это редукторы полностью вниз, так что вы можете написать редуктор завод, который генерирует разбиение на страницы редукторы а то используйте его в вашем дереве редуктора. Ключ к тому, почему это так просто, потому что in Flux, магазины плоские, но в Redux редукторы могут быть вложены через функциональную композицию, точно так же, как компоненты React могут быть вложены.
этот шаблон также позволяет замечательные функции, такие как no-user-code отмена/повтор. можете ли вы представить себе подключение отмены/повтора в приложение Flux, являющееся двумя строками кода? Едва. С возвращением, это-снова, спасибо картина состава редуктора. Мне нужно подчеркнуть, что в этом нет ничего нового-это образец, впервые созданный и подробно описано в Архитектура Вяз который сам был под влиянием потока.
Сервер Рендеринга
люди хорошо рендерили на сервере с Flux, но, видя, что у нас есть 20 библиотек Flux, каждая из которых пытается сделать рендеринг сервера "проще", возможно, Flux имеет некоторые шероховатости на сервере. Правда в том, что Facebook не делает много рендеринга сервера, поэтому они не очень обеспокоены этим и полагаются на экосистему, чтобы сделать это облегчающий.
в традиционном потоке магазины являются синглетами. Это означает, что трудно разделить данные для разных запросов на сервере. Не невозможно, но трудно. Вот почему большинство библиотек Flux (а также новый Flux Utils) теперь предлагаем вам использовать классы вместо синглетов, так что вы можете создавать экземпляры магазинов по запросу.
есть еще следующие проблемы, которые вам нужно решить в потоке (либо самостоятельно, либо с помощью вашего любимого потока библиотека, например Flummox или Alt):
- если магазины являются классами, как мне создать и уничтожить их с диспетчером по запросу? Когда я регистрирую магазины?
- как мне увлажнить данные из магазинов, а затем повторно увлажнить их на клиенте? Нужно ли для этого внедрять специальные методы?
по общему признанию, фреймворки Flux (не vanilla Flux) имеют решения этих проблем, но я нахожу их чрезмерно сложными. Например, Flummox просит вас осуществить
serialize()
иdeserialize()
в магазинах. Alt решает это лучше, предоставляяtakeSnapshot()
это автоматически сериализует ваше состояние в дереве JSON.Redux просто идет дальше:поскольку существует только один магазин (управляемый многими редукторами), вам не нужен специальный API для управления (re)гидратацией. вам не нужно "промывать" или "увлажнять" магазины-есть только один магазин, и вы можете прочитать его текущее состояние или создание нового хранилища с новым состоянием. Каждый запрос получает отдельный экземпляр хранилища. подробнее о рендеринге сервера с помощью Redux.
опять же, это случай чего-то возможного как в Flux, так и в Redux, но библиотеки Flux решают эту проблему, вводя тонну API и соглашений, и Redux даже не должен ее решать, потому что у него нет этой проблемы в первую очередь благодаря концептуальной простоте.
разработчику Опыт
Я на самом деле не намеревался Redux стать популярной библиотекой Flux-я написал ее, когда работал над своим ReactEurope говорить о горячей перезагрузки с путешествием во времени. У меня была одна главная цель: позволяют менять редуктор код "на лету" или даже "изменить прошлое", вычеркнув действия, и происходит пересчет.
Я не видел ни одной библиотеки Flux, которая способна это сделать. Горячее Реагировать Загрузчик также не позволяет вам это делать-на самом деле он ломается, если вы редактируете магазины Flux, потому что он не знает, что с ними делать.
когда Redux нужно перезагрузить код редуктора, он вызывает
replaceReducer()
, и приложение работает с новым кодом. В Flux данные и функции запутываются в хранилищах Flux, поэтому вы не можете "просто заменить функции". Более того, вам придется как-то перерегистрировать новые версии с диспетчером-что-то Redux даже не делает иметь.экосистема
Redux имеет богатая и быстрорастущая экосистема. Это связано с тем, что он предоставляет несколько точек расширения, таких как middleware. Он был разработан с использованием таких случаев, как лесозаготовки поддержка обещания,параметры,маршрут,неизменяемость dev проверяет,настойчивость и т. д., В виду. Не все из них оказываются полезно, но приятно иметь доступ к набору инструментов, которые можно легко комбинировать для совместной работы.
простота
Redux сохраняет все преимущества Flux (запись и воспроизведение действий, однонаправленный поток данных, зависимые мутации) и добавляет новые преимущества (легко отменить-повторить, горячая перезагрузка) без введения диспетчера и регистрации магазина.
сохранение его простым важно, потому что он держит вас в здравом уме, пока вы реализуете более высокий уровень абстракции.
В отличие от большинства библиотек Flux, поверхность API Redux крошечная. Если вы удалите предупреждения разработчика, комментарии и проверки здравомыслия, это 99 строк. Нет никакого сложного асинхронного кода для отладки.
вы можете на самом деле прочитать его и понять все Redux.
см. также мой ответ на недостатки использования Redux по сравнению с Flux.
во-первых, вполне можно писать приложения с реагировать без Поток.
кроме этого визуальные схемы который я создал показать быстрый просмотр обоих, вероятно, быстрый ответ для людей, которые не хотят читать все объяснение:
но если вам все еще интересно узнать больше, читайте дальше.
Я считаю, что вы должны начать с чистого реагировать, а затем узнать Redux и Flux. После того, как вы будете иметь некоторый реальный опыт работы с React, вы увидите является ли Redux полезным для вас или нет.
может быть, вы почувствуете, что Redux именно для вашего приложения и, возможно, вы выяснится, что Redux пытается решить проблему, которой вы не являетесь действительно переживаю.
если вы начинаете непосредственно с Redux, вы можете в конечном итоге с чрезмерной инженерии код, код труднее поддерживать и с еще большим количеством багов и чем без Возвращение.
С Redux docs:
мотивация
поскольку требования к одностраничным приложениям JavaScript становятся все более сложными, наши код должен управлять более чем когда-либо прежде. Это состояние может включать в себя ответы сервера и кэшированные данные, а также локально созданные данные, которые еще не был сохранен на сервере. Состояние пользовательского интерфейса также увеличивается в сложность, так как нам нужно управлять активными маршрутами, выбранными вкладками, блесны, элементы управления разбиением на страницы и так далее.управлять этим постоянно меняющимся состоянием трудно. Если модель можно обновить другая модель, затем представление может обновить модель, которая обновляет другую модель, а это, в свою очередь, может привести к обновлению другого представления. У некоторых момент, Вы перестали понимать, что происходит в вашем приложении, как у вас потерял контроль над тем, когда, почему и как его состояние. Когда система непрозрачен и недетерминированный, трудно воспроизвести ошибки или добавить новые средства.
как будто это не было достаточно плохо, рассмотрим новые требования становятся общее в разработке продукта переднего плана. Как разработчики, мы ожидается, что он будет обрабатывать оптимистичные обновления, рендеринг на стороне сервера, выборку данные перед выполнением переходов маршрута и так далее. Мы находим себя попытка управлять сложностью, с которой нам никогда не приходилось иметь дело раньше и мы неизбежно задаемся вопросом: не пора ли сдаться? Этот ответа нет.
эта сложность трудно обрабатывать, поскольку мы смешиваем две концепции это очень трудно для человеческого разума рассуждать о: мутации и асинхронность. Я называю их Ментос и кокаин. Оба могут быть большими, когда разделены, но вместе они создают беспорядок. Библиотеки, как реагировать попытайтесь решить эту проблему в слое представления, удалив оба асинхронность и прямая манипуляция DOM. Однако, управляя состоянием ваши данные остаются на ваше усмотрение. Это где, я полагаю, придет.
следуя по стопам Flux, CQRS и Event Sourcing, Redux попытки сделать государственные мутации предсказуемыми путем навязывания определенных ограничения на то, как и когда обновления могут произойти. Это ограничение отражены в трех принципах "возвращение".
и с Redux docs:
Основные Понятия
Redux сам по себе очень прост.представьте себе состояние вашего приложения описывается как простой объект. Например, состояние приложения todo может выглядеть следующим образом:
{ todos: [{ text: 'Eat food', completed: true }, { text: 'Exercise', completed: false }], visibilityFilter: 'SHOW_COMPLETED' }
этот объект похож на" модель", за исключением того, что нет сеттеров. Этот это так, что разные части кода не могут изменить состояние произвольно, вызывая трудновоспроизводимые ошибки.
чтобы изменить что-то в состоянии, вам нужно отправить действие. Один действие-это простой объект JavaScript (обратите внимание, как мы его не вводим магия?) что описывает, что произошло. Вот несколько примеров действий:
{ type: 'ADD_TODO', text: 'Go to swimming pool' } { type: 'TOGGLE_TODO', index: 1 } { type: 'SET_VISIBILITY_FILTER', filter: 'SHOW_ALL' }
обеспечение того, чтобы каждое изменение описывалось как действие, позволяет нам иметь четкое понимание того, что происходит в приложении. Если что-то изменился, мы знаем, почему он изменился. Действия как крошки, что случилось. Наконец, чтобы связать состояние и действия вместе, мы пишем функция называется редуктором. Опять же, ничего волшебного в этом - это просто функция, которая принимает состояние и действие в качестве аргументов, и возвращает значение следующее состояние приложения. Трудно было бы написать такую функцию большое приложение, поэтому мы пишем меньшие функции управления частями государства:
function visibilityFilter(state = 'SHOW_ALL', action) { if (action.type === 'SET_VISIBILITY_FILTER') { return action.filter; } else { return state; } } function todos(state = [], action) { switch (action.type) { case 'ADD_TODO': return state.concat([{ text: action.text, completed: false }]); case 'TOGGLE_TODO': return state.map((todo, index) => action.index === index ? { text: todo.text, completed: !todo.completed } : todo ) default: return state; } }
и мы пишем еще один редуктор, который управляет всем нашим приложение, вызывая эти два редуктора для соответствующих ключей состояния:
function todoApp(state = {}, action) { return { todos: todos(state.todos, action), visibilityFilter: visibilityFilter(state.visibilityFilter, action) }; }
это в основном вся идея Redux. Обратите внимание, что мы не использовали любые API-интерфейсы Redux. Он поставляется с несколькими утилитами, чтобы облегчить это шаблон, но основная идея заключается в том, что вы описываете, как ваше государство обновляется с течением времени в ответ на действия объектов и 90% кода вы пишете просто JavaScript, без использования самого Redux, его Апис, или любая магия.
возможно, вам лучше всего начать с чтения этого поста Дэна Абрамова, где он обсуждает различные реализации Flux и их компромиссы в то время, когда он писал redux: эволюция фреймворков потока
во-вторых, эта страница мотивации, на которую вы ссылаетесь, на самом деле не обсуждает мотивы Redux, а мотивы за потоком (и реагируют). Элемент Три Принципа более Редукс специфический хотя все еще не общается с реализация отличается от стандартной архитектуры потока.
в принципе, Flux имеет несколько хранилищ, которые вычисляют изменение состояния в ответ на взаимодействие UI/API с компонентами и транслируют эти изменения как события, на которые могут подписаться компоненты. В Redux существует только одно хранилище, на которое подписывается каждый компонент. IMO он чувствует себя, по крайней мере, как Redux еще больше упрощает и унифицирует поток данных, объединяя (или уменьшая, как сказал бы Redux) поток данных обратно в компоненты-в то время как поток концентрируется на объединении другой стороны потока данных - представление модели.
Я одним из первых пользователей и реализовали средний-большой одностраничное приложение с использованием библиотеки потоков Facebook.
поскольку я немного опоздал к разговору, я просто отмечу, что, несмотря на мои лучшие надежды, Facebook, похоже, считает их реализацию потока доказательством концепции, и она никогда не получала внимания, которого она заслуживает.
Я бы рекомендовал вам поиграть с ним, поскольку он раскрывает больше внутренней работы архитектуры Flux, которая является довольно образовательной, но в то же время он не предоставляет многих преимуществ, которые предоставляют библиотеки, такие как Redux (которые не так важны для небольших проектов, но становятся очень ценными для больших).
мы решили, что двигаясь вперед мы будем двигаться к Redux и я предлагаю вам сделать то же самое;)
вот такое простое объяснение, Я полагаю, за флюса. Redux не имеет a dispatcher.It полагается на чистые функции, называемые редукторами. Для этого не нужен диспетчер. Каждое действие обрабатывается одним или несколькими редукторами для обновления одного хранилища. Поскольку данные неизменяемы, reducers возвращает новое обновленное состояние, которое обновляет хранилище
для получения дополнительной информации http://www.prathapkudupublog.com/2017/04/flux-vs-redux.html
Я довольно долго работал с Flux и теперь довольно долго использую Redux. Как отметил Дэн, обе архитектуры не так уж и отличаются. Дело в том, что Redux делает вещи проще и чище. Он учит вас нескольким вещам на вершине потока. Например, Flux является идеальным примером однонаправленного потока данных. Разделение проблем, где у нас есть данные, его манипуляции и просмотр слоя разделены. В Redux у нас есть то же самое, но мы также узнаем о неизменности и чистоте функции.
помимо технических аргументов, описанных в предыдущих ответах, ИМХО две важные причины:
инструмент: Redux dev tool-это потрясающий инструмент, который делает ваш разработчик / отладчик взрывным (time machine, возможность экспортировать сеанс пользователя и воспроизводить его в локальной среде...).
переполнение стека дружелюбный: "возвращение" получил свыше 51000 результаты на StackOverflow, флюс 9000.