看到 HN 上关于 React 的一些讨论,也想说点我的看法。
那么让我来总结下React的优缺点:
首先谈到 React 的优缺点就不可避免的涉及到 JavaScript 这们语言的优缺点,再扩大一点讲就是前端的优缺点。
React 出现的原因是要解决 UI 的复杂度问题,简单理解成 HTML 和 JS 的复杂度问题。为什么?HTML 不是很简单么,有什么复杂度?
HTML 是用户界面的复杂度,JavaScript 是工程层面的复杂度。前端程序员的使命就是解决这两者之间存在的复杂度,从而构建高效的 GUI 软件。
而在所有的 GUI 软件中,HTML 界面是最变化多端的,它代表着可以给用户提供各式各样的花哨吸引眼球的功能和视觉冲击,从而解决某些心理诉求而不是功能需求。然而工程层面从来不关心这些东西,工程层面只关心效率、稳定、成本。
其次 JavaScript 这门语言本来是有很多缺点的,最大的缺点我认为是设计和实现上的不一致性,设计是 tc39,但实现却是各个主宰浏览器的大公司组织。一个很简单的问题是:ECMA-262 规定所有 JavaScript 的数字类型都是 double 双精度浮点,而实现上根本不可能这么做,因为如果那样的话在 JavaScript 中数字类型占用的内存将会翻倍。有人可能说性能不重要,但是真的不重要吗?
最后,让我来讲讲 React 的优缺点:
React 最好的设计在于解决了 HTML/JavaScript 之间的复杂度,它使得 JavaScript 在构建大型前端工程中时,分散的复杂度的治理集中到了 JavaScript 层面,这就很有意思了,因为我们总是想让 HTML/CSS 这类看起来像是程序语言的东西真正的具备“编程能力”,因为只有这样,通过 JavaScript 去构建工程时,代码层面才会是一致的。
React 最大的缺点在于它的定义和它被使用的场景出现了偏差,React 从来就说它是一个 library 而不是 framework,但是当我们用它来构建前端应用的时候,我们总是想要一个 framework 而不仅仅是一个 library。一个 library 的内核是函数式的思想这没有问题,但是人们会受到影响,当 React 的用户越来越多,而 React 本身又推崇函数式的范式,那社区就会有不正的风气。这种风气可能对语言生态产生间接影响,比如 tc39 decorators proposal,天知道这个提案什么时候才会被通过,大家觉得不需要 class 了,所以这个提案就不会有继续下去的动力了。
然而实事上讲 React 它对自己的定义一点都没变,它的设计方向也很一致。问题是它承担了很大量级的受众优势,但它从没考虑过这其中的责任。当然这个责任也不是 React 一个 library 能承担的。