Я работаю над исследованием одного клиентского приложения средней сложности. На данный момент он написан на чистом javascript, в нем много различных событийно-ориентированных сообщений, соединяющих несколько основных частей этого приложения.
Мы решили, что нам нужно реализовать какой-то контейнер состояний для этого приложения в рамках дальнейшего рефакторинга. Раньше у меня был некоторый опыт работы с redux и ngrx store (которые фактически следуют тем же принципам).
Redux - это вариант для нас, но один из разработчиков предложил использовать библиотеку на основе конечного автомата, в частности конечного библиотеку xstate .
Я никогда не работал с xstate, поэтому мне это показалось интересным, и я начал читать документацию и рассматривать разные примеры. Выглядело многообещающе и мощно, но в какой-то момент я понял, что не вижу существенной разницы между ним и redux.
Я часами пытался найти ответ или любую другую информацию, сравнивая xstate и redux. Я не нашел какой - либо четкой информации, за исключением некоторых статей , как «получить от Redux к государственной машине» , или ссылки на библиотеки сосредоточены на использовании Redux и xstate вместе (довольно странно).
Если кто-то может описать разницу или сказать мне, когда разработчикам следует выбрать xstate - добро пожаловать.
источник
Ответы:
Я создал XState, но я не собираюсь сообщать вам, использовать ли одно вместо другого; это зависит от вашей команды. Вместо этого я попытаюсь выделить некоторые ключевые отличия.
"loading"
,"success"
) от «бесконечного состояния» или контекста (например,items: [...]
).State
объекта, который возвращается при каждом переходе (текущее состояние + событие).На этой неделе я добавлю в документы больше ключевых отличий.
источник
Конечный автомат не сообщает (заставляет) вас иметь однонаправленный поток данных. Это не имеет ничего общего с потоком данных. Это больше о сдерживающем изменении состояния и о переходах состояний . Итак, как правило, только некоторые части приложения могут быть разработаны с использованием конечных автоматов, только и только в том случае, если вам нужно ограничить / запретить некоторые изменения состояния и вы заинтересованы в переходах.
Помните, что с конечными автоматами, если по какой-либо причине (зависимость внешнего API и т. Д.) Есть вероятность, что приложение может быть заблокировано в состоянии, когда оно не может перейти в другое состояние из-за ограничений, вы должны решить эту проблему.
Но если вас интересует только последнее состояние приложения, а не переходы состояний , а ограничения состояния не имеют значения, тогда вам лучше не использовать конечный автомат и напрямую обновлять само состояние ( вы все равно можете обернуть состояние в обновлении класса Singleton через Классы действий ).
С другой стороны, Redux - это фреймворк однонаправленной архитектуры . Однонаправленные архитектуры заставляют вас иметь единственное направление потока данных. В Redux все начинается с
User->View->(Action)->Store->Reducer->(Middleware)->Store->(State)->View
. Как и State Machines, вы можете вызывать побочные эффекты с помощью промежуточного программного обеспечения в Redux. Вы можете ограничить / запретить переходы между состояниями, если хотите. В отличие от State Machine , Redux обеспечивает однонаправленный поток данных, в чистом виде ! функции редуктора, неизменяемые объекты состояния, единое наблюдаемое состояние приложения.источник