作者丨Aphinya Dechalert
译者丨王强
策划丨王文婧
React 过誉了吗?抛开和 Facebook 的关系,它确实有“两把刷子“吗?
今年年初,我抱着诚恳的态度尝试了一下 React。我自己以前是 Angular 用户,所以在尝试的过程中对这个库所展示的理念一直抱有开放的态度。
刚开始用 React 的感觉很奇怪——这样一个世界里的所有事物都要以一种特殊的方式来构造,其中需要用自动化处理程序来处理数据流。涉及到数据时,React 总有自己的一套强制单向数据流机制。
但这些并不是我放弃 React 的原因——是社区中那些玻璃心的狂热信徒让我受不了的。也许是因为我的 Angular 用户背景,我会仔细观察,在两者间做出许多对比,结果引来了这帮人(他们大部分只会用 React),气势汹汹地要找我较量。有那么几个月他们赢了,我撤退到了自己安全的 Angular 世界里。但是最近,我有机会在工作中用上了 React Native,所以想写一写自己对这个话题的诚实看法。
这是一个库
React 是一个库——而库必须与其他库搭配使用才能解决特定问题。React 的问题解决能力主要体现在渲染前端界面和管理经常变化的数据上。
React 的优势在于单向数据流,在面对突变和意外继承时可以确保高度稳定性和可预测性。React 非常讨人喜欢的另一个因素是它处理关注点分离的方式。它颠覆了传统的筒仓(silo)方法,也就是将 CSS、Javascript 和 HTML 分离成单独的文档文件,并将它们放在同一个空间中以备处理。
以 Angular 为例,传统的处理关注点分离的方式。
需要新事物时的处理方式。这种结构不是 Angular 特有的。
React 中基于关系的关注点分离方式。
从理论上讲,在 Angular 中也能轻松实现基于关系的关注点分离,但不会像 React 中那样是默认方法,也没那么直观。
React 之所以能实现这一目标,是因为其原则是代码组件都要维持在足够小的体积上,从而使这些组件的域和边界都易于检测和理解。但这不是硬性规定,组件的最终大小是由开发者确定的。
回归本源
React 的流行还在于市面上缺少像样的起步架构,人们很需要这种架构来上手。React 与 Angular 是不一样的,在 Angular 中需要用 CLI 来为框架生成必要的设置,而 React 需要的准备工作非常少。
但很多人在对比它们的时候都会犯一个错误。React 是一个库,这在某种程度上预示着它体积很小,功能专一,且有明确的目的性。但 Angular 是一个框架,这在某种程度上预示着它是符合同一套规则的一系列库的集合。因此,说 Angular 臃肿是不公平的,因为它俩并不是同一类事物。
框架决定了开发代码的方式,并充当所有关联库的协调者。它根据一组原则或规则确保所有部分均按预期工作。这是必要的,因为当你有多个库需要搭配使用时,为了让程序平稳运行,你需要有某种共同的基础。
React 不是干这个的。
它从来都不是为这个目标设计的——因为它的唯一目的就是将事物渲染到屏幕上,并让你的数据以干净的方式连接到 DOM。这就是怎么回事要将状态管理委派给 Redux 的原因。如果你想做的事情不只是处理数据和 DOM,就需要找第三方应用程序来处理问题。
这也没错。这就是 React 的机制,这就是 React 的用途所在。
不能因为它易用,就说它更好
Angular 与 React 的争论似乎持续了很长时间。但这本质上不是谁更好的问题,而是谁更适合你开发需求的问题。
我看到很多人最后都会拿出来的论点,就是说 React 是由 Facebook 创造的。但并不是所有事情上 Facebook 的出身都有那么大的意义。是的,它是由 Facebook 创造的,但 React 也不是他们唯一使用的技术。在他们的后端,也许还有前端,还有别的很多东西。
如果我们要谈出身,那么 Angular 与 Google 有关,Java 来自 Oracle,.Net 还是 Microsoft 的心血呢。
需要承认,React 比 Angular 更容易上手——特别是对于开发新手来说,他们对前端代码并没有清晰的认识。他们可能是自学成才的,或者可能是其他领域经验比较丰富的工程师转型过来的。不管用户是什么水平,React 都像是 Javascript 刚诞生时的样子——上手很简单,但是用法几乎没什么限制。
React 作为一个库所面临的问题是没有结构上的约束——只有语法的约束。这可能会引起应用结构松散,缺乏命名约定,文件夹结构(如果有这种东西)随意混乱,生产部署中还可能打包进去很多冗余文件。
从理论上讲,如果你不遵守那些最佳的编程方式,那么做出来的任何事物都可能落得这样的下场。可是这些最佳方法并没有在代码中通过约束固定下来。
Javascript 还有别的知识
React 是 JSX,它是 Javascript 的一种变体,这在某种程度上预示着你仍然有必要了解 Javascript 的实际机制。React 可能比 Angular 更接近 Javascript,Angular 在结构上更像是通过 Typescript 实现类型转换和控件的传统编程语言。
这就是怎么回事你需要对 Javascript 的机制有深入的了解,才能成为一名高水平、高效率的 React 开发人员。你需要深入研究的还有别的一些事物,这中间还包括状态和数据流的概念——因为这是 React 所打交道,并且优势很大的两大主题。