使用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中提供了依赖注入的概念,使得 ...
随机推荐
- Type.IsContextful 说明
首先看MSDN的说明: 中文:获取一个值,通过该值指示 Type 在上下文中是否可以被承载. 英文:Gets a value indicating whether the Type can be ho ...
- 移动端浏览器和微信浏览器上禁止body的滚动条
一般禁止body滚动的做法就是设置overflow:hidden. 但是很奇怪的发现在移动端浏览器和微信浏览器上这个不起作用,然后我分析了我的写法,就是在body上加了一个class去定义属性,然后改 ...
- MongoDB高可用复制集分片集群搭建
1 逻辑架构 1.1 逻辑架构图 1.2 组件说明 一.mongos(query routers):查询路由,负责client的连接,并把任务分给shards,然后收集结果.一 ...
- python 之 PIP 安装
1.安装的必备包 pip 和 setuptool 都要有, 这个可以从python.org网站下载 // setuptool 安装 下载地址 https://pan.baidu.com/s/1gf ...
- Linux 下Nginx编译安装
Untitled .note-content {font-family: 'Helvetica Neue', Arial, 'Hiragino Sans GB', STHeiti, 'Microsof ...
- <<< jquery简介、开头语法、在线开发手册
简介 jQuery是一个兼容多浏览器的javascript框架,核心理念是write less,do more(写得更少,做得更多).jQuery在2006年1月由美国人John Resig在纽约的b ...
- 10月28日上午 PHP数据访问
1.建一个连接(连接PHP和MYSQL) $db = new MySQLi("localhost","root","666","t ...
- js动态添加的元素不能绑定事件
动态生成的元素,使用.on绑定事件,比如$(document).on("click",".divclick",function(){})
- 转-ArcGIS Engine许可初始化
关于初始化Engine许可的,其实原理都很简单,大家一般都没有问题,但又往往会因为不够细心加上Engine的“小脾气”,让不少程序员都要在这里犯错. 以Engine9.2为例,应用程序是强制初始化许可 ...
- log4j日志工具
一.关于日志 1.日志定义: 项目在运行阶段产生的信息 2.日志级别 最常见的日志级别有4个: error :错误日志 warn:警告日志 info:流程日志 debug:调试日志 优先级从高到低 ...