В чем разница в подходах Redux и Vuex?
========================================

 После Vue + Vuex начал изучать React + Redux и основное, что бросается в глаза это иммутабельность состояния в Redux. То есть все эти трюки в редьюcерах чтобы вернуть новый объект (например добавление элемента в todo):  

```
return {
   ...state,
    tasks: {
       ...state.tasks,
        {id: uuid(),  task_text: 'some_text'}
   }
}
```
  

Я как бы понимаю, что redux не делает deep-search в объекте для экономии ресурсов и ему нужно явно знать, что объект новый.  

Но в то же время в Vuex, состояние можно менять простым присваиванием и кажется, что это намного проще, даже в плане написания меньшего объема кода. Возникает вопрос, а где подвох?) То есть в чем профит/недостатки обоих подходов и почему реакт все еще популярен если приходится сложнее делать простые вещи? 

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

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

Это я к тому, что vuex - имплементация flux, а не redux. Поэтому сравнивать ее нужно именно с flux.  
  

А еще вью просто сыроват. Саги там тоже урезанные, в отличие от шикарных реактовских. 

> То есть в чем профит/недостатки обоих подходов и почему реакт все еще популярен если приходится сложнее делать простые вещи?

  

Принцип один - поместить данные в отдельное хранилище и отделить от кучи компонентов, каждый из которых отдельно с ним взаимодействует. Реакт популярен, так как он старичок и на нём уже куча всего написана. И ещё он имеет более низкоуровневый подход в разработке. Меньше абстракций. Во Vue минимум абстракций только для того, чтобы программисту можно было более комфортно работалось + в нём пытались реализовать аналог паттерна MVVM. Модель - JS код, вид - шаблон. Данные перегоняются из модели в вид и обратно путём директив в HTML. Учли пожелания верстальщиков, чтобы править не JSX, а только шаблон. 

> Я как бы понимаю, что redux не делает deep-search в объекте для экономии ресурсов и ему нужно явно знать, что объект новый.

  

Причина иммутабельности не в этом. В реакте идет сильный уклон на функциональное программирование, а иммутабельность это одна из главных вещей в ФП.  
  

> Но в то же время в Vuex, состояние можно менять простым присваиванием и кажется, что это намного проще, даже в плане написания меньшего объема кода. Возникает вопрос, а где подвох?) То есть в чем профит/недостатки обоих подходов и почему реакт все еще популярен если приходится сложнее делать простые вещи? 

  

В Реакте используется подход one-way-data-binding в отличие от большинства остальных, где используется two-way-data-binding. То есть проще говоря в Реакте данные идут сверху вниз и никогда обратно. Иммутальность данных при этом гарантирует, что данные не поменяет какой-нибудь нижлежащий дочерний компонент, тем самым **неявно** повлияв на родительский. Чтобы понять причины почему реакт сделан так, а не иначе, надо почитать про ФП и все станет ясно. 

 На самом деле они ничем не отличаются, там суть одна и та же, есть некая переменная, и в нее записаны данные. Просто у вуе висит магия на всех свойствах объекта, поэтому если ты напрямую изменишь данные, то будет реакция, у реакта это просто объект, поэтому ничо не обновится, нужен конектор, в котором волшебные единороги. У обеих иммутабельность только на бумаге.  

Есть смысл сравнивать redux/vuex vs angular2+(rxjs)/svelte3, потому что первые на магии, а у вторых обычно надо явно подписываться на изменения.  

Вуе делался разрабом и для разрабов как улучшенный клон angularjs, react делался фэйсбуком для своих целей, angular пытались сделать как решение для энтерпрайза, а получилось тяжелое и неуклюжее говно, самый нормальный это svelte3, но когда я на нем апликуху писал, то тогда не было ни роутера под него, ни возможности запускать юнит тесты без хромиума. В общем, на самом деле они все имеют свои проблемы и потрахаться на пустом месте можно с каждым.