赞
踩
近年来,Web 开发技术的发展日新月异,各种框架层出不穷。在这样的大背景之下,2010年10月,Google首次发布了自己的 Web开发框架,名为 AngularJS,也叫Angular,或者简称为ng。
在Angular框架中,提出很多新的思想和概念,比如受到众多开发者喜爱和热议的“双向数据绑定”,在同时期以及之后的web框架中也都出现了“数据绑定”概念,包括最近大热的React、Vue等框架。除了上述特点还有MVC、指令、模块、$scope、controller、依赖注入、路由等。
在 Google 内部有非常多的产品都在使用Angular,在国内,也有非常多的企业正在使用Angular1.x 开发自己的应用,包括移动APP,其中有很多行业巨头。
Angular1.x显然非常成功,那么,为什么要剧烈地转向Angular2?
AngularJS当初是提供给设计人员用来快速构建HTML表单的一个内部工具。随着时间的推移,各种特性 被加入进去以适应不同场景下的应用开发。然而由于最初的架构限制(比如绑定和模板机制),性能的 提升已经非常困难了。
在语言方面,ECMAScript6的标准已经完成,在2015年6月正式发布了。这意味着浏览器将很快支持,例如:模块、类、lambda表达式、generator等新的特性,而这些特性将显著地改变JavaScript的开发体验。
在开发模式方面,Web组件也将很快实现。然而现有的框架,包括Angular1.x对WEB组件的支持都不够好。
如今Web环境已经发生了显著地变化,到处都是手机和平板。Angular1.x没有针对移动 应用特别优化,并且缺少一些关键的特性,比如:缓存预编译的视图、触控支持等。
说实话,Angular1.x太复杂了,学习曲线太陡峭了,这让人望而生畏。Angular团队希望在Angular2中将复杂性封装地更好一些,让暴露出来的概念和开发接口更简单。
Angular不只是试图跟上,他们还推动了大量的标准的应用,增强了现有的应用架构。
2014年9月,Angular团队在 ng-europe会议上公开宣布了第二个大版本的开发计划,也就是大家熟知的 Angular2,与此对应,之前的版本就称为Angular 1.x了。
目前,Angular2已经于2016年9月正式发布。Angular2依然保持了最初的核心设计理念,但进行了简化。Angular2的核心灵魂只有一个,那就是组件化(Component),而其它那些细碎的东西,比如Service、Route、Pipe,都是utils 而已。
因此,在使用 Angular2 的时候,开发者只要学会使用 Coponent 就解决了一大半问题。但是与 Angular 1.x相比,在各种语法细节上发生了大幅度的修改。
大道至简,LESS is MORE。
有了 Component 全局的概念之后,我们来看看与 Angular 1.x 相比Angular2 发生了什么变化?
在 Angular 1.x 里面,$scope 是一个相当强大又相当可怕的东西,由于在很多需要回调的场景之下,脏值检测机制无法感知到$scope 上发生的变化,因此经常需要开发者自己手动调用$apply() 方法。典型的场景有:事件回调、setTimeout回调、Ajax回调等等。
Angular2 响应社区的强烈呼吁,删除(或者说隐藏)了 $scope的概念,开发者不再需要感知到它的存在。另外,Angular2在底层引入了 zone.js,所以即使在各种回调函数中修改数据模型也不需要手动调用$apply() 方法了。
这就意味着 Controller 不再是一个独立的组件,它合并到了 Component 内部。这是一个非常大的演进,因为从大量的实战经验来看,在复杂的业务逻辑中复用Controller 几乎是不可能的。
在其它同类的前端框架里面也有类似的处理手法,例如 Backbone 虽然也强调 MVC 的概念,但是它也没有定义单独的Controller 类,Controller也是合并在 View里面编写的。
众所周知,“双向数据绑定”之所以能运行,是因为Angular 底层有“脏值检测”这么一个神奇的机制。而实际上Angular 1.x 里面的脏值检测机制的运行效率非常差,这就是为什么大家一直在抱怨绑定的对象不能太多、太深的原因。
Angular2 大幅度演进了这一机制,不仅引入了单向绑定,还增加了各种检测策略,例如:只检测一次、利用JIT 动态生成脏值检测代码等等。毫无疑问,有了这些工具之后,数据绑定效率不再是问题。
Angular 1.x 里面有一个非常讨厌的问题,框架内置的路由机制不支持嵌套使用,这就导致开发者在日常的开发过程中不得不依赖于第三方的ui-router 库。Angular2没有这个问题了,因为 Angular2的路由是基于 Component的,天然支持嵌套。
Angular2 中的依赖注入写法与 Java中的注解(Annotation)非常类似,如果你熟悉Spring 注解的用法,那么使用Angular2 的依赖注入几乎没有学习成本。当然,概念上是有区别的,Angular2中叫 Decorator(装饰器),更加贴近Python 里面的Decorator 的概念。
这是最大的一个变更,有很多人担忧这样是否会带来比较大的学习成本,实际的情况并非如此。因为 TypeScript的语法与 Java 或者 C# 非常类似,因此对于从后端转过来的开发者来说,学习这门语言几乎是没有难度的。
还有一个重要的方面需要大家注意:TypeScript 是 Microsoft 开发的一门语言,Google+Microsoft这样的组合会产生多么强大的推动力,大家可以想象。
Google 和 Microsoft本身都是重要的浏览器厂商,Chrome和 IE 加起来的市场份额占据了一大半的市场份额,未来如果两款浏览器内建 TypeScript引擎,很显然 TypeScript和 Angular的前景将会一片光明。这一优势是大量的同类技术框架根本无法企及的,因此大家在做技术选型的过程中需要综合考虑这些情况作出理性的决策。
两个版本的 UI 控件库都实现了Material Design 所提出来的设计风格,Material Design是 Google提出来的一种 UI设计原则,终极的目标是:用一套 UI设计规范来兼容各种各样的设备,例如桌面、平板、大屏幕的电视、车载系统、甚至 watch,从而保证用户体验的一致性。
为什么有Angular1.x、Angular2.x,没听说有Angular3.x就直接到了Angular4.x?
根据语义化命名版本规则(参考:http://semver.org/lang/zh-CN/),此前版本中发布的route组件破坏性升级到了3.x,所有此次就统一命名为4.x。
Angular 4 在2017年03月24日正式发布,这里还是先明确下官方的说法,别被angular发布4.0正式版吓到了。
从2.0开始angular.js已经不叫angular.js了,就叫angular(少了.js)只是版本号是2.x。而日常我们为了区别angular.js 1.x和angular的2.x的版本,称之为angular2。
后来官网发现这样的命名方式并不好,决定将版本号语义化(具体可以参考语义化版本 2.0.0)。但是之前route组件因为破坏性升级版本号到了3.x,为了统一版本号,直接将angular提至4.0版本,这样才有了angular发布了4.0正式版。
angular.js 1.x到angular2确实是一个非常大的升级,以至于api、实现原理、框架思路都是完全不一样的。可以毫不夸张的说,学习angular2就和学一个全新的框架并没有太大区别。
BUT!angular2.x到angular4.0破坏性升级并不多,也很容易直接升级到4.0版本。
链接:https://www.zhihu.com/question/57632772/answer/153944403
说明:本文内容根据网上资料整理而来,如有侵权请及时联系作者,给您带来的不变请见谅。严禁转载和用于商业用途!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。