代码之家  ›  专栏  ›  技术社区  ›  Artem Arkhipov user1682140

Redux和状态机(如xState)之间的实际区别是什么?

  •  11
  • Artem Arkhipov user1682140  · 技术社区  · 6 年前

    我正在研究一个中等复杂度的前端应用程序。目前它是用纯JavaScript编写的,它有许多不同的基于事件的消息连接这个应用程序的几个主要部分。

    我们决定,显然,我们需要在进一步重构的范围内为这个应用程序实现某种状态容器。以前我在Redux和NGRx商店(实际上遵循相同的原则)有过一些经验。

    Redux 是我们的一个选择,但是其中一个开发人员提议使用状态机,特别是 xstate library .

    我从来没有用过这个东西,所以我发现它很有趣,开始阅读文档和寻找不同的例子。看起来很有前途,也很强大,但在某种程度上,我理解它和Redux之间并没有明显的区别。

    我花了好几个小时试图找到答案,或者与比较xstate和redux相关的任何其他信息,或者一些“优缺点”。不幸的是,我的头被搞得一团糟。除了一些像 "get from redux to a state machine" 或者链接到专注于使用redux和xstate的库 在一起 最后我分手了。

    如果有人能描述这种差异,或者告诉我什么时候开发人员应该选择Xstate——欢迎您。

    谢谢您。

    1 回复  |  直到 6 年前
        1
  •  6
  •   David Khourshid    6 年前

    我创建了Xstate,但我不会告诉您是否要使用其中一个,这取决于您的团队。相反,我会强调一些关键的区别。

    • redux本质上是一个状态容器,其中事件(称为 行动 在redux)中,发送到更新状态的reducer。
    • xstate也是一个状态容器,但它分离有限状态(例如, "loading" , "success" )从“无限状态”或上下文(例如, items: [...] )
    • redux并不规定如何定义reducers。它们是普通函数,返回给定当前状态和事件(操作)的下一个状态。
    • Xstate是一个“规则还原器”—您定义了事件导致的有限状态之间的合法转换,以及在转换中(或从状态进入/退出时)应执行的操作。
    • 重做 有一个内置的方式来处理副作用。有许多社区选项,如ReduxThunk、ReduxSaga等。
    • Xstate使动作(副作用)具有声明性和显式性-它们是 State 在每次转换时返回的对象(当前状态+事件)。
    • Redux目前无法可视化状态之间的转换,因为它无法区分有限状态和无限状态。
    • Xstate有一个可视化工具: https://statecharts.github.io/xstate-viz 这是可行的,因为声明性的性质。
    • Redux Reducers中表示的隐式逻辑/行为不能以声明方式序列化(例如,在JSON中)
    • Xstate的机器定义(表示逻辑/行为)可以序列化为JSON,并从JSON中读取。这使得行为非常可移植,并且可以通过外部工具进行配置。
    • Redux不是严格意义上的状态机。
    • Xstate严格遵守W3C SCXML规范: https://www.w3.org/TR/scxml/
    • Redux依靠开发人员手动防止不可能的状态。
    • Xstate使用状态图来自然地定义处理事件的边界,这可以防止不可能的状态,并且可以进行静态分析。
    • Redux鼓励使用单个“全局”原子存储。
    • Xstate鼓励使用类似于actor模型的方法,在这种方法中,可以有许多层次结构的statechart/“服务”实例彼此通信。

    本周我将为这些文档添加更多的关键差异。