Estoy trabajando en la investigación de una aplicación front-end de complejidad media. En este momento está escrito en javascript puro, tiene muchos mensajes diferentes basados en eventos que conectan algunas partes principales de esta aplicación.
Decidimos que necesitamos implementar algún tipo de contenedor de estado para esta aplicación en el ámbito de una mayor refactorización. Anteriormente tenía algo de experiencia con redux y ngrx store (que en realidad sigue los mismos principios).
Redux es una opción para nosotros, pero uno de los desarrolladores propuso usar una biblioteca basada en máquina de estado, en particular la biblioteca xstate .
Nunca he trabajado con xstate, así que lo encontré interesante y comencé a leer documentación y buscar diferentes ejemplos. Parecía prometedor y poderoso, pero en algún momento entendí que no veo ninguna diferencia significativa entre él y redux.
Pasé horas tratando de encontrar una respuesta, o cualquier otra información comparando xstate y redux. No encontré ninguna información clara, excepto algunos artículos como "get from redux to a state machine" , o enlaces a bibliotecas enfocadas en usar redux y xstate juntos (bastante extraño).
Si alguien puede describir la diferencia o decirme cuándo los desarrolladores deben elegir xstate, puede hacerlo.
fuente
Respuestas:
Creé XState, pero no voy a decirles si usar uno sobre el otro; eso depende de tu equipo. En cambio, intentaré resaltar algunas diferencias clave.
"loading"
,"success"
) de "estado infinito", o el contexto (por ejemplo,items: [...]
).State
objeto que se devuelve en cada transición (estado actual + evento).Agregaré más diferencias clave a los documentos esta semana.
fuente
La máquina de estado no le dice (obliga) a tener un flujo de datos unidireccional. No tiene nada que ver con el flujo de datos. Se trata más de limitar los cambios de estado y de las transiciones de estado . Por lo tanto, generalmente solo algunas partes de la aplicación se diseñarían con máquinas de estado, solo y solo si necesita restringir / prohibir algunos cambios de estado y está interesado en las transiciones.
Tenga en cuenta que con las máquinas de estado, si por alguna razón (dependencia de API externa, etc.), existe la posibilidad de que la aplicación se bloquee en un estado en el que no pueda pasar a otro estado debido a restricciones, debe resolverlo.
Pero si solo está interesado en el estado de la última aplicación, en lugar de las transiciones de estado , y las restricciones de estado no importan, entonces es mejor que no use la máquina de estado y actualice directamente el estado en sí ( aún puede ajustar el estado en una actualización de clase Singleton a través de Clases de acción ).
Por otro lado, Redux es un marco de arquitectura unidireccional . Las arquitecturas unidireccionales le obligan a tener una sola dirección de flujo de datos. En Redux, comienza con
User->View->(Action)->Store->Reducer->(Middleware)->Store->(State)->View
. Al igual que State Machines, puede desencadenar efectos secundarios con Middlewares en Redux. Puede restringir / prohibir las transiciones de estado, si lo desea. A diferencia de State Machine , Redux fuerza un flujo de datos unidireccional, ¡ puro ! funciones reductoras, objetos de estado inmutables, estado de aplicación única observable.fuente