React.js有哪些设计缺陷?
看了几篇回答,我觉得大家对于“缺陷”这两个字都有不同的理解:有人说:没有 slot 支持,没有 directive,组件职责过于灵活,组件复用不是很好实现。。。。。。针对于此,就有人说:这些不算“缺陷”,你觉得应该有这样那样的功能,这只能算“缺”,不算“缺陷”。因为 React 原本就没想过要有。真正的缺陷是 React 没有,且也无法实现的东西。我觉得这两种观点都对。但是在这个问题上,大可不必纠结于是“缺”还是“缺陷”上,难道不应该鼓励开发者多“吐槽”,我们用宽容的眼光来看吗?这样会越觉得有意思,也有助于知识水平的提高。毕竟,到目前为止,我也没有看到有人举出:“React 没有,且也无法实现的东西,然后别人家有,别人家能实现。。。。。。”言归正传,我来说下我的看法。甲之蜜糖,乙之砒霜,脱离场景谈缺陷,确实都是刷流氓。因此下面所谓的缺陷,都是自动加了引号的。综合来看,这些缺陷可以大体分为两类:对于开发者的不友好自身设计上的小瑕疵和不明确首先,对于开发者不友好可以细化为:选择 React,就是选择整个 React 生态世界这样听上去没什么问题,更何况这个世界生态是如此丰富。可是要知道“这个世界是单行道”,一旦选择了 React,我们找个第三方解决方案(比如 swiper 组件)都要找 React 集成的,这也当然不难找,但一旦建立就很难推倒重来。学习曲线陡峭学习曲线陡是全方位的。新人上手就是比 Vue 慢;上手后想用的优雅,还就是要花费一番功夫,你要知道使用 mixin 还是 HoC 还是 render props 甚至 react hooks 实现复用逻辑的差异。光是 HoC 里面的一些细节,开发者就要花时间了解,HoC 从不是“一个组件接受另一个组件,再返回一个组件”这么简单;从 React 迭代速度和发展来看,一段时间内保持“时刻学习”是必然的,学习成本也是高于其他解决方案的。兼容性这个不再多说了,祝愿世间再无兼容性问题。以上是对于开发者的,那么对于 React 自身的天生缺陷,有哪些呢?JSX 的罪与罚“有多少人爱他,就有多少人恨他“。客观来说,JSX 在 code clarity 存在基因上的问题;同时 html in js 的风格该说他是“强大”还是“丑陋”呢?this 绑定这个“锅”我在 react为什么绑定事件还要求开发者写代码来绑定this,为什么这样设计?www.zhihu.com 回答中提到很多国外开发者认为关于 this 绑定,“Don’t blame React, blame JavaScript”。对此我并不完全苟同。事实上,React 完全可以对 this 进行组件内绑定,这一点用 @贺师俊 贺老评论我的看法的话说,就是:React一个鸡贼的地方就是明明是react自己的锅,硬是要甩给js……你这个回答虽然包含了这个意思,但还是说一半留一半。。。this.setState 设计迷思相信大家都已经知道了某些(甚至大多数)情况下,this.setState 是异步或者叫“批量”更新的。我这里姑且先不说“该不该这样”(当然更没资格说),但是进行同步更新的函数式方法是否最优雅,我们一定可以展开来谈一谈。这里暂且不表。合成事件是个好的主意吗?合成事件是 React 一个特色,全部事件代理到 document 上,事件共享一个 pool,所有这些貌似做到了“性能最优”。可真的是这样吗?React 当然无法阻止原生事件的创建,原生事件和合成事件并存造成的混乱谁都不好理清。除此之外,在合成事件上,绝对还有提升事件处理性能的手段。性能从来不是卖点上面说到性能,React 在性能上从两个维度都有可“挑剔”的地方。第一,bundle size 远远甩开 Vue 等其他解决方案,且在增肥路上一去不返。第二,非其原创的 virtual dom 自然也没有被 React 发挥到极致,在 dom diff 算法上我们知道从 O(N3) 优化到 O(N1),但是这个 diff 算法有些场景完全能做到更好。对于富交互、极致细腻交互的无力感这个稍后我会举一个场景来分析。当然 React 能够处理富交互、极致细腻交互,毕竟都是 JavaScript,“JavaScript 能做的我也能做”,大不了在 componentDidMount 或者相关生命周期中一顿骚操作就完了。可是那样真的很不 React!除了这些,还有很多设计上小的细节我就不一一列举了。等下!“你说了还有很多,但是又不讲完是什么意思。。。?““上面聊的很多也没有展开,比如 virtual dom diff 算法提升空间在哪里?合成事件到底怎么回事,哪里不够好“——能不能把话说完。说来真巧,五一后我将会在上海参加 FD Conf 2019,并做出专题分享——《React, the bad parts》,现在正在整理素材当中。对这个话题感兴趣的同学们可以关注 @Lucas HC ,我会在会后来完善这个回答,把“没说完整,说一半藏一半”的话展开。也会分享出大会 PPT 内容。同时也期待有想法的开发者来联系我,我们一起讨论这个问题。 |