最近看了两篇英文博客,关于React, Angular & Vue的发展,看起来有点吃力,总感觉外国人有些语法有问题,哈哈,在这里稍微总结下。
关于Angular
自己目前公司业务主要使用Angular 1.x,我们首先了解为什么2012年AngularJS会热门起来,有哪些特性呢?
- 双向绑定
- MVC架构
- 模块系统
- 依赖注入
- 路由管理
这些特性看上去很诱人,但当开发者开始构建专业的,大而全的应用时,他的局限性就显露出来了,双向绑定,watchers,$scope变量,状态管理,令人困惑的重复且抽象的factory/service和其他一些问题阻碍了AngularJS的发展。
行业发展
2014年,AngularJS发展的顶峰时,AngularJS团队宣布。他们将创建一个彻底新的矛盾的框架Angular2。
2013年,React如何彻底改革前端开发,Facebook在产品使用React达两年后开源React,它强调自己是MVC中的V层,它完全撼动了JS前端社区,通过它的单向数据流和简单功能组件模型。
在2013年,Angular和其他每个JS框架倾向于双向绑定作为一个特性,而React特例独行,且告诉我们那是一个错误的想法。双向数据绑定对于简单应用是伟大的,但是在生产规模和大量的状态的情况下,他很容易成为意大利面条。大量的不可预测的副作用可以触发。事实证明Facebook是对的,Ember, Angular, Vue和其他框架将会采用单向模式。
2015年,Dan Abramov发布Redux,Redux带来可预言的,功能的,可维护的状态管理。Redux引入actions和reducers。
因为React的功能UI抽象,它能运行在任何环境中,服务端渲染,这对于单页面应用程序允许搜索引擎友好。
2015年3月,React Native(ios)启动。6个月后支持android。
我们几乎可以确定React & React Native是有竞争力优势的。
当Facebook快速创新React时,一些前端关键技术也在快速发展,其中主要是,NPM, ES2015, Babel, & Webpack。
由于JavaScript语言缺乏某些关键语言特性,JavaScript在很长时间都有很多痛点,特别说明,classes, modules, 和 lambdas,ES2015引入了很多新特性,JS的一个长期存在的问题是跨浏览器支持新的语言特性。Babel 给了我们机会使用这些新语言特性。
Webpack是我们轻松的打包CSS, JS, HTML和其他资源,Webpack加载与强大的功能,仅仅几年前是不可能的,Minification, lazy-loading, tree-shaking和整体的优化可以由任何一个开发人员处理。
NPM作为前端,Node.js的默认包管理器,作为全世界最大的软件仓库,它基本上是JavaScript的应用商店。
在2013年,装配JS库和依赖,用可维护的方式打包前端代码是困难,而在2017年,这一切变得很简单。
2016年9月,Angular 2终于到来,2017年3月,Angular 4发布。Angular 2/4 & up是完全不一样的,基于TypeScript和RxJS。Angular 2/4带来了全新的组件系统,重依赖于TypeScript decorators, SystemJS modules, RxJS observables, 和Angular’s custom HTML-like syntax.
对手
Angular在前端的发展对手,主要就是React和2016的黑马Vue,下面谈谈React的优势:
- React的组件语法比Angular简洁
- React更简单
- React性能更好
一个好的框架需要有:稳定性、活跃度、生态系统、社区、学习曲线、就业需求,易移植性。
Angular破碎的生态系统,移植到Angular2/4,所有的指令和组件均不可用。很多人选择Angular是因为它是Google生产的。事实上,AngularJS在Google使用范围并不广。
战斗结束了,React赢了。2017年,React已成为前端开发的主要选择,目前是GitHub上star最多的第四名,使其成为最受欢迎的JavaScript框架库。
Angular vs. React vs. Vue
这里我们讨论一下前端三大框架,区别是什么以及该如何选择呢?
SPA or not:首先你需要有一个清楚的认识,你是否需要一个单页面应用,或者你更偏向于多页面的方式。
区别上述上个框架,我们从如下两个方面
- 生命周期和战略思考
- 特性和概念
主要讨论如下问题:
- 框架/库的成熟么
- 框架可能长时间存在么
- 社区广泛且有益么
- 找到框架开发者容易么
- 框架的基础编程概念是什么
- 具体应用中(小或大)使用框架容易么
- 框架的学习曲线
- 框架的表现性能
- 哪里可以接触更多
- 挑选出来的框架如何开始开发
生命周期和战略思考
历史
- Angular
- 基于TypeScript
- Google开发和维护
- Angular2/4是对Angular的重写
- AngularJS最初发布于2010年10月
- Angular2发布于2016年9月
- MIT
- React
- 发布于2013年3月
- Facebook开发和维护
- React在Facbook使用比Angular在Google使用多
- 向后兼容
- MIT(有风波,但最终宣布采用MIT)
- Vue
- MVVM
- 2014年2月发布,2016年快速成长,2016年2月版本2发布
- 没有大公司的支持,通过个人努力引起大范围关注,无疑是非常成功的
- MIT
核心开发
在GitHub上,Angular有>25000个star和463个contributors,React有>70000个star和1000个contributors,Vue有>60000个star和仅120个contributors,在过去的三个月,Angular 2平均每天增长31个star,React 74个star,Vue.JS 107个stars。
长期支持与迁移
React API相当稳定,同样有脚本可以帮助你从现有的API迁移到新的API。
Angular是一个完整的框架,提供了很多东西捆绑在一起。React比Angular更灵活。
人力资源
如果你的内部HTML开发人员,并不想学更多的JavaScript,Angular和Vue是你更好的选择,React需要更多的JavaScript能力。
对于Angular来说,一个从别的公司过来的Angular2的开发者会很快使自己熟悉所有的必需约定。而React项目每个都是不一样的,开发者需要熟悉特定项目架构。
如果你有开发者是有面向对象背景或者不喜欢JavaScript的,这对于Angular而言也是好的。因为Angular是基于TypeScript的。
React, Angular & Vue比较
组件
框架从根本上都是基于组件的,定义的组件应该易于重用于网页或在其他组件。React和Vue都擅长处理组件。
Typescript vs. ES6 vs. ES5
React关注于用ES6。Vue使用ES5或ES6。Angular依赖TypeScript。
Templates — JSX or HTML
React打破了长时间的最佳实践,数十年,开发者致力于分离UI模板和行内JavaScript逻辑,但是JSX,这些又被混合在一起。这听起来非常糟糕,但是你可以看看Peter Hunt的演讲React: Rethinking best practices,他指出分离模板和逻辑仅仅是技术上的分离,不是关注点,你应该构建组件而不是模板,组件是可复用的,可组合的和可单元测试的。
JSX是一个可选的预处理器,类html语法,将会被Javascript编译。JSX意味着React的所有东西都是JavaScript,它用来JSX模板和逻辑,Cory House指出,Angular2继续将JS放入HTML,而React将HTML放入JS。这是一个好事情,因为JavaScript比HTML更有力量。
Angular使用特殊的Angular语法增强HTML,然而React需要JavaScript知识,Angular强迫你去学习Angular特定语法。
Vue的特性之一就是单文件组件,templates, scripts 和 styles 在一个文件而不是三个不同的文件。
Framework vs. library
Angular是一个框架而不是一个库,因为它提供了强壮的观点,比如你的应用该如何被构建,提供了许多开箱即用的功能。Angular是一个完整的解决方案。
React和Vue,从另一方面而言,更灵活一些,他们可以和各式各样的包配对,对于React而言,你甚至可以更改React本身的API。因此灵活性带来了巨大的可能性,对于React而言,没有规矩和限制,每个项目需要决定其架构,事情更容易错误,因此对开发人员要求更高。
Vue是似乎是三个框架中最干净和最轻量的,Vue提供了完美的平衡,它会为你做什么,什么需要你自己做。Vue通常触手可及,结实但灵活的安全网帮助你保持代码高效和DOM痛点最小化。
State management & data binding
React通常和Redux一同使用,Redux介绍自己三条基本原则
- 单一来源的真理
- 状态只读
- 使用纯函数做出改变
完整应用程序状态被储存在一个对象树中,它有利于调试应用,以及更容易实现功能,状态是只读的且只能被actions改变去避免竞争状态,Redux引入了复杂性和强有力的约束到你的代码。如果你正在学习React,在你驶向Redux之前,你应该考虑学习纯React。
Vue也可以使用Redux,但是它提供Vuex作为自己解决方案。
React和Angular最大的区别就是one-way vs. two-way binding。Angular的双向绑定当UI元素更新时会改变模型属性,而React是单向的,它首先改变模型,然后渲染UI元素,Angular的方法是清晰的,且更易于开发者去实现,React提供了一个更好的数据概览,因为数据仅流向一个方向,易于调试。
这两个概念都有优缺点,你需要理解概念和确定它是否会影响你的决策。值得一提的是,Vue支持one-way-binding和two-way-binding(one-way by default),
Other programming concepts
Angular包括依赖注入,这导致更灵活和干净的代码。MVC模式将项目分割成模型-视图-控制器三部分,Angular的MVC是开箱即用的,而React只有V,你需要通过你自己解决M和C。
灵活和可精简的微服务
使用React和Vue,你可以简单的添加JavaScript库到项目中,但是这不太可能在Angular中实现,使用它使用TypeScipt。
如今我们更多的倾向于微服务和微应用,React和Vue给予你更多的控制去限制一个应用,通过选择真正需要的东西。他们提供更多的灵活性从SPA转移微服务。Angular对SPA能最好的工作,因此对于使用微服务而言它太臃肿
JavaScript前进很快,React允许你将你应用中的一小部分更换为更好的库,而不是等待和希望能的框架将会更新。微小的、可组成的、单一目的的工具永远不会过时。
Size & performance
Angular太臃肿,压缩后的文件大小达143K,而Vue仅为23K,React为43K。React和Vue都有虚拟DOM,被用来假定能提升性能。
简而言之,Vue有很好的体验和最深层次的内存分配,但是所有的都非常接近彼此,当我们特别的框架的快或慢时。性能基准测试只能作为附注,而不是作为一个结论。
Testing
Facebook使用Jest去测试React代码。在Angular 2中使用Jasmine测试框架,
Universal & native apps
React和Angular均支持原生(本地)环境,Angular对于应用程序有NativeScript,对于混合App有Ionic。对于React有react-native-renderer和react-native。
JavaScript框架在客户端渲染页面,不利于感知性能,整体用户体验和搜索引擎优化,三个框架库都在寻找帮助,React有next.js。Vue有nuxt.js,Angular有Angular Universal。
学习曲线
Angular有陡峭的学习曲线,它有综合的文档,但是很多时候你会感到困惑,因为事情比听起来更困难。即使你有很深的JavaScript理解,你需要学习框架下的东西。
Vue很容易学习,切换到Vue的公司,因为它看上去对初级开发者更容易。Vue看上去更像纯JavaScript,同时引入一些新的想法:组件,事件驱动模型,单项数据流。
同时React和Angular有它自己的方式,它可能妨碍你,因为你需要调整你的实践使事情按照它们的方式,这可能损害你,因为它不够灵活,这是一个陡峭的学习曲线,它也是有益的,因为你在被迫学习正确的概当你学习这技术。使用Vue,你可以使用古老的JavaScript方式解决问题,在开始时可能比较简单,如果事情处理的不合适,长时间后可能成为一个问题。
当需要调试时,React和Vue有很大的优势,寻找bug更简单,因为有更少的地方去观察,堆栈跟踪在自己的代码和库之间有更好的区分,使用React的人说,它不需要阅读库的源代码,但是当我们调试Angular应用时,我们通常需要调试Angular内部,光明的是,错误信息在Angular4中可能更清晰和更丰富。