Зачем использовать Redux через Facebook Flux?

Я читал ответ, снижение шаблонный, посмотрел на несколько примеров GitHub и даже попробовал немного переделать (todo apps).

Как я понимаю, официальные redux doc мотивации обеспечить плюсы по сравнению с традиционными архитектурами MVC. Но это не дает ответа на вопрос:

почему вы должны использовать Redux над Facebook Flux?

это только вопрос стили программирования: функциональный vs нефункциональный? Или вопрос в способностях / dev-инструментах, которые следуют из подхода redux? Возможно масштабирование? Или проверка?

я прав, если говорю, что redux-это поток для людей, которые происходят из функциональных языков?

чтобы ответить на этот вопрос, вы можете сравнить сложность реализации мотивационных точек redux на flux vs redux.

вот мотивационные очки от официальные redux doc мотивации:

  1. обработка оптимистичных обновлений (как я понимаю, это вряд ли зависит от 5-й точки. Трудно ли реализовать его в facebook flux?)
  2. рендеринг на сервере (Facebook flux также может это сделать. Любые преимущества по сравнению с redux?)
  3. выборка данных перед выполнением переходов маршрута (почему это не может быть достигнуто в поток facebook? Что льготы?)
  4. горячая перезагрузка (С React Горячая Перезагрузка. Зачем нужен баланс?)
  5. функция отмены/повтора
  6. другие моменты? Например, упорное состояние...

7 ответов


Redux автор здесь!

Redux не это отличается от Flux. В целом он имеет ту же архитектуру, но Redux может сократить некоторые углы сложности, используя функциональную композицию, где Flux использует регистрацию обратного вызова.

в Redux нет принципиальной разницы, но я нахожу, что это облегчает определенные абстракции или, по крайней мере, возможно реализовать, что было бы трудно или невозможно реализовать в Flux.

редуктор Состав

возьмите, например, разбиение на страницы. Мой пример маршрутизатора Flux + React обрабатывает разбиение на страницы, но код для этого ужасен. Одна из причин, почему это ужасно, что Flux делает неестественным повторное использование функций в разных магазинах. если два магазина должны обрабатывать разбиение на страницы в ответ на различные действия, они либо должны наследовать от общего базового магазина (плохо! вы блокируете себя в определенном дизайне при использовании наследования) или вызываете функция от обработчика, который должен будет каким-то образом работать на частном состоянии Flux store. Все это грязно (хотя, безусловно, в области возможного).

С другой стороны, с разбиением на страницы Redux естественные спасибо состав редуктора. Это редукторы полностью вниз, поэтому вы можете написать редуктор фабрику, которая создает пагинацию редукторы а то используйте его в вашем дереве редуктора. Ключ к тому, почему это так легко, потому что in Flux, магазины плоские, но в Redux редукторы могут быть вложены через функциональную композицию, так же как компоненты React могут быть вложены.

этот шаблон также включает замечательные функции, такие как no-user-code отмена/повтор. можете ли вы представить себе подключение отмены / повтора в приложение Flux, являющееся двумя строками кода? Едва. С Redux, это-снова, спасибо картина состава редуктора. Мне нужно подчеркнуть, что в этом нет ничего нового-это образец, впервые и подробно описано в Архитектура Вяз который сам находился под влиянием потока.

Сервер Рендеринга

люди рендеринга на сервере отлично с Flux, но, видя, что у нас есть 20 библиотек Flux каждый пытается сделать рендеринг сервера "проще", возможно, Flux имеет некоторые грубые края на сервере. Правда в том, что Facebook не делает много рендеринга сервера, поэтому они не были очень обеспокоены этим и полагаются на экосистему, чтобы сделать это облегчающий.

в традиционном потоке магазины являются синглетами. Это означает, что трудно разделить данные для разных запросов на сервере. Не невозможно, но трудно. Вот почему большинство библиотек Flux (а также new Flux Utils) теперь предлагаем вам использовать классы вместо синглетов, чтобы вы могли создавать экземпляры магазинов по запросу.

есть еще следующие проблемы, которые вам нужно решить в Flux (либо самостоятельно, либо с помощью вашего любимого потока библиотека, такая как Flummox или Alt):

  • если магазины являются классами, как их создать и уничтожить с помощью диспетчера по запросу? Когда я регистрирую магазины?
  • как мне гидратировать данные из магазинов и позже регидрировать их на клиенте? Нужно ли для этого применять специальные методы?

по общему признанию, фреймворки Flux (не vanilla Flux) имеют решения этих проблем, но я нахожу их чрезмерно сложными. Например, Flummox просит вас осуществить serialize() и deserialize() в магазинах. Alt решает это лучше, предоставляя takeSnapshot() это автоматически сериализует ваше состояние в дереве JSON.

Redux просто идет дальше:поскольку существует только один магазин (управляемый многими редукторами), вам не нужен специальный API для управления гидратацией (re). вам не нужно "смывать" или "увлажнять" магазины-есть только один магазин, и вы можете прочитать его текущее состояние или создание нового хранилища с новым состоянием. Каждый запрос получает отдельный экземпляр store. подробнее о рендеринге сервера с помощью Redux.

опять же, это случай чего-то возможного как в Flux, так и в Redux, но библиотеки Flux решают эту проблему, вводя тонну API и соглашений, и Redux даже не нужно решать ее, потому что у нее нет этой проблемы в первую очередь благодаря концептуальной простоте.

разработчику Опыт

Я на самом деле не намеревался Redux стать популярной библиотекой Flux-я написал ее, когда работал над своим ReactEurope говорить о горячей перезагрузке с путешествием во времени. У меня была одна главная цель:--17-->сделать возможным изменить код редуктора на лету или даже "изменить прошлое", перечеркнув действия, и увидеть состояние пересчитывается.

Я не видел ни одной библиотеки Flux, которая могла бы это сделать. Реагируйте Горячо Loader также не позволяет вам это делать-фактически он ломается, если вы редактируете Flux stores, потому что он не знает, что с ними делать.

когда Redux нужно перезагрузить код редуктора, он вызывает replaceReducer(), и приложение работает с новым кодом. В Flux данные и функции запутываются в хранилищах Flux, поэтому вы не можете"просто заменить функции". Более того, вам придется как-то перерегистрировать новые версии с диспетчером-что-то Redux даже не иметь.

экосистема

Redux имеет богатая и быстрорастущая экосистема. Это связано с тем, что он предоставляет несколько точек расширения, таких как промежуточное. Он был разработан с использованием таких случаев, как лесозаготовки поддержка обещания, параметры, маршрут, неизменяемость dev проверяет, настойчивость и т. д., В виду. Не все из них оказываются полезно, но приятно иметь доступ к набору инструментов, которые можно легко комбинировать для совместной работы.

простота

Redux сохраняет все преимущества Flux (запись и воспроизведение действий, однонаправленный поток данных, зависимые мутации) и добавляет новые преимущества (легко отменить повтор, горячая перезагрузка) без введения диспетчера и регистрации магазина.

держать его простым важно, потому что он держит вас в здравом уме, пока вы реализуете более высокий уровень абстракции.

В отличие от большинства библиотек Flux, поверхность API Redux крошечная. Если вы удалите предупреждения разработчика, комментарии и проверки здравомыслия, это 99 строк. Нет хитрый код async для отладки.

вы можете прочитать его и понять все Redux.


см. также мой ответ на недостатки использования Redux по сравнению с Flux.


в Quora кто-то говорит:

прежде всего, совершенно возможно писать приложения с React без Поток.

кроме этого визуальные схемы который я создал, показывает быстрый просмотр обоих, вероятно, быстрый ответ для людей, которые не хотят читать все объяснение: Flux vs Redux

но если вам все еще интересно узнать больше, читайте дальше.

Я считаю, что вы должны начать с чистой реакции, а затем изучить Redux и Flux. После того, как у вас будет реальный опыт работы с React, вы увидите является ли Redux полезным для вас или нет.

возможно, вы почувствуете, что Redux именно для вашего приложения, и, возможно, вы выяснит, что Redux пытается решить проблему, которую вы не действительно переживает.

если вы начинаете сразу с Редукс, то вы можете закончить вверх с сверх-проектированным код, код сложнее поддерживать и с еще большим количеством ошибок и чем без Возвращение.

С Redux docs:

мотивация
поскольку требования к одностраничным приложениям JavaScript становятся все более сложными, наши код должен управлять более чем когда-либо прежде. Это состояние может включать ответы сервера и кэшированные данные, а также локально созданные данные, которые еще не был сохранен на сервере. Состояние пользовательского интерфейса также увеличивается в сложность, так как нужно управлять активными маршрутами, выбранными вкладками, блесны, элементы управления разбиением на страницы и так далее.

управление этим постоянно меняющимся состоянием трудно. Если модель может обновляться другая модель, затем представление может обновить модель, которая обновляет другую модель, и это, в свою очередь, может привести к обновлению другого представления. В какой-то момент, Вы перестали понимать, что происходит в вашем приложении, как у вас потерял контроль над тем, когда, почему и как его состояние. Когда система непрозрачна и недетерминированный, трудно воспроизвести ошибки или добавить новые средства.

как будто этого было недостаточно, рассмотрите новые требования общее в разработке продуктов front-end. Как разработчики, мы ожидается, ручки оптимистичный обновления, серверный, выборка данные перед выполнением маршрутных переходов и так далее. Мы оказываемся мы пытаемся справиться со сложностью, с которой никогда не сталкивались. и раньше, и мы неизбежно задаем вопрос: не пора ли сдаться? Этот ответа нет.

эта сложность трудно обрабатывать, поскольку мы смешиваем две концепции это очень трудно для человеческого ума рассуждать о: мутации и асинхронность. Я называю их Ментос и кокаин. Оба могут быть большими, когда разделены, но вместе они создают беспорядок. Библиотеки, такие как React попытка решить эту проблему в слое view путем удаления обоих асинхронность и прямая манипуляция DOM. Однако, управление состоянием ваши данные оставлены на ваше усмотрение. Это где, я полагаю, придет.

следуя по стопам Flux, CQRS и источников событий, 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;
  }
}

и мы пишем еще один редуктор, который управляет всем нашим app, вызвав эти два редуктора для соответствующих ключей состояния:

function todoApp(state = {}, action) {
  return {
    todos: todos(state.todos, action),
    visibilityFilter: visibilityFilter(state.visibilityFilter, action)
  };
}

это в основном вся идея Redux. Обратите внимание, что мы не использовали любой Redux APIs. Он поставляется с несколькими утилитами, чтобы облегчить это шаблон, но основная идея заключается в том, что вы описываете, как ваше государство обновляется со временем в ответ на действия объектов и 90% кода вы пишете просто JavaScript, без использования самого Redux, его Апис или любая магия.


возможно, вам лучше всего начать с чтения этого поста Дэна Абрамова, где он обсуждает различные реализации Flux и их компромиссы в то время, когда он писал redux: эволюция фреймворков потока

во-вторых, эта страница мотиваций, на которую вы ссылаетесь, на самом деле не обсуждает мотивации Redux, а мотивации Flux (и React). The Три Принципа более специфичен Redux, хотя все еще не имеет дело с отличия реализации от стандартной архитектуры Flux.

в основном, Flux имеет несколько хранилищ, которые вычисляют изменение состояния в ответ на взаимодействия UI/API с компонентами и транслируют эти изменения как события, на которые компоненты могут подписаться. В Redux существует только одно хранилище, на которое подписывается каждый компонент. ИМО чувствует, что, по крайней мере, Redux еще больше упрощает и унифицирует поток данных, объединяя (или уменьшая, как сказал бы Redux) поток данных обратно в компоненты - в то время как поток концентрируется на объединении другой стороны потока данных-вид на модель.


Я ранний усыновитель и реализовал приложение с одной страницей среднего размера с использованием библиотеки Facebook Flux.

поскольку я немного опаздываю на разговор, я просто отмечу, что, несмотря на мои лучшие надежды, Facebook, похоже, считает их реализацию Flux доказательством концепции, и она никогда не получала внимания, которого заслуживает.

Я бы рекомендовал вам поиграть с ним, поскольку он раскрывает больше внутренней работы архитектуры Flux, которая является довольно образовательной, но в то же время это не дает многих преимуществ, которые предоставляют библиотеки, такие как Redux (которые не так важны для небольших проектов, но становятся очень ценными для больших).

мы решили, что двигаться вперед мы будем двигаться в Redux и я предлагаю вам сделать то же самое ;)


вот простое объяснение Redux над потоком. Redux не имеет диспетчера.Он опирается на чистые функции, называемые редукторами. Ему не нужен диспетчер. Каждое действие обрабатывается одним или несколькими редукторами для обновления одного хранилища. Поскольку данные неизменяемы, reducers возвращает новое обновленное состояние, которое обновляет хранилищеenter image description here

дополнительные сведения http://www.prathapkudupublog.com/2017/04/flux-vs-redux.html


Я довольно долго работал с Flux и теперь довольно долго использую Redux. Как отметил Дэн, обе архитектуры не так уж различны. Дело в том, что Redux делает вещи проще и чище. Это учит вас паре вещей на вершине Flux. Например, Flux является идеальным примером однонаправленного потока данных. Разделение проблем, когда у нас есть данные, его манипуляции и слой представления разделены. В Redux у нас есть то же самое, но мы также узнаем о неизменности и чистоте функции.


помимо технических аргументов, описанных в предыдущих ответах, ИМХО две важные причины:

  • инструмент: Redux dev tool является удивительным инструментом, делает ваш разработчик / отладка опыт взрыва (машина времени, возможность экспортировать сеанс пользователя и воспроизвести его в локальной среде...).

  • Stack overflow friendly: Redux получил более 51000 результатов по stackoverflow, flux 9000.