使用Angular2理由
1. 组件化
组件化编程是web 发展的一个趋势,Angular2提供高效简单的组件开发方式,使程序开发更加关注业务逻辑的实现,而不用关心如何加载组件和模块,如何引用及依赖注入的实现等。
如下代码所示,Angular2提供注解来开发组件,使组件开发变得简单方便,不需要对现行代码进行重大重构或者改写,就可以使用新的功能。Angular2关注与组件的开发,通过组件间的组合来实现业务逻辑,代码关注点更加集中,从而使得组件编程变得异常简单。
|
import {Component} from '@angular/core'; import {bootstrap} from '@angular/platform-browser-dynamic'; @Component({ selector: 'my-app', template: `<h1>My First Angular 2 App</h1>` }) export class AppComponent { --business logic here } bootstrap(AppComponent); |
2. 纯粹的JS
通过上面的示例,可以发现 Angular2使用纯粹的javascript代码编写,调用的方式采用原生的window api,没有其他额外的代码特性。使用原生的javascript代码即可编写,减少了Angular1里面$scope,$timeout等非原生API,这使得开发,测试等环节都变得简单,降低了学习成本。因为采用的都是原生API的方式,Angular2 不仅能够自己写代码片段,而且可以方便的引用他人所写的代码。
3. 类型编程
Angular2不一定要使用TypeScript来编写,然而为什么我们要使用一种浏览器无法识别的语言,然后编译成另外一种语言去使用呢?答案就是:类型检查,文档化,便于共享。
举个简单的例子,这个例子十分简单,简单的计算两个数字的和,并将结构返回。看上去木有什么问题,但是我们传递的参数有可能来自于某个对象或者json数据,当我们将非数字传递进去的时候,得到的结果却不尽人意。
|
function plus(a, b) { return a + b; } let a = plus(2+3); // a = 5 let b = plus(‘2’+’3’); // a = ‘23’ |
当我们使用TypeScript进行编写这段代码的时候,传入非数字类型的参数时在解析的过程中就会提示类型错误。
|
function plus(a:number, b:number):number { return a + b; } let a = plus('2'+'3'); // error |
4. 性能提升
在Angular1中,绝大多数场景下性能都不是问题,不过因为其代码中存在的一个用来实现脏检查的三重循环而饱受抨击。于是,在Angular 2中,通过重新设计和引入新技术,从原理上对速度进行了提升,据官方说是把“变更检测”的效率提升了500%,在“变更检测”算法上做了两项主要的改进:
(1). 在设计上,将以前的“多轮检查、直到稳定”策略直接转变为“一轮检查、直接稳定”策略。
(2). 在实现上,把“变更检测”算法移入了由WebWorker创建的辅助线程中执行,从JavaScript主线程隔离开来,执行完“变更检测”,再通知主线程。
举一个对比的例子,数据量是30*500:
ng1核心代码
|
<html ng-app="app"> <head> <title>Angular1 Example</title> <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.5.0/angular.min.js"></script> <script> angular .module('app', []) .controller('appCtrl', function($scope, $interval) { var gridWidth = 30; var gridHeight = 500; var interval = 50; var changePerInterval = 10000; var names = ['Joe', 'Michael', 'David', 'Jones', 'Phil', 'Johnson', 'Janes', 'Anna', 'Hugo', 'Lina', 'Scotte', 'Nam', 'Tran', 'Bill', 'Mark', 'Rihanna', 'Justin', 'Bieber', 'James', 'Cameron', 'Peter', 'Anderson', 'Ronaldo', 'Scholes', 'Giggs', 'Lee', 'Cedric', 'Young', 'Zim', 'Hue', 'Zac', 'Jonas', 'Miley', 'Thomas', 'September', 'Green', 'Red', 'Rose', 'Pink']; $scope.grid = createGrid(); beginDataChanges(); function createGrid() { var grid = []; for (var row = 0; row < gridHeight; row++) { grid[row] = []; for (var column = 0; column < gridWidth; column++) { grid[row].push(getRandomName()); } } return grid; } function getRandomNumber(maxBound) { return Math.floor(Math.random() * maxBound); } function getRandomName() { var i = getRandomNumber(names.length); return names[i]; } function beginDataChanges() { $interval(function() { $scope.grid = createGrid(); }, interval); } }); </script> </head> <body ng-controller="appCtrl"> <table> <tr ng-repeat="row in grid track by $index"> <td ng-repeat="name in row track by $index"> {{name}} </td> </tr> </table> </body> </html> |
ng2 核心代码
|
export class AppCmp { private grid: any; private gridWidth = 30; private gridHeight = 500; private interval = 50; private changePerInterval = 10000; private names = ['Joe', 'Michael', 'David', 'Jones', 'Phil', 'Johnson', 'Janes', 'Anna', 'Hugo', 'Lina', 'Scotte', 'Nam', 'Tran', 'Bill', 'Mark', 'Rihanna', 'Justin', 'Bieber', 'James', 'Cameron', 'Peter', 'Anderson', 'Ronaldo', 'Scholes', 'Giggs', 'Lee', 'Cedric', 'Young', 'Zim', 'Hue', 'Zac', 'Jonas', 'Miley', 'Thomas', 'September', 'Green', 'Red', 'Rose', 'Pink']; constructor() { this.grid = this.initializeGrid(); this.beginDataChanges(); } initializeGrid() { var grid = []; for (var row = 0; row < this.gridHeight; row++) { grid[row] = []; for (var column = 0; column < this.gridWidth; column++) { grid[row].push(this.getRandomName()); } } return grid; } getRandomNumber(maxBound) { return Math.floor(Math.random() * maxBound); } getRandomName() { var i = this.getRandomNumber(this.names.length); return this.names[i]; } beginDataChanges() { setInterval(() => { this.grid = this.initializeGrid(); }, this.interval); } } |
在chrome查看性能分别是:ng1的平均时长是360ms左右,ng2的平均时长是260ms左右,性能提升100ms,虽然木有达到500%,但是提升还是有较大的优化。
ng1性能:

ng2性能:
使用Angular2理由的更多相关文章
- Angular2+URL中的 # 引发的思考
1.先分析 # 的作用 1.1. # 的涵义 #代表网页中的位置.其右面的字符就是该位置的标识符.比如,http://www.example.com/index.html#print就代表网页inde ...
- Angular2、4入门基础知识(小的概念)
1. 使用引用符来格式化HTML代码. @Component({ selector: 'app-heroes', templateUrl: './heroes.component.html', sty ...
- Ionic2优于Ionic1的6个理由
经历了一个从0到有的app的开发,我已经很熟悉Ionic1了,在此期间我曾发现过Ionic1的一些bug,和一些不合理的地方(根基版本 不同,后续我会陆续发表这些文章),我甚至在此期间对Ionic1进 ...
- Angular2入门系列教程7-HTTP(一)-使用Angular2自带的http进行网络请求
上一篇:Angular2入门系列教程6-路由(二)-使用多层级路由并在在路由中传递复杂参数 感觉这篇不是很好写,因为涉及到网络请求,如果采用真实的网络请求,这个例子大家拿到手估计还要自己写一个web ...
- Angular2学习笔记(1)
Angular2学习笔记(1) 1. 写在前面 之前基于Electron写过一个Markdown编辑器.就其功能而言,主要功能已经实现,一些小的不影响使用的功能由于时间关系还没有完成:但就代码而言,之 ...
- Angular杂谈系列1-如何在Angular2中使用jQuery及其插件
jQuery,让我们对dom的操作更加便捷.由于其易用性和可扩展性,jQuer也迅速风靡全球,各种插件也是目不暇接. 我相信很多人并不能直接远离jQuery去做前端,因为它太好用了,我们以前做的东西大 ...
- Angular2入门系列教程6-路由(二)-使用多层级路由并在在路由中传递复杂参数
上一篇:Angular2入门系列教程5-路由(一)-使用简单的路由并在在路由中传递参数 之前介绍了简单的路由以及传参,这篇文章我们将要学习复杂一些的路由以及传递其他附加参数.一个好的路由系统可以使我们 ...
- Angular2入门系列教程5-路由(一)-使用简单的路由并在在路由中传递参数
上一篇:Angular2入门系列教程-服务 上一篇文章我们将Angular2的数据服务分离出来,学习了Angular2的依赖注入,这篇文章我们将要学习Angualr2的路由 为了编写样式方便,我们这篇 ...
- Angular2入门系列教程4-服务
上一篇文章 Angular2入门系列教程-多个组件,主从关系 在编程中,我们通常会将数据提供单独分离出来,以免在编写程序的过程中反复复制粘贴数据请求的代码 Angular2中提供了依赖注入的概念,使得 ...
随机推荐
- MVC之前的那点事儿系列(8):UrlRouting的理解
文章内容 根据对Http Runtime和Http Pipeline的分析,我们知道一个ASP.NET应用程序可以有多个HttpModuel,但是只能有一个HttpHandler,并且通过这个Http ...
- C#-WebForm-WebForm开发基础、如何给控件注册事件?——事件委托写法、http无状态性、三层结构
(小知识 - xml:可扩展的标记语言 html:超文本标记语言) 一.创建WebForm:新建→网站 此时文件夹中只有一个 config 文件,打开后 二.在项目下右键添加新项 在设计页面中打开 从 ...
- HTML5图形图像处理技术研究
摘要:图形图像处理平台大部分是传统的C/S架构的桌面应用程序,维护困难,共享性差,而B/S架构的Web程序具有易维护.易共享的优点.本文研究了基于HTML5的Web图形图像处理技术,用HTML5实现了 ...
- js之 matches (可以取代jq的 delegate 方法)
问题:请给#wrap 下面的子元素添加点击事件! <div id="wrap"> <a class="btn" href="http ...
- Alpha阶段第一次Scrum Meeting
Scrum Meeting Alpha 情况简述 Alpha阶段第一次Scrum Meeting 敏捷开发起始时间 2016/10/18 00:00 敏捷开发终止时间 2016/10/20 00: ...
- 如何实现CDN的ns智能解析和动手验证Akamai的实现
1.什么是ns智能解析 通常CDN业务中,智能解析域名,是根据请求方ip的不同给出不同的A记录. 而ns智能解析,是根据请求方ip的不同让他去不同的ns上解析域名,把ns推向离用户更近的边缘节点来缩短 ...
- R语言读取本地文件注意事项
R里面应该用/,而不是\ ,或者用两个\\ R区分大小写,所以应该用C:,而不是c:
- <!DOCTYPE>标签的定义与用法
<!DOCTYPE> 声明不是 HTML 标签:它是指示 web 浏览器关于页面使用哪个 HTML 版本进行编写的指令. 在 HTML 4.01 中,<!DOCTYPE> 声明 ...
- 谈谈java开发
1.不要让未来的决策阻止你现在前进的方向 一步步列出每个步骤,那么对于现在应该专注于做什么,就一目了然了.你也不会浪费 时间去担心应该以后操心的事情. 2.不要让自信诱骗你忘事 当你去学习一个新概 ...
- Google Map API V3开发(6) 代码
Google Map API V3开发(1) Google Map API V3开发(2) Google Map API V3开发(3) Google Map API V3开发(4) Google M ...