Мотивация
Поскольку требования к одностраничным приложениям JavaScript становятся всё сложнее, нашему коду необходимо управлять всё большим количеством состояния. Это состояние может включать ответы сервера и кэшированные данные, а также локально созданные данные, которые ещё не были сохранены на сервере. Состояние пользовательского интерфейса также усложняется, так как нам нужно управлять активными маршрутами, выбранными вкладками, спиннерами, элементами пагинации и так далее.
Управление этим постоянно меняющимся состоянием сложно. Если одна модель может обновлять другую модель, то представление может обновлять модель, которая обновляет другую модель, и это, в свою очередь, может привести к обновлению другого представления. В какой-то момент вы больше не понимаете, что происходит в вашем приложении, так как вы потеряли контроль над тем, когда, почему и как изменяется его состояние. Когда система непрозрачна и не имеет детерминированного поведения, трудно воспроизвести ошибки или добавить новые функции.
Как будто этого недостаточно, рассмотрите новые требования, которые стали распространёнными при разработке front-end продуктов. Как разработчики, мы должны обрабатывать оптимистичные обновления, рендеринг на стороне сервера, загрузку данных перед переходом по маршрутам и так далее. Мы пытаемся управлять сложностью, с которой раньше не сталкивались, и неизбежно задаём вопрос: пора ли сдаваться? Ответ — нет.
Эта сложность трудно преодолеть, так как мы смешиваем два понятия, которые очень трудно для человеческого разума осмыслить: мутацию и асинхронность. Я называю их Ментос и Кока-Кола. Оба могут быть эффективными по отдельности, но вместе они создают беспорядок. Библиотеки, такие как React, пытаются решить эту проблему на уровне представления, удаляя как асинхронность, так и непосредственное взаимодействие с DOM. Однако управление состоянием данных остается на вас. Именно здесь вступает Redux.
Следуя Flux, CQRS и Event Sourcing, Redux пытается сделать мутации состояния предсказуемыми, накладывая определённые ограничения на то, как и когда могут происходить обновления. Эти ограничения отражены в трёх принципах Redux.
© 2015–2017 Dan Abramov
Licensed under the MIT License.
http://redux.js.org/docs/introduction/Motivation.html