Redux作者在这里!
Redux 与Flux 没有什么不同。总体而言,它具有相同的架构,但是Redux可以通过使用Flux使用回调注册的功能组合来减少一些复杂性。
Redux并没有根本的区别,但是我发现它使某些抽象更容易实现,或者至少可以实现,这在Flux中很难或不可能实现。
减速机组成
以分页为例。我的Flux + React Router示例处理分页,但是该代码很糟糕。令人恐惧的原因之一是Flux使跨商店重用功能变得不自然。如果两个商店需要处理分页以响应不同的操作,那么它们要么需要从一个公共基础商店继承(不好!当您使用继承时,您将自己锁定在一个特定的设计中),或者从内部商店中调用一个外部定义的函数。事件处理程序,需要以某种方式在Flux商店的私有状态下进行操作。整个过程都是混乱的(尽管绝对是可能的)。
另一方面,由于Redux的组成,Redux分页很自然。它一直是reducer的源头,因此您可以编写一个reducer工厂来生成分页减少器,然后在您的reducer树中使用它。之所以如此简单,关键是因为在Flux中存储是平坦的,但是在Redux中,reduce可以通过功能组合来嵌套,就像React组件可以嵌套一样。
此模式还启用了诸如无用户代码undo / redo之类的出色功能。您能想象两行代码将撤消/重做插入Flux应用程序吗?几乎不。再次使用Redux,这归功于reducer的组成模式。我需要强调一点,这没有什么新鲜的-这是Elm Architecture所开创和详细描述的模式,它本身受Flux的影响。
服务器渲染
人们一直在使用Flux在服务器上进行渲染,但是看到我们有20个Flux库,每个库都试图使服务器渲染“更轻松”,也许Flux在服务器上有一些粗糙的边缘。事实是,Facebook并没有做太多的服务器渲染,因此他们并不是很在意它,而是依靠生态系统来简化它。
在传统的Flux中,商店是单身人士。这意味着很难为服务器上的不同请求分离数据。不是没有,但是很难。这就是为什么大多数Flux库(以及新的Flux Utils)现在建议您使用类而不是单例的原因,因此您可以根据请求实例化存储。
在Flux中,仍然需要解决以下问题(您自己或在您喜欢的Flux库(例如Flummox或Alt)的帮助下):
- 如果商店是类,那么如何根据请求使用分派器创建和销毁它们?我什么时候注册商店?
- 如何合并来自商店的数据,然后在客户端重新补充数据?为此,我需要实现特殊方法吗?
诚然,Flux框架(不是普通的Flux)可以解决这些问题,但我发现它们过于复杂。例如,Flummox要求您在商店中实施serialize()
和deserialize()
。Alt通过提供takeSnapshot()
自动序列化JSON树中的状态来更好地解决这一问题。
Redux走得更远:由于只有一个商店(由许多reducers管理),因此您不需要任何特殊的API来管理(重新)水化。您无需“冲洗”或“充水”商店-仅有一个商店,您可以读取其当前状态,或创建具有新状态的新商店。每个请求都获得一个单独的商店实例。了解有关使用Redux进行服务器渲染的更多信息。
同样,在Flux和Redux中都有可能发生这种情况,但是Flux库通过引入大量API和约定来解决此问题,而Redux甚至不必解决它,因为在由于概念上的简单性而获得了第一名。
开发人员经验
实际上,我并没有打算让Redux成为流行的Flux库,而是在我撰写关于ReactEurope的关于时光热装的ReactEurope演讲时写的。我有一个主要目标:可以即时更改减速器代码,甚至可以通过取消操作来“更改过去”,并查看状态是否正在重新计算。
我还没有看到能够执行此操作的单个Flux库。React Hot Loader也不允许您这样做-实际上,如果您编辑Flux商店,它会中断,因为它不知道如何处理它们。
当Redux需要重新加载化简器代码时,它将调用replaceReducer()
,并且应用程序将使用新代码运行。在Flux中,数据和功能在Flux存储中纠缠在一起,因此您不能“仅替换功能”。此外,您还必须以某种方式向Dispatcher重新注册新版本,而Redux甚至没有。
生态系统
Redux具有丰富且快速增长的生态系统。这是因为它提供了一些扩展点,例如中间件。它的设计考虑到了用例,例如日志记录,对Promises的支持,Observables,路由,不变性开发检查,持久性等。并非所有这些工具都将有用,但是很高兴能够使用一组可以轻松组合在一起一起工作的工具。
简单
Redux保留了Flux的所有好处(动作的记录和重放,单向数据流,相关的变异),并增加了新的好处(轻松的撤消重做,热重装),而无需引入Dispatcher和商店注册。
保持简单很重要,因为在实现更高级别的抽象时,它可以使您保持理智。
与大多数Flux库不同,Redux API表面很小。如果您删除了开发人员警告,评论和健全性检查,那么这是99行。没有棘手的异步代码可调试。
您实际上可以阅读它并了解Redux的全部内容。
另请参阅我对使用Redux与Flux相比的缺点的回答。