В чем реальная разница между редуксом и конечным автоматом (например, xstate)?

Я работаю над исследованием одного внешнего приложения средней сложности. На данный момент оно написано на чистом javascript, имеет множество различных событийных сообщений, соединяющих несколько основных частей этого приложения.

Мы решили, что нам нужно реализовать какой-то контейнер состояния для этого приложения в рамках дальнейшего рефакторинга. Раньше у меня был некоторый опыт работы с магазином redux и ngrx (который на самом деле следует тем же принципам).

Redux — это вариант для нас, но один из разработчиков предложил использовать библиотеку на основе конечного автомата, в частности библиотека xstate.

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

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

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


person Artem Arkhipov    schedule 01.02.2019    source источник
comment
Официальная документация на самом деле говорит, что вы должны относиться к редьюсерам как к конечной машине redux.js.org/style-guide/   -  person Yannic Hamann    schedule 26.11.2019
comment
Я думаю, что упомянутые вами библиотеки могут быть предназначены для использования xstate в качестве системы управления эффектами (альтернативы thunk, saga, epic и т. д.).   -  person Alfred Young    schedule 02.05.2020


Ответы (3)


Я создал XState, но не буду говорить вам, следует ли использовать одно вместо другого; это зависит от вашей команды. Вместо этого я попытаюсь выделить некоторые ключевые отличия.

На этой неделе я добавлю в документы больше ключевых отличий.

person David Khourshid    schedule 04.02.2019
comment
Наконец-то кто-то использует FSM и SCXML для фронтальной разработки... чувак, ты спас мне жизнь, я собираюсь изучить твою библиотеку. Мне не нравится избыточность по некоторым причинам (во-первых, она путает термины событий и действий), а во-вторых, моделирует сложные состояния с миллионами флагов (многословные и имхо неправильные). - person Carlos Verdes; 12.11.2019
comment
@Mike76 XState интегрируется с инструментами разработки Redux. - person David Khourshid; 09.04.2020
comment
Спасибо за подсказку, я посмотрю на это. - person Mike76; 09.04.2020
comment
Сейчас я попробовал XState + Redux DevTools. Он работает довольно хорошо, но некоторые функции, кажется, отсутствуют. Например, XState + Redux DevTools не поддерживает такие функции, как воспроизведение состояния, при котором воспроизводится последовательность предыдущих состояний. Это связано с ограничениями реализации? - person Mike76; 10.04.2020

Конечный автомат не говорит (не заставляет) использовать однонаправленный поток данных. Это не имеет ничего общего с потоком данных. Это больше касается ограничения изменений состояния и переходов между состояниями. Таким образом, как правило, только некоторые части приложения будут разрабатываться с конечными автоматами, и только если вам нужно ограничить/запретить некоторые изменения состояния и вы заинтересованы в переходах.

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

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


С другой стороны, Redux — это фреймворк однонаправленной архитектуры. Однонаправленные архитектуры заставляют вас иметь одно направление потока данных. В Redux он начинается с User->View->(Action)->Store->Reducer->(Middleware)->Store->(State)->View. Как и в случае с конечными автоматами, вы можете запускать побочные эффекты с помощью ПО промежуточного слоя в Redux. Вы можете ограничить/запретить переходы между состояниями, если хотите. В отличие от конечного автомата, Redux обеспечивает однонаправленный поток данных, чистый! функции редуктора, неизменяемые объекты состояния, одно наблюдаемое состояние приложения.

person Jemshit Iskenderov    schedule 26.06.2019
comment
Разве FSM не просто граф, который может управлять Redux? Навигация — это FSM, потому что у вас есть кнопка «Назад». Если вы не отключите кнопку «Назад», даже в Redux у вас есть FSM. Redux — это неизменяемый шаблон данных с хорошими ограничениями. Таким образом, когда вы перемещаетесь по FSM (библиотеке или самостоятельно написанному, даже если непреднамеренному), Redux предотвращает побочные эффекты. Redux захватывает только однонаправленную часть потока данных. Это не чисто. - person TamusJRoyce; 16.02.2021

несколько моих пунктов ниже.

  • Состояние пользовательского интерфейса и состояние бизнеса/бэкенда объединены в Redux. Из-за этого каждое обновление пользовательского интерфейса или бизнес-состояния создает обновление данных в хранилище избыточности.
  • Xstate разделяет состояние пользовательского интерфейса и состояние серверной части.
  • В редуксе все узлы присутствуют внутри корневого узла. Xstate децентрализует и распределяет данные внутри независимых механизмов.
  • Приложение может переходить только между уже определенными состояниями. Таким образом, любая ошибка или ошибка может быть исправлена ​​в самом движке.
  • Внутренние состояния управляются самим движком в Xstate. Redux представляет новые состояния в виде флагов.
  • Агонизм рендерера — сохранение как можно большей части состояния в машинах, и, если нам нужно, мы можем относительно легко переключать фреймворки рендеринга (например, с react на vue).
  • Contexts предоставляет конкретный класс для представления единого интерфейса для внешнего мира.
person Vijay122    schedule 14.06.2021