AngularJS 2 尽管还在Alpha阶段,但主要功能和文档已经发布。让我我们了解下Angular 1 和 2 的区别,以及新的设计目标将如何实现。 Angular 2 当前仍处于 Alpha/开发预览阶段,但是主要功能和核心文档都已经可用了。让我们一起了解下 Angular 2 的设计目标,以及实现它们的计划:
|
Angular 2 主要目标Angular 2 的主要目标是创建一个简单易用并且快速工作的 web 框架。让我们看看这是如何达到的: 目标:更易于推论在当前版本的 Angular 中,我们有时不得已对应特定的使用场景推论框架内部构建,比如必须推论应用事件初始化和摘要循环:
为了使 Angular 2 更易于推论,一个目标是创建更多开箱即用的透明内部构建。开始之前,让我们看看 Angular 1 的绑定机制是如何实现的,然后如何使它更透明。 |
Angular 1 如何实现绑定
|
Zones 介绍
|
1
2
3
4
|
element.addEventListener( 'keyup' , function () { console.log( 'Key pressed.' ); }); }); |
不再需要 $scope.apply 或 $scope.digest,每样东西都透明地工作。或许我们不必推论出 zones 适用于大多数一般场景,但是可以通过使用 VmTurnZone 在 Angular zone 外运行代码。
更为快速的检测一个单向绑定 它提供了一项检测单向绑定的机制,这项机制可以允许 Javascript 虚拟机对于代码到源代码的实时编译进行优化和完善。相对于递归性扫描对像的变化,这份机制会创建一个方法,这个方法将在 Angular 启动时去检查这个绑定是否已经改变。有了这样的一个检测函数,我们很容易的自己亲手编写类似函数来测试绑定对象的变化,同时它也很容易被虚拟机优化。 避免扫描部分组件树 Angular2 也可以让开发者为变化检测机制做出相应的一些保障,而不用不断地扫描一部分的组件树。就基本上来说,开发者将有两个选择:
|
目标: 提升模块化
|
将 npm 优化为前端包的管理工具同时 Angular 团队一直尝试改进 NPM,让它变得更加前端友好化;不仅仅是对于 Angular 而言,同时也是对于任何前端 library 而言。 而 Angular 2 则没有这样的问题,假如我们选择npm, 我们完全可以利用新型的ES6 模块加载器,ES6通过利用es6-module-loader pollyfill 使其变成一个标准的同步模块加载器。 目标: 改进依赖注入在Angular 1 的世界里,依赖注入在构建多模块应用时是一项技术的飞跃, 但是在一些极端的案例中,如果不做出一些重要的变化是不能解决这些问题的。 |
Angular 1 包含对象全局池
|
Angular 1 的多重依赖注入机制在 Angular 1 中, 我们可以使用在多重地方使用不同的方法进行注入:
Angular 2 将会作出怎样的该进而在 Angular 2 中有且仅有一种依赖注入机制: 在构造函数中通过类型注入。
事实上,如果只有一种机制,那么它将变得更加容易学习。同时这种依赖注入器是类似层级结构,在不同层次的组件树,有可能实现对相同类型的不同实现。 |
如果一个组件没有定义依赖,它会代理给上层注入器查找依赖,依次往上。这让 Angular 2 提供原生的懒加载成为可能。 目标:对 Web Component 友好Web Components 是 web 的未来,Angular 2 一开始就打算跟未来的的 web component 库良好协作。 为此,Angular 2 模板语法的一个目标就是保持特性定义简洁,不将任何 Angular 表达式置于其中 —— 一切都通过属性绑定。 为了理解为什么这个很重要,来看下面的例子:
这里有个跟未来 web component 交互的 Angular 1 组件。 |
这里有什么问题呢?web component 的行为跟浏览器组件的行为类似,比如有 img 标签。 因此,在页面初始化并且在 Angular 介入之前,Angular 表达式将被传给组件,并直接作用于它。比如 image 元素用提供的 url 立即加载图片。 这也是为什么需要像 ng-src 这样的属性来克服这个问题。 Angular 2 如何做到更好地跟 Web Components 交互?Angular 2 的模板语法会避免绑定到普通属性,除非要读取常量:
[setting] 是一个往组件属性写入表达式值的属性绑定。为了避免跟 web component 互操作问题,在普通属性里绝不会出现 Angular 表达式。 |
支持 Shadow DOMWeb 组件的主要特征之一就是 Shadow DOM。 这是浏览器自身的一种机制,它允许构建本地进行查找组件,看起来是select新的一种实现方式。 一个web组件还是可以通过正常的HTML/CSS 脚本实现,但是同时从主页面隔离了。在某种程度上来说,就像是在同一个iframe里拥有各自的document根节点。 由于现阶段只有 Chrome 才实现了 Shadow DOM, Angular 2 通过以下3种机制来支持它:
|
目标:原生移动支持 – iOS 和 Android
|
目标:为服务器端渲染提供支持支持服务器端的渲染对于搜索引擎的优化和用户感知体验来说是非常重要的;在一个比较大型的Angular 1 的应用中,即使使用了预先定义的缓存模块,我们可以清楚地看到当应用开始启动时,页面的加载过程。 这时候看来 Angualr2 的这部分特征不是很清晰明朗,但是这种思路或许可以从以下几个方面得到体现:
|
目标: 增加测试可行性
|
引入独立的渲染层会使单元测试更快,依赖更少,更方便代码的书写和维护,可以更频繁地使用。 目标: 迁移到 Angular 2Angular 2 的目标之一是为 Angualr 1 提供一个清晰的迁移路径。Angular 2 最初版本发布临近时这会变得更加清晰,但是现在路由可能是一个主要的可行迁移办法。 新的 Angular 2 路由向下兼容 Angular 1,将允许一个工程同时有 Angualr 1 和 Angular 2 路由 。 |
结论
|
本文转自:开源中国社区 [http://www.oschina.net]
本文标题:Angular 1 vs. Angular 2 深度比较
本文地址:http://www.oschina.net/translate/angular-1-vs-angular-2-a-high-level-comparison
参与翻译:skull, 陶大头, wancheng, 李中凯, 无若, 小编辑
英文原文:Angular 1 vs. Angular 2 – A High-level Comparison