Estou trabalhando na investigação de um aplicativo front-end de complexidade média. No momento, ele está escrito em javascript puro, e possui várias mensagens diferentes baseadas em eventos conectando algumas partes principais deste aplicativo.
Decidimos que precisamos implementar algum tipo de contêiner de estado para este aplicativo no escopo de refatoração adicional. Anteriormente, tive alguma experiência com redux e ngrx store (que na verdade segue os mesmos princípios).
Redux é uma opção para nós, mas um dos desenvolvedores propôs usar uma biblioteca baseada em máquina de estado, em particular a biblioteca xstate .
Nunca trabalhei com xstate, então achei interessante e comecei a ler a documentação e a olhar para diferentes exemplos. Parecia promissor e poderoso, mas em algum momento entendi que não vejo nenhuma diferença significativa entre ele e redux.
Passei horas tentando encontrar uma resposta, ou qualquer outra informação comparando xstate e redux. Não encontrei nenhuma informação clara, exceto alguns artigos como "get from redux to a state machine" , ou links para bibliotecas focadas em usar redux e xstate juntos (bastante estranho).
Se alguém puder descrever a diferença ou me dizer quando os desenvolvedores devem escolher o xstate - você é bem-vindo.
fonte
Respostas:
Criei o XState, mas não direi se devo usar um em vez do outro; isso depende da sua equipe. Em vez disso, tentarei destacar algumas diferenças importantes.
"loading"
,"success"
) a partir de "estado infinita", ou de contexto (por exemplo,items: [...]
).State
objeto que é retornado em cada transição (estado atual + evento).Adicionarei mais diferenças importantes aos documentos esta semana.
fonte
A máquina de estado não informa (força) a ter fluxo de dados unidirecional. Não tem nada a ver com fluxo de dados. É mais sobre como restringir as mudanças de estado e sobre as transições de estado . Portanto, geralmente apenas algumas partes do aplicativo seriam projetadas com máquinas de estado, apenas e somente se você precisar restringir / proibir algumas mudanças de estado e estiver interessado nas transições.
Esteja ciente de que com máquinas de estado, se por algum motivo (dependência de API externa etc ...), houver chance do aplicativo travar em um estado em que não pode fazer a transição para outro estado devido a restrições, você terá que resolvê-lo.
Mas se você está interessado apenas no último estado do aplicativo em si, em vez de transições de estado , e as restrições de estado não importam, então é melhor não usar a máquina de estado e atualizar diretamente o estado em si ( você ainda pode agrupar o estado em uma atualização de classe Singleton por meio Aulas de ação ).
Por outro lado, Redux é um framework de arquitetura unidirecional . As arquiteturas unidirecionais impõem que você tenha uma direção única de fluxo de dados. No Redux, ele começa com
User->View->(Action)->Store->Reducer->(Middleware)->Store->(State)->View
. Como State Machines, você pode desencadear efeitos colaterais com Middlewares no Redux. Você pode restringir / proibir as transições de estado, se desejar. Diferente da State Machine , Redux força o fluxo de dados unidirecional, puro ! funções redutoras, objetos de estado imutáveis, estado único de aplicativo observável.fonte