几年前,当我写的代码被各种各样的jQuery选择器和回调函数搞得乱七八糟的时候,AngularJS把我从中解救了出来。

Angular帮助我改善了开发项目的可维护性,而且提供了很多触手可得的功能,它是为建立大型web应用而生的工具,极大方便了快速开发大型应用。

我还记得AngularJS的双向数据绑定和模型是唯一数据来源的哲学是怎样得让我惊叹,事实上,他们大大减少了我编写的应用的代码冗余。

随着时间的推移,我发现了Angular的一些弊病,最终,我对这些缺点失望至极,于是开始寻找它的替代品。

下面这些是我对Angular的忧虑。

基于****DOM****执行。Angular的执行流程严重依赖DOM, Angular应用在默认的引导过程中会扫描DOM并按DOM中指令的优先顺序将模板编译,这样让调试和检测执行顺序变得困难。

双向数据绑定是一把双刃剑。随着你的组件变得复杂,这种方式可能导致性能问题。

双向绑定是如何影响到性能的呢?

JavaScript (ES5)没有实现任何通知变量和对象发生变化的方法,因此Angular使用一种叫做“脏检查“的机制来跟踪数据变化并同步用户界面。

任何Angular作用域内的操作都会触发脏检查,导致了随着绑定增多应用性能会降低。

双向绑定的另一个问题是,页面上许多组件能够改变数据,也就意味着有很多数据的输入来源,如果不能很好管理的话,会导致混乱和难以应对的局面,但客观的说,这是个人的实现问题,并不是Angular自身问题。

Angular****是有它自己体系。Angular的所有操作都必须经过它的digest cycle遍历监听器,否则这些组件不能和你的数据模型同步,这也导致了它的兼容性问题。如果你还使用任何包含数据变动的第三方Js库,你需要用Angular的$apply函数包装它们,否则你就需要把它们转变成一个服务。这就好比重构每一个JS库只为它们能够和Angular相互合作。

依赖注入。JavaScript目前没有包管理器或者自己的依赖解析器。AMD,UMD和CommonJS已经较好解决了这个缺陷,但是到现在Angular也没有处理好这些。当然,它引入了依赖注入(DI),尽管如此,但客观的说,有许多非官方的依赖注入方式使用RequireJS实现。

陡峭的学习曲线。使用Angular需要你学习大量的概念,并不仅仅局限于以下:

  • 模块(modules)
  • 控制器(controllers)
  • 指令(directives)
  • 作用域(scopes)
  • 模板(templating)
  • 连接函数(link functions)
  • 过滤器(filters)
  • 依赖注入(dependency injection)

所以初次接触Angular是非常困难的,它不适合胆小鬼。所有的这些致使我开始转向React

React****好在哪?

React是最新的开源UI框架,是构建JavaScript应用的新方式,React由Facebook和Instagram领导。

要清楚地是:React并不是像AngularJS那样的应用开发框架,所以把它们作为同类比较是不公平的。

当React在2013年5月的欧洲JSConf被介绍于众时,参会者被它的一些概念深深震撼,比如“单方向的数据流”和“虚拟DOM”。

React用于构建UI界面,引用一句来自官方网站的话说,“人们使用React作为MVC中的View”。但是,你可以用它编写独立的Web组件,多多少少类似Angular的directives。

React重新思考了我们当今的web发展观和最佳实践。比如,它鼓励单向数据流动,相信组件是被数据驱动的状态机的哲学。

尽管大多数类似框架喜欢直接操作DOM,React却讨厌DOM并尽力避免开发者与DOM打交道。

React提供了尽可能少的API去实现一个UI组件,既没有多余,有没有不足之处。它遵循了UNIX的哲学:小即是美。做一件事就要做到极致。

这里有一篇更详尽的关于Angular和React间的比较的文章,来自于就职Facebook/Instagram的Pete Hunt。

为什么我转向了****React?

下面列出了React中我喜欢的几个方面。

React速度很快

跟其他框架相比,React使用不同的方式访问DOM。它并不让你直接操作DOM,而是在JavaScript代码逻辑和实际DOM间引进了一个叫做“虚拟DOM”的层。

虚拟DOM提高了web性能,对于连续的渲染过程,React在虚拟DOM中得到前后发生的变动(diff),之后只在真实DOM中改变那些需要改变的地方。

很好的浏览器兼容性

虚拟DOM解决了跨浏览器的兼容问题,因为它提供了一套支持IE8以上标准的API

模块性

编写独立的UI组件让你的应用模块化,可以让你把出现的问题限制在有这个问题的模块上。每一个模块都可以被单独开发、测试,并且能够调用其他组件,这相当于提高了项目的可维护性。

单向数据流更合情合理

Flux是在JavaScript应用中创造单向数据层的系统架构,这个概念和React视图库由Facebook一同提出的,Flux的出现让开发大型应用变得更加简单。Flux只是一个概念而不是特定工具的实现,它可以成为其他框架的一部分,例如,Alex Rattray有一个不错的Flux的实现:在React中使用Backbone的集合和模型。

纯****JavaScript

现在的web app跟传统的Web相比工作方式已经不同了,比如视图层通过与用户的交互改变内容而不是请求服务器,因此视图和控制器需要紧密相互依赖。其他一些框架使用Handlebars或Mustache那样的模块引擎处理视图层,但是React认为视图层和控制器相互依赖非常密切以至它们应该共存一处而不是使用第三方模板引擎,当然,最重要的是不要离开JavaScript的作用域。

同构****JavaScript

单页JS Web应用的最大的缺点是在搜索引擎抓取数据时的限制。React对此有一种解决办法。

React可以在将数据传给客户端前在服务器上预先渲染应用,这样可以从服务器上渲染好的静态数据还原真实应用的相同状态。因为搜索引擎爬虫抓取数据依靠服务器的响应而不是JavaScript的执行结果,所有预先渲染可以改善你的SEO

与其他库兼容良好

在构建大型应用的时候,像RequireJS, Browserify和Webpack那样的加载器和打包工具是十分有用的,它们让艰难的任务得以完成。不幸的是,目前版本的JavaScript并不提供用于加载和打包的模块(不过有提议在即将到来的ES6版本中加入System.import)

幸运的是,我们拥有像RequireJS和Webpackz这样简洁的代替品, React就是用Browserify构建的,如果你想注入图像资源或者编译LessCoffeeScript,Webpack或许是一个更好的选择,更重要的是,你完全可以实现这个选择。

使用****React****,我还需要其他开发框架吗

使用React可以构建用户界面,但是你仍需要发起AJAX相应,使用数据过滤器或者其他Angular包含的功能。

那么我们是否需要使用额外的JavaScript开发框架?为什么我们抛弃Angular?

框架就是一套模块和规则,如果我不需要其中一些模块或者想把一个模块替换成另一个更优秀的模块,我该怎样做?

其中一种实现模块化和依赖管理的方法就是通过包管理器。但是,我怎么才能在Angular里管理包呢?这都取决于你,但是你要知道Angular有它自己的体系,你很可能需要改编第三方包使其适应Angular的体系。换句话说,React就是纯净的JavaScript,任何用JavaScript编写的第三方包不需要任何包装就可以使用。

对我来说,使用npm、Bower这样的包管理器是很好的选择,我们可以挑选自的己组件和工具集。但需要明确的是:这比使用像Angular这样的综合性开发框架更复杂。

这一方面,它的好处是React鼓励使用npm,这样就拥有了许多现成的包可以使用,当你开始用React构建app,你可以使用其中一个全栈初学者工具包

转换到****React****并不是轻松的

因为Angular是一款app开发框架,它的确带给我很多好处,但我还是我放弃了一些非常棒的功能,比如将封装好的AJAX用于$http服务,使用$q作为promise服务,用ng-show,ng-hide,ng-class和ng-if作为模板控制语句——所有这些都令人惊叹。

React并不是一款app开发框架,所以你需要考虑构建应用的其他方面,比如,我正从事一款叫做react-utils的开源项目,以此用来简化React开发。社区也正在积极地贡献类似的可重用组件来填补这个空白,React Component就是一个非官方目录网站,你可以从中寻找这样的开源组件。

React的哲学并不鼓励你使用双向绑定,这会让你处理表单和可编辑的数据格时带来了很多困苦。但是,但你开始理解Flux数据流动和存储的时候,一切都变得清晰简易。

React是新兴的,它的社区需要时间成长,而另一方面Angular已经得到极大流行,有相当多的拓展可以使用(比如AngularUI 和 Restangular)。然而,尽管React的社区刚刚兴起,但它成长迅速,像React Bootstrap这样的拓展可以证明,所以我们拥有更多的组件使用只不过是一个时间问题。

结论

如果你喜欢Angular方式,你可能一开始讨厌React,主要是因为React的单向数据流和它缺乏开发应用的特性。但是一旦你开始适应了Flux设计模式和React的哲学,我保证你将会发现它的美丽之处。

Facebook和Instagram都在使用React(因为是它们在领导React)。

GitHub’s新的源码编辑器Atom就是用React构建的。

即将到来的新Yahoo!邮箱正在用React构建。

React已经取得大规模的app和大科技公司的关注。