JavaScript框架Angular和React深度对比


Posted in Javascript onNovember 20, 2017

本文通过从概念和使用思路上的车别,详细给读者分析了Angular和React这两个JavaScript框架的区别之处,希望我们整理的对你有用。

Angular和React这两个JavaScript框架可谓红的发紫,同时针对这两个框架的选择变成了当下最容易被问及或者被架构设计者考虑的问题,本文或许无法告诉你哪个框架更优秀,但尽量从更多的角度去比较两者,尽可能的为你在选择时提供更多的参考意见。

选择的方法

在选择之前,我们尝试带着一些问题去审视你将要选择的框架(或者是任何工具),尝试用这些问题的答案来帮助我们更加了解框架,也更加让选择变得更容易

框架本身的问题: 是否成熟?谁在背后支持呢?具备的功能?采用什么架构和模式?生态系统是否丰富? 需要自我反思的问题: 我和我的团队能否轻松学习并掌握?是否适合我的项目?开发体验是否足够好?

严格说来,Angular和React的比较是不公平的,因为Angular是一个功能丰富的框架,而React是一个UI的组件库,所以我们在接下来的分析中会将一些经常和React在一起使用的类库放在一起讨论。

OK,开始… …

 成熟度

作为一名成熟的开发人员或者是能够决定架构及技术走向的人员,一项必备的技能就是能够在工作和项目中平衡成熟技术与最前沿框架之间的关系,既能保持人员及技术的前进,又能保证项目或产品的交付质量,所以,必须小心以下可能的风险:

该框架可能是不稳定的。主要的开发方(赞助方)可能会突然的放弃。如果你需要帮助,可能没有大型知识库或社区可用。

幸好,无论是Angular还是React,似乎都不需要担心以上的风险

React

React由Facebook开发和维护,用于自己的产品,包括Instagram和WhatsApp。现在已经有大约三年半的时间。 它也是GitHub 最受欢迎的项目之一。

Angular

Angular由Google进行维护,并用于Google 的Adwords 和Fiber项目。既然AdWords是Goolge重要的吸金利器,自然Angular不太可能突然夭折。

功能

如前文提到的,Angular本身会比React自带很多的功能,当然,更丰富的功能对于一个框架来说,是优点也有可能是缺点。两个框架都具备一些相同的核心功能:组件化、数据绑定以及平台无关的Render机制。

Angular

Angular除了提供一些需要最新浏览器支持的功能外,同时提供以下标准功能:

依赖注入模板路由(@angular/router) AJAX(@angular/http)表单(@angular/forms)组件化CSS封装 XSS保护单元测试工具

功能丰富的好处就是你不需要额外费精力去挑选第三方的类库,然而,这也同样让你没得选择,即使你并不需要这些功能(最新发布的Angular4貌似已经意识到了这个问题)

React

相对Angular,React本身提供的功能就相对“简约“:

无依赖注入使用JSX代替传统的HTML Templates XSS保护单元测试工具

相对Angular,React让你有很大的自由度去挑选第三方的类库,比如:

路由(React-router) AJAX(Fetch or axios)各种CSS封装(详见:https://github.com/MicheleBertoli/css-in-js)更强大的单元测试(Enzyme)

可以根据自己的需求很自由(或者定制)需要的类库,同时这些第三方的类库都是很容易学习的。

语言与模式

随着两个框架的流行,一些概念和技术也随着浮出,如果想真正的用好或者说掌握这两个框架,了解随之而出的这些概念或者技术是非常必要的:

React JSX

JSX是一个很有争议的话题:有些人喜欢它,而其他人认为这是一个很大的退步。React决定使用一种类似XML的语言在组件中把标记和代码结合起来,直接在JavaScript代码中编写HTML标记。

尽管混合标记与JavaScript的话题可能是有争议的,但它具有无可争议的优点:静态分析。如果在JSX标记中发生错误,编译器会立即报错而不是留待运行时出现莫名其妙的问题。这有助于开发人员快速排查错误以及避免其它愚蠢的错误,比如拼写错误。

Flow

Flow是由Facebook开发的JavaScript类型检查工具。它可以解析代码并检查常见的类型错误,如隐式转换或取消引用。

与类似目的的TypeScript不同,它不需要开发人员迁移到新语言,并为你的代码注释类型检查工作。在流程中,类型注释是可选的,可用于向分析器提供其他提示。如果你想使用静态代码分析,同时避免重写现有的代码,Flow是一个很好的选择。

Redux

Redux是一个可以以清晰的方式管理状态变化的库。它的灵感来自Flux,但是有一些简化。Redux的关键思想在于,应用程序的整个状态由单个对象表示,该对象由名为reducers的函数进行突变。Reducers本身是纯功能,与组件分开实现。这样可以更好地分离问题和测试。

如果你正在开展一个简单的项目,那么引入Redux可能有点得不偿失,但对于中等和大型项目来说,这是一个很好的选择。

Angular TypeScript

TypeScript是一种基于JavaScript开发并由Microsoft开发的新语言。它是JavaScript ES2015的超集,并包含较新版本的语言的功能。你可以使用它而不是Babel来编写最先进的JavaScript。它还可以通过使用注释和类型推断的组合来静态分析你的代码。

还有一个更微妙的好处。TypeScript受到Java和.NET的严重影响,所以如果你的开发人员有这些语言之一的背景知识,他们可能会比简单的JavaScript更容易找到TypeScript(请注意我们如何从工具切换到你的个人环境)。 虽然Angular是第一个积极采用TypeScript的主要框架,但它也可以与React一起使用。

RxJS

RxJS是一个响应式编程库,可以灵活地处理异步操作和事件。它是将Observer和Iterator模式与功能编程相结合的组合。RxJS允许您将任何东西视为连续的流,并对其进行各种操作,例如映射,过滤,拆分或合并。

该类库已被Angular采用其HTTP模块以及一些内部使用。当您执行HTTP请求时,它返回一个Observable,而不是通常的Promise。 虽然这个类库非常强大,但也很复杂。要掌握它,您将需要了解不同类型的“可观察”,“主题”以及大约一百种方法和操作符 。

当您使用连续数据流(如Web套接字)工作很多的情况下,RxJS非常有用,但是对于其他任何东西来说似乎过于复杂。 无论如何,当你使用Angular时,您至少应该了解RxJS的基本知识。

TypeScript可以说是Angular中非常重要的特点,首先他给原本C#/Java开发人员提供了很容易进入前端的机会,另外TypeScript也想比JavaScript更容易理解,尤其是代码量或者业务复杂的项目中。

生态系统

开源框架这么流行的原因之一,就是围绕着他们,会有无数的工具、类库、扩展来支撑整个框架,有时,这些工具可能比框架本身更有帮助,接下来我们就来看看相关这两个框架最流行的工具和类库。

Angular Angular CLI

现代框架的流行趋势是使用CLI工具,可以帮助您引导项目,而无需自行配置构建。Angular有Angular CLI。它允许您仅使用几个命令来生成和运行项目。负责构建应用程序的所有脚本,启动开发服务器和运行测试都会在node_modules中隐藏。您也可以在开发过程中使用它来生成新的代码。这使得新项目的设置变得轻而易举。

Ionic 2

Ionic 2 是开发混合移动应用程序的流行框架的新版本。它提供了一个与Angular 2完美集成的Cordova容器,以及一个漂亮的材料组件库。 使用它,您可以轻松地设置和构建移动应用程序。 如果您喜欢使用混合应用程序,那么这是一个不错的选择。

Material design components

如果您热衷于设计Material,您会很高兴听到Angular有一个Material组件库。

Angular universal

Angular universal是一个种子项目,可用于创建支持服务器端渲染的项目。

@ngrx/store

@ngrx/store是由Redux启发的Angular的状态管理库,基于由pure reducer进行突变的状态。它与RxJS的集成允许您利用推送更改检测策略获得更好的性能。

关于更多的有关Angular相关类库和工具可以参考:the Awesome Angular list

React Create React App

Create-react-app 是一个CLI工具,用于快速创建新的React应用。可以生成一个新的工程,启动开发服务器并创建绑定。Jest(来自Facebook的一个单元测试工具)也同时集成在Create-react-app内部,更方便的让我们进行单元测试。

React Native

React Native 是Facebook开发的基于React在移动端的开发平台,借助此平台,React可以创建真正的Native的UI。提供了一系列标准的React组件用于绑定。同时允许创建自己的组件并与Objective-C、Java或者Swift的代码进行绑定。

Material UI

还有一个可用于React的Material Design Component。与Angular的版本相比,这个版本比较成熟,可以使用更广泛的组件。

Next.js

Next.js 是React应用程序的服务器端呈现的框架。它提供了一种在服务器上完全或部分呈现应用程序的灵活方式,将结果返回给客户端并在浏览器中继续。它试图使创建通用应用程序的复杂任务尽可能简单,所以设置被设计为尽可能简单,最少量的新原语和对项目结构的要求。

MobX

MobX 是用于管理应用程序状态的替代库。不像Redux那样将状态保存在一个不可变的存储中,它鼓励您仅存储最低限度的必需状态,并从其中获取剩余的数据。它提供了一组装饰器来定义可观察和观察者,并将反应逻辑引入到你的状态管理代码中。

Storybook

Storybook是React的组件开发环境。它允许您快速设置单独的应用程序来显示您的组件。除此之外,它提供了许多附加组件来记录,开发,测试和设计您的组件。

同样的,可以从Awesome React list了解更多的工具和类库。

学习曲线与开发体验

选择新技术的一个重要标准是学习它是否容易。当然,答案取决于广泛的因素,例如您以前的经验和对相关概念和模式的普遍了解。如果我们假设你已经知道ES6 +,构建工具和所有这些,我们来看看你还需要了解什么。

React

有了React,你会遇到的第一件事就是JSX。对于一些开发人员来说似乎刚开始会觉得很别扭,但它并没有增加复杂性; 只是表达式,实际上还是JavaScript,还有一个特殊的类似HTML的语法。您还需要学习如何编写组件,使用props进行配置和管理内部状态。不需要学习任何新的逻辑结构或循环,因为所有这些都是纯JavaScript。

官方教程是开始学习React的好地方。一旦完成了官方教程,接下来应该熟悉并掌握React的路由机制 。React Router v4版本可能稍微复杂和非常规,但也不许太过担心。

使用Redux将需要一个范式的转变,免费入门Redux视频课程可以快速介绍核心概念。根据项目的大小和复杂性,找到并学习一些额外的库,这可能是棘手的一部分,但之后,一切都应该变得顺利。

其实,React的上手非常容易,最难的部分可能是如何挑选合适你项目或产品的类库。

Angular

Angular将向您介绍比React更多的新概念。首先,您需要使用TypeScript。对于具有静态类型语言(如Java或.NET)经验的开发人员,这可能比JavaScript更容易理解,但对于纯JavaScript开发人员,这可能需要一些额外的学习。

框架本身丰富的技术主题可以从诸如模块,依赖注入、装饰器、组件、服务、管道、模板和指令等基础开始,到更高级的主题,如更改检测,区域,AoT编译和RxJS。这些都在文档中。RxJS是一个很重的话题,在官方网站上有详细描述。虽然在基本功能层面上使用起来相对容易,但在转到高级应用时会变得更加复杂。

总而言之,我们注意到Angular的进入壁垒高于React。新概念的数量绝对令新来者感到困惑。又是碰到一些问题还不得不Google后才能找到答案,但是,就像之前说的,是否合适,还是取决于更多的因素。

前景 Angular

就在2017年的3月,Angular已经发布了4.0的版本(兼容2.x版本),关于为什么是4.0,官方的解释是因为Router这个主要核心组件的版本已经是4.0.0,如果Angular还用3.0会引起混淆,如下图:

JavaScript框架Angular和React深度对比 

4.0版本中主要是大幅度的减小了代码体积(60%),同时提高了加载的速度(肉眼可查的程度),同时报错的信息更清晰了。根据官方的文档,Angular的版本升级会以比较快的速度进行迭代

 JavaScript框架Angular和React深度对比

无论是大版本的6个月迭代,还是每周的hotfix,能看出Angular团队想用快速升级的策略迅速占领市场。

React

反观React的升级倒是非常谨慎的,这从最新的v15.5.0的发布新闻博客中就能看出

JavaScript框架Angular和React深度对比

不过,从博客中能看到React即将迎来v16,不知道整个重写的React会给我们带来什么惊喜。不过,需要提一下的是Facebook已经与去年底的时候发布了React VR,有兴趣的同学可以围观以下。

契合度

无论是哪个框架,适合自己的才是“好“的,所以需要你从项目(产品)本身的角度去衡量,以下的问题列表可能并不全面,但至少可以作为一个开始

该项目(产品)有多大规模?要维护多久?所有的功能是提前清楚地定义还是灵活的改变?域模型和业务逻辑是否复杂?你定位什么平台? Web,手机,桌面?你需要服务器端渲染吗? SEO重要吗?你会处理很多实时事件流?你的团队有多大?你的开发人员有多丰富,他们的背景是什么?是否有任何您想要使用的现成的组件库?

如果您正在开展一个大型项目,并希望尽可能减少错误选择的风险,请考虑先创建一个demo用于验证产品概念。选择项目的一些主要功能,并尝试使用其中一个框架以简单的方式实现它们。 Demo通常不会(也不应该)花费很多时间,但会提供一些宝贵的经验,可以帮助您验证关键的技术要求。如果对结果感到满意,可以继续全面构建。如果没有,会给你充分的时间重新选择。在项目发开过程中,你还可以借助一些支持Angular和React的开发工具来提高开发效率,如Wijmo,这是一款为企业应用程序开发而推出的一系列包含 HTML5 和 JavaScript 的开发控件集。无论你的应用程序是移动端、PC端、还是必须要支持IE6,Wijmo Enterprise 均能满足需求。

下面在给大家看一下一位资深程序员关于这2个框架的对比以及心得:

首先我现在的经验是Angular和Ember都只玩过TODOMVC的tutorial,React的话自己正在写一个Chrome的App和公司的一个小项目。

最近正好有个新项目在评估用Angular,Ember还是React(+Flux),我随便谈一点自己的浅见。

Angular.js

首先Angular的背后是Google(难道这就是官网被墙的原因?),所以社区基础是不用担心的,整个生态也已经是非常的完整了,从最基本的Tutorial到StackOverflow的问题数到框架本身的剖析都有非常非常多,所以从这个角度看起来Angular应该算是上手比较容易的。

不过Angular目前的问题看起来也很明显

1. 性能

同样是TODOMVC的Sample,Angular完全载入用了1.1s(WebPagetest - Visual Comparison)。目前我用到的基于Angular的就是Kibana,不得不说,确实挺慢的。。

2. Angular 2.0

Angular的2.0几乎是一个推翻重做的框架,估计不会有1.X的upgrade方案。所以如果现在新开始的项目采用Angular的话,会是一个很尴尬的时机。同样,如此大的改动似乎也反面印证了1.X并不是那么好。这篇文章推荐去看看Why you should not use

AngularJs

React.js

React很大的特点就是“轻”,再加上VDOM这个很好的idea让React非常非常快(在上面那个测试里面0.3s左右就载入完毕)。另外React和Angular一个很大的不同就是React采用的是one-way data flow。

React的缺点嘛,大概就是现在还太新了很难说将来有没有大的API变化,目前在大的稳定的项目上采用React的,我也就只知道有Yahoo的Email。所以现在很少有批评React的声音也许不是他真的就没有坑,而是那些坑还没有被踩出来而已。

还有就是React本身只是一个V而已,所以如果是大型项目想要一套完整的框架的话,也许还需要引入Flux和routing相关的东西。React的routing我没有研究过,但是Flux的话已经有出现一些批评的声音了。

总结

Angular是真正的大而全的framework,他有自己一套思路,基本你follow这个思路往里面填代码就OK。
React是一个简短有力的library,他只负责解决你某个单一的“痛点”。

Javascript 相关文章推荐
JavaScript 开发规范要求(图文并茂)
Jun 11 Javascript
读jQuery之三(构建选择器)
Jun 11 Javascript
JQuery遍历json数组的3种方法
Nov 08 Javascript
jquery实现可自动收缩的TAB网页选项卡代码
Sep 06 Javascript
Markdown+Bootstrap图片自适应属性详解
May 21 Javascript
使用vue.js实现联动效果的示例代码
Jan 10 Javascript
基于 Vue 的树形选择组件的示例代码
Aug 18 Javascript
微信小程序图片左右摆动效果详解
Jul 13 Javascript
es6函数之rest参数用法实例分析
Apr 18 Javascript
实例讲解JavaScript 计时事件
Jul 04 Javascript
Vue将props值实时传递 并可修改的操作
Aug 09 Javascript
node.js使用express-fileupload中间件实现文件上传
Jul 16 Javascript
如何选择适合你的JavaScript框架
Nov 20 #Javascript
JavaScript内存泄漏的处理方式
Nov 20 #Javascript
加载 vue 远程代码的组件实例详解
Nov 20 #Javascript
jquery中有哪些api jQuery主要API
Nov 20 #jQuery
详解如何将 Vue-cli 改造成支持多页面的 history 模式
Nov 20 #Javascript
详解Vue2 SSR 缓存 Api 数据
Nov 20 #Javascript
Three.js开发实现3D地图的实践过程总结
Nov 20 #Javascript
You might like
提问的智慧
2006/10/09 PHP
ThinkPHP模板Switch标签用法示例
2014/06/30 PHP
PHP中调用SVN命令更新网站方法
2015/01/07 PHP
Thinkphp 框架基础之源码获取、环境要求与目录结构分析
2020/04/27 PHP
9个JavaScript评级/投票插件
2010/01/18 Javascript
Jquery 返回json数据在IE浏览器中提示下载的问题
2014/05/18 Javascript
JQuery显示隐藏DIV的方法及代码实例
2015/04/16 Javascript
js精准的倒计时函数分享
2016/06/29 Javascript
jQuery中ajax错误调试分析
2016/12/01 Javascript
javaScript生成支持中文带logo的二维码(jquery.qrcode.js)
2017/01/03 Javascript
微信小程序  checkbox组件详解及简单实例
2017/01/10 Javascript
JS实现的四级密码强度检测功能示例
2017/05/11 Javascript
AngularJS全局警告框实现方法示例
2017/05/18 Javascript
VUE前端cookie简单操作
2017/10/17 Javascript
React Native自定义控件底部抽屉菜单的示例
2018/02/08 Javascript
微信小程序实现弹出层效果
2020/05/26 Javascript
详解@angular/cli 改变默认启动端口两种方式
2018/11/29 Javascript
JavaScript(js)处理的HTML事件、键盘事件、鼠标事件简单示例
2019/11/19 Javascript
vue中配置scss全局变量的步骤
2020/12/28 Vue.js
[00:30]明星选手化身超级英雄!2018DOTA2亚洲邀请赛全明星赛来临!
2018/04/06 DOTA
[51:17]VGJ.T vs Mineski 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
Python实现返回数组中第i小元素的方法示例
2017/12/04 Python
浅谈python正则的常用方法 覆盖范围70%以上
2018/03/14 Python
Python实现针对json中某个关键字段进行排序操作示例
2018/12/25 Python
python按行读取文件并找出其中指定字符串
2019/08/08 Python
Python产生一个数值范围内的不重复的随机数的实现方法
2019/08/21 Python
解决Python使用列表副本的问题
2019/12/19 Python
Python使用Selenium实现淘宝抢单的流程分析
2020/06/23 Python
阿里巴巴英国:Alibaba英国
2019/12/11 全球购物
文秘专业毕业生就业推荐信
2013/11/08 职场文书
办理居住证介绍信
2014/01/15 职场文书
销售个人求职信范文
2014/04/28 职场文书
汽车维修求职信
2014/06/15 职场文书
卫生院艾滋病宣传活动小结
2014/07/09 职场文书
奖金申请报告模板
2015/05/15 职场文书
Python合并pdf文件的工具
2021/07/01 Python