近年,前端框架发展迅猛,各种框架项目争艳,为首的有流行于歪果仁群体的AngularJS、国人热爱的Vue和人见人爱的React。于我本人而言尽管各种框架层出不穷,但看来看去也就那么回事,在选择上面根据自己的喜好就好。《Angular 2修行》这个系列文章主要来聊聊Angular 2,本文通过对比Angular 1.x来说说Angular 2的“激进”做法。
一个问题:为什么Angular 2不向下兼容Angular 1.x?
web技术更新迭代速度之快,让后端开发同学纷纷成为吃瓜群众,后端同学吃瓜看戏时,前端同学却在疲于学习,没有办法,这就是IT行业的魅力吧。由于Web的发展,导致Angular 1.x已无法发挥最新Web技术的威力,并且Angular 1.x的一些设计缺陷导致使用者常常困于其中,下面就来说说这些Angular 1.x身上的“毛病”。
- Web Component已经发布,未来必定会被各浏览器厂商支持,而其与Angular 1.x的指令实现较为类似,这样Angular 1.x为了支持Web Component需要修改自己的指令实现,在Angular 1.x中有些指令实现声名狼藉,如:transclusion(嵌入)问题。Angular 核心团队为了避免功能重复,决定在Web Component的基础上全面支持新的标准。
- Web Worker 的发明改变了JavaScript的单线程操作,允许将计算密集任务移至另一个线程里面去执行。在Angular 1.x中,每绑定一块数据就会增加一个新的监视器,这样每次digest循环就需要遍历大量的监视器,在指定的上下文中执行表达式将结果与上次相比较执行是否修改。Angular 1.x中digest的这一系列操作都造成框架和DOM紧紧的耦合在一起,所以要想在Angular 1.x的基础上修改框架,将计算密集任务移到Web Worker 中去是相当复杂的修改。
一种优化:Angular 2相比Angular 1.x优化了什么?
Angular 1.x被称为Model View Whatever(MVW)框架,意为既是MVC,也是MVP。在Angular 1.x中,视图(View)又指令组成,各种指令之间相互协作组成功能完整的用户界面。服务(Service)用于封装应用的业务逻辑。控制器(Controller)负责处理用户输入,并把执行过程代理给对应的服务。
Angular 应用的最佳实践:控制器根本不应该操作DOM,而是应该把访问和操作DOM的逻辑放到指令中去。如果控制器中出现重复逻辑,则应该将重复部分封装成一个服务,然后使用服务注入的方法引用。
下面是Angular 2基于Angular 1.x做的修改:
- 删除了ng-controller指令,解决了滥用该指令导致控制器满天飞的情况,使用组件和指令来取代Angular 1.x中控制器的功能。
- 删除了scope对象,直接把属性添加到UI组件上,然后进行绑定操作即可。
- 使用ECMAScript 2016装饰器(decorator)语法对使用依赖注入(DI)的代码进行了注释,利用反射机制来装饰(decorator)指定对象的行为。
- 提升用户体验,用更简单优雅的方式来构建对SEO友好的应用。
- Angular 2采用单向数据流设计解耦了数据绑定之间的依赖关系,所以digest没有存货时间(TTL)的概念,这样拥有了更明确的数据流,digest只需要循环一次提升了性能,创建对immutalbe/observable(不可变/可观察)数据模型友好的应用程序,从而可以做深度优化。
- 属性值会在当前组件的上下文中执行,同时为传递字面量提供了不同的语法。
- Angular 2将脏值检测机制与内核解耦,这样方便开发不同的脏值检测策略以适应不同环境。现在Angular 2中存在两种脏值检测机制:动态脏值检测和JIT脏值检测。