@H_502_1@原文:The Problems with Redux: Can React,MobX,and Realm save us?
@H_502_1@作者:Erich Reich
@H_
502_1@首先,我不讨厌 Redux。它是由一个 @L_
301_1@ 开发的,用来缓解在单
页面应用中管理状态的问题。而且,确实
解决了这个问题。你可以使用 Redux 将状态从高层的 store 连接到每个组件,只 map 该组件需要用到的状态。
@H_
502_1@在本文中,我想
分享我们为客户创建移动应用的一些经验。在 Quantum Mob,我们主要的 webapps 是由React 编写的,而我们的移动技术栈用的是由 React Native。React Native 允许在 Android / iOS 之间共享大部分
代码,并且从产品的网页版本重用
代码变得更容易,因为它跟普通的 React 很相似。
Redux 的问题
@H_
502_1@没有一种适合所有场景的完美工具。即使你喜欢某种东西,也要清楚客观地去看待它,特别是那些卖力宣传的东西。你使用它只是因为这很酷,还是因为它是最正确的选择?如果一个东西要求得太多,那么它的宣传根本对不起其本身的价值。
@H_
502_1@不用怀疑我的话,Dan Abramov
以作者身份写了关于他对 Redux 的看法,试图让人们停下来考虑,Redux 是否真正适合你的项目。
如果你在用 “Redux 方式” 做事的时候感到压力,这表明你或你的团队可能过于看重它了。这只是你们工具箱中的一个工具,一个疯狂的实验。
@H_502_1@-Dan Abramov
@H_
502_1@随着 npm,Node 以及构建工具(grunt,gulp,webpack ...)的出现,在每个项目中需要使用的库和框架在呈爆炸式增长。
@H_
502_1@你的项目需要处理日期吗?为什么不使用
MomentJs?你要处理数组吗?再
加上像
lodash 或
Ramda。如果你不使用
Babel 和
Axios,以及一个好的 CSS 框架,我不能想象那将会怎样。必须确保编译你的同构应用,即使这只是个 Hello World 应用。
问题一:学习曲线
@H_
502_1@Redux 引入一些概念,你需要花时间去学习它们。将需要翻阅文档并浏览教程,因为不只是简单
调用保存,然后再
获取数据那么简单。
问题二:配置
@H_
502_1@要使用 Redux 的话,需要设计好 store,创建多个 reducer 并将其组合在一起。然后,使用
connect 或者其他什么,为每个需要跟 store 交互的组件配置
mapStateToProps
和
mapDispatchToProps
。
问题三:“最佳实践”
@H_
502_1@对于每个组件,都有一个用于 JavaScript 的
文件,一个用于样式的
文件,另一个用于 JSX。Redux 将这些东西与 action 和 reducer
文件相结合,另一个将其全部整合在一起。确实这样很 Redux,但如果你只想某个地方使用怎么办?对于简单的例子,引入像 Redux 这样强大的工具其实是过度工程的。
备选方案
局部状态(local state)
@H_
502_1@Redux 的另一种替代
方法是保持简单,使用组件的局部状态。意思是保持最开始时候简单的架构就好,只有在需要时才
添加 redux。容易吧?
@H_
502_1@以下是
Dan 的一个
很好的例子,说明如何将一个简单的计数器在不使用 Redux 的情况重构为 Redux 风格的。看看他的
文章,写得很好,他是这个话题的权威。
MobX
@H_
502_1@MobX 比 Redux 更新,现在肯定有很多讨论。MobX 承诺的是提供 Redux 的所有
功能,但是更少的样板
代码。这个缺点当然是微不足道的,不应该期望它与 Redux 具有相同的控制级别。
@H_
502_1@MobX 是如何工作的?你可以创建想要 store 的数据模型作为一个 class,并将使用
@observable
装饰器
添加到 MobX 管理的地方,而不是把重点放在改变和 reduce 的细节上。
@H_
502_1@另一件事是,你的对象不必像 Redux 那样进行归一化处理。这在某些情况下可能是件好事,而在其他情况下也可能是件坏事。例如,有一个很大的数组,在通过它
搜索某个值的时候可能会遇到
性能问题,需要认识到这一点。
@H_
502_1@如果你想
快速了解一下 MobX,可以从这个与 Redux 比较的4分钟的视频开始。
@H_
502_1@
Youtube 上的视频:Understanding MobX vs Redux
@H_
502_1@如果你喜欢 MobX 官方的说法,请查看他们的
“十分钟介绍”。如果希望看到一个更客观的观点,这里有一个开发者使用 MobX
示例 。
为 React Native 设计的 Realm
@H_
502_1@
Realm 是 React 世界的另一个新增
内容,但目前仅适用于 React Native。如果你正在制作移动应用,那绝对值得一看。除了存储和管理你的域数据之外,Realm 还
增加了数个与服务器同步的数据,离线
支持和加密
功能。
@H_
502_1@为了帮助了解使用 Realm 的理由,他们提出了一个可以
快速开始的真实世界的例子。移动应用程序通常执行多次
搜索,从而本地存储数据,以避免额外
调用影响
性能,并提供更好的
用户体验。
@H_
502_1@
Youtube 上的视频:Realm
@H_
502_1@应该将 Realm 视为直接集成到应用程序中的一个
数据库。能够提供很好的速度,因为处理的对象引用与
数据库具有相同的引用,并将其保存到本地存储,因此任何更改或
搜索都不会被序列化或发送到任何地方。
结论
@H_
502_1@没有任何工具对于每一种情况都是完美的,并不建议彻底放弃 Redux。Redux 很棒,但随之而来的是创建附加的样板
代码。这将导致最后期限延长,并且留下更多需要我们维护的
代码。
@H_
502_1@在某些组件上使用局部状态是很合适的,如果复杂性发生变化,也可以很容易地使用 Redux 重构。
@H_
502_1@虽然 MobX 和 Realm 不是作为状态容器而设计的,但它们可以轻松管理大部分数据。强烈建议试试这两个库,看看它们是否适合你的项目。