d*******r 发帖数: 3299 | 1 作者:Jim Liu
链接:https://www.zhihu.com/question/63726609/answer/212357616
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
Redux是基于纯函数的,为了保证它的“纯度”,它的reducer函数必须是严格的 S' =
f(S) 的形态,所以,与其说Redux是“状态管理”库,不如说它是“状态转移管理”库
,因为Redux是无状态的,状态是在你的程序里的,你自己维持状态,它只是给你提供
了一个状态转移的统一方式。这使得它的整个模型看起来是非常干净。
而事实上我们在开发实际项目当中可能有小半(maybe大半)的reducer场景其实应该是
S' = await fAsync(S) 的形态,比方说,我点了一个计数器+1的按钮,在一个美丽的
DEMO里,它就+1了,但放到生产需求里,很可能是要先发起一个Ajax请求,请求OK了再
+1,甚至这时候不是+1,而是直接和服务端同步一个新的值。
但异步的reducer就破坏了它的“纯度”,因为异步是不确定的,先发不一定先至,这
会破坏reducer的“可回放性”,它引以为豪的replay就不成立了,它的基石就崩塌了。
这就注定了它解决不了异步的问题,然后它为了让自己显得很白玉无瑕,死活也不愿意
碰异步那摊子脏东西,什么?你要在reducer里发起一个Ajax请求?对不起这不是我们
的best practice,我们对此嗤之以鼻,你如果真要这么做,那就……做去吧。
于是Redux在解决异步问题上的“残疾”就注定给它擦屁股的库会如雨后春笋一样的涌
现出来,比如其他回答里提到的dva,再比如redux-saga,它们都是勇士,做了redux所
不愿意做的那摊子脏活。
这个过程又引入了新的麻烦,一方面是异步本身带来的复杂度,比如redux-saga里的
every和latest;另一方面是代码写起来的麻烦,比如redux-saga里各种yield,还有可
以堆成山的胶水代码。
所以你觉得redux写起来很麻烦,麻烦就对了,这不是幻觉,因为它为了保证自己的简
洁,把麻烦的事情抛给了你。结论很简单,要么就引入更多“生态”,让别人帮你解决
麻烦,让它们对你输出价值观。要么就别走redux的函数式路线,去你大爷的纯函数,
用别的价值观,我用全局变量全局事件,用watch,用observable,用whatever,反正
不用你。 |
s***o 发帖数: 2191 | 2 正是因为繁琐麻烦,所以入了坑的勇士们都会乐意拉别人也下来享受,不然好不容易掌
握的很快就成垃圾了 LOL
=
【在 d*******r 的大作中提到】 : 作者:Jim Liu : 链接:https://www.zhihu.com/question/63726609/answer/212357616 : 来源:知乎 : 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 : Redux是基于纯函数的,为了保证它的“纯度”,它的reducer函数必须是严格的 S' = : f(S) 的形态,所以,与其说Redux是“状态管理”库,不如说它是“状态转移管理”库 : ,因为Redux是无状态的,状态是在你的程序里的,你自己维持状态,它只是给你提供 : 了一个状态转移的统一方式。这使得它的整个模型看起来是非常干净。 : 而事实上我们在开发实际项目当中可能有小半(maybe大半)的reducer场景其实应该是 : S' = await fAsync(S) 的形态,比方说,我点了一个计数器+1的按钮,在一个美丽的
|
d******c 发帖数: 2407 | 3 纯函数有很多好处,但是现实世界里需要side effect,需要不纯才能做事情。
不应该追求纯,而是能纯函数的地方尽量纯函数,把side effect限制在一定范围内。
Haskell就是太追求纯,我看clojure没这个问题。
redux可能受elm启发,这方面elm也许做的更好一点,不过我不了解细节。 |
c******n 发帖数: 16666 | 4 上午在知乎还看到一个用react-native搞出大坑的帖子 |
m****o 发帖数: 182 | 5 Haskell吧side effect都封装到IO Monad里面去了。我看上Scala最好,想fp也可以,
想oo也行。
【在 d******c 的大作中提到】 : 纯函数有很多好处,但是现实世界里需要side effect,需要不纯才能做事情。 : 不应该追求纯,而是能纯函数的地方尽量纯函数,把side effect限制在一定范围内。 : Haskell就是太追求纯,我看clojure没这个问题。 : redux可能受elm启发,这方面elm也许做的更好一点,不过我不了解细节。
|
a*****e 发帖数: 1700 | 6 问题不在纯函数,而在于副作用有很多种类(包括无副作用的特例,也即纯函数)。
这都源于类型系统太弱鸡:
1. 异步请求也可以是纯函数,但是类型系统不够强大,无法表达这种条件
或者:
2. Reduction 也可以允许副作用,只要副作用不影响 determinism 就好了。如果类型
系统不够强大,也无法表达这种条件
Untyped 语言(如 Clojure)其实是在说:“随便你怎么写,如果不满足条件的代码被
默认做了非法的优化造成的后果你自己看着办,谁让你这么写来着[摊手]”
归根结底,type is the study of an intrinsic property of
code (without executing it). 不会因为写程序的人的观点而改变
Haskell 的目的不是追求纯函数,而是研究如何用类型系统来学习和安排副作用,从而
写出正确的代码。
【在 d******c 的大作中提到】 : 纯函数有很多好处,但是现实世界里需要side effect,需要不纯才能做事情。 : 不应该追求纯,而是能纯函数的地方尽量纯函数,把side effect限制在一定范围内。 : Haskell就是太追求纯,我看clojure没这个问题。 : redux可能受elm启发,这方面elm也许做的更好一点,不过我不了解细节。
|
s***o 发帖数: 2191 | 7 那个我也看了,主要是遇人不淑,选什么技术都是一个死字。
你们的mobile是用什么在做?
【在 c******n 的大作中提到】 : 上午在知乎还看到一个用react-native搞出大坑的帖子
|
c******n 发帖数: 16666 | 8 有钱有时间上原生
没时间还是web,css改改凑活下 最多也就是redirect到稍微对mobile优化了点的web
少传点东西什么的
hybrid有个几个小的试水的 大的还是没上 就是怕这种时间精力扔进去了效果还不行
你们呢
【在 s***o 的大作中提到】 : 那个我也看了,主要是遇人不淑,选什么技术都是一个死字。 : 你们的mobile是用什么在做?
|
s***o 发帖数: 2191 | 9 也是web+css顶
【在 c******n 的大作中提到】 : 有钱有时间上原生 : 没时间还是web,css改改凑活下 最多也就是redirect到稍微对mobile优化了点的web : 少传点东西什么的 : hybrid有个几个小的试水的 大的还是没上 就是怕这种时间精力扔进去了效果还不行 : 你们呢
|
c*********e 发帖数: 16335 | 10 写ajax是在actions里,你怎么在reducer里写這個?
=
【在 d*******r 的大作中提到】 : 作者:Jim Liu : 链接:https://www.zhihu.com/question/63726609/answer/212357616 : 来源:知乎 : 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 : Redux是基于纯函数的,为了保证它的“纯度”,它的reducer函数必须是严格的 S' = : f(S) 的形态,所以,与其说Redux是“状态管理”库,不如说它是“状态转移管理”库 : ,因为Redux是无状态的,状态是在你的程序里的,你自己维持状态,它只是给你提供 : 了一个状态转移的统一方式。这使得它的整个模型看起来是非常干净。 : 而事实上我们在开发实际项目当中可能有小半(maybe大半)的reducer场景其实应该是 : S' = await fAsync(S) 的形态,比方说,我点了一个计数器+1的按钮,在一个美丽的
|
|
|
c*********e 发帖数: 16335 | 11 這個jim liu对javascript一无所知,可能是后台转前台的,用的后台的思维来做前台。
=
【在 d*******r 的大作中提到】 : 作者:Jim Liu : 链接:https://www.zhihu.com/question/63726609/answer/212357616 : 来源:知乎 : 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 : Redux是基于纯函数的,为了保证它的“纯度”,它的reducer函数必须是严格的 S' = : f(S) 的形态,所以,与其说Redux是“状态管理”库,不如说它是“状态转移管理”库 : ,因为Redux是无状态的,状态是在你的程序里的,你自己维持状态,它只是给你提供 : 了一个状态转移的统一方式。这使得它的整个模型看起来是非常干净。 : 而事实上我们在开发实际项目当中可能有小半(maybe大半)的reducer场景其实应该是 : S' = await fAsync(S) 的形态,比方说,我点了一个计数器+1的按钮,在一个美丽的
|
l**********n 发帖数: 8443 | |
d*******r 发帖数: 3299 | 13 JS还是不适合做纯FP吧
【在 a*****e 的大作中提到】 : 问题不在纯函数,而在于副作用有很多种类(包括无副作用的特例,也即纯函数)。 : 这都源于类型系统太弱鸡: : 1. 异步请求也可以是纯函数,但是类型系统不够强大,无法表达这种条件 : 或者: : 2. Reduction 也可以允许副作用,只要副作用不影响 determinism 就好了。如果类型 : 系统不够强大,也无法表达这种条件 : Untyped 语言(如 Clojure)其实是在说:“随便你怎么写,如果不满足条件的代码被 : 默认做了非法的优化造成的后果你自己看着办,谁让你这么写来着[摊手]” : 归根结底,type is the study of an intrinsic property of : code (without executing it). 不会因为写程序的人的观点而改变
|
l**********n 发帖数: 8443 | 14 redux不算啥,整个react生态圈很分割。不像angular那么统一。 |
G**U 发帖数: 180 | 15 用了一段时间的redux,现在转vue了。
lz可以看看vue |
c*********e 发帖数: 16335 | 16 还是gmail简单,angularjs, react都不用。
【在 l**********n 的大作中提到】 : redux不算啥,整个react生态圈很分割。不像angular那么统一。
|
c******n 发帖数: 16666 | 17 gmail还是gwt写的吗
【在 c*********e 的大作中提到】 : 还是gmail简单,angularjs, react都不用。
|
c*********e 发帖数: 16335 | 18 gmail的web server都是google自己写的,更何况其它的。反正google里牛人有的事,
写这些东西易如反掌。
【在 c******n 的大作中提到】 : gmail还是gwt写的吗
|
m****x 发帖数: 9 | 19 其实redux的好处还是比较复杂的单app多component频繁切换的场景,mvc里面数据模型
独立性比较好。如果是简单app或是复杂多app切换场景,redux route绑定起来就复杂
了。。。 |