RxJS 与 Redux/Mobx 的比较

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/984732b6-7ea7-4ce0-99e0-43352adf4ba8/Untitled.png

社区上常常有人将 RxJS 与 Redux/Mobx 放在同一维度去比较,但其实它们本质上并不是一类工具。 在上一个部分中我们了解到 RxJS 主要是用作异步数据流操作,而我们知道 Redux/Mobx 主要是用作应用状态管理。

诚然,将 RxJS 进行一系列的组合也能构造出具有状态管理功能的工具。但由于 RxJS 中 Observable 与 Subject 的一系列特点,这些工具的 API 往往没有 Redux/Mobx 那样友好和符合直觉。

这就好比拿 Lodash 也可以组合出可以管理状态的工具,但你不能说 Lodash 是做状态管理的。

RxJS 与 Redux/Mobx 的关系可以概括为以下两点:

Redux 与领域驱动设计 (Domain driven design aka DDD)

由于社区上成功的 RxJS 实践大部分在 Redux 社区,而且在我的项目经验中也发现类 Redux 的状态管理系统更契合 RxJS,所以接下来我们主要围绕 Redux 及其派生出来的抽象方法进行探讨,看 RxJS 如何在需要复杂状态管理的应用中发挥作用。

如果你仔细阅读过 Redux 官网的 Redux FAQ: Code Structure 部分,你会发现大部分的文章都建议使用 Domain Style 来组织代码:

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/c49fb16d-2fb8-4a94-b9ee-f770c557ffd3/Untitled.png

这里的 Domain Style 指的就是 DDD 中的 Domain,为了大家快速的了解 DDD 我总结了三个 DDD 的特点:

我们可以看到 DDD 是一种高度抽象的架构设计指导方法,那为什么 Redux 社区都如此推崇 DDD 而不是其它的架构设计方法论呢?这要从 Redux 与 CQRS 的相似点说起。

CQRS

因为篇幅的关系,我们这里并没有讨论 ES(Event sourcing)。但其实 ES 是 DDD CQRS 设计思想中非常重要的一个部分,可以延伸了解以下: https://martinfowler.com/eaaDev/EventSourcing.html