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理由的更多相关文章

  1. Angular2+URL中的 # 引发的思考

    1.先分析 # 的作用 1.1. # 的涵义 #代表网页中的位置.其右面的字符就是该位置的标识符.比如,http://www.example.com/index.html#print就代表网页inde ...

  2. Angular2、4入门基础知识(小的概念)

    1. 使用引用符来格式化HTML代码. @Component({ selector: 'app-heroes', templateUrl: './heroes.component.html', sty ...

  3. Ionic2优于Ionic1的6个理由

    经历了一个从0到有的app的开发,我已经很熟悉Ionic1了,在此期间我曾发现过Ionic1的一些bug,和一些不合理的地方(根基版本 不同,后续我会陆续发表这些文章),我甚至在此期间对Ionic1进 ...

  4. Angular2入门系列教程7-HTTP(一)-使用Angular2自带的http进行网络请求

    上一篇:Angular2入门系列教程6-路由(二)-使用多层级路由并在在路由中传递复杂参数 感觉这篇不是很好写,因为涉及到网络请求,如果采用真实的网络请求,这个例子大家拿到手估计还要自己写一个web ...

  5. Angular2学习笔记(1)

    Angular2学习笔记(1) 1. 写在前面 之前基于Electron写过一个Markdown编辑器.就其功能而言,主要功能已经实现,一些小的不影响使用的功能由于时间关系还没有完成:但就代码而言,之 ...

  6. Angular杂谈系列1-如何在Angular2中使用jQuery及其插件

    jQuery,让我们对dom的操作更加便捷.由于其易用性和可扩展性,jQuer也迅速风靡全球,各种插件也是目不暇接. 我相信很多人并不能直接远离jQuery去做前端,因为它太好用了,我们以前做的东西大 ...

  7. Angular2入门系列教程6-路由(二)-使用多层级路由并在在路由中传递复杂参数

    上一篇:Angular2入门系列教程5-路由(一)-使用简单的路由并在在路由中传递参数 之前介绍了简单的路由以及传参,这篇文章我们将要学习复杂一些的路由以及传递其他附加参数.一个好的路由系统可以使我们 ...

  8. Angular2入门系列教程5-路由(一)-使用简单的路由并在在路由中传递参数

    上一篇:Angular2入门系列教程-服务 上一篇文章我们将Angular2的数据服务分离出来,学习了Angular2的依赖注入,这篇文章我们将要学习Angualr2的路由 为了编写样式方便,我们这篇 ...

  9. Angular2入门系列教程4-服务

    上一篇文章 Angular2入门系列教程-多个组件,主从关系 在编程中,我们通常会将数据提供单独分离出来,以免在编写程序的过程中反复复制粘贴数据请求的代码 Angular2中提供了依赖注入的概念,使得 ...

随机推荐

  1. 中文乱码?不,是 HTML 实体编码!

    When question comes 在 如何用 Nodejs 分析一个简单页面 一文中,我们爬取了博客园首页的 20 篇文章标题,输出部分拼接了一个字符串: var $ = cheerio.loa ...

  2. Linq to Xml读取复杂xml(带命名空间)

    前言:xml的操作方式有多种,但要论使用频繁程度,博主用得最多的还是Linq to xml的方式,觉得它使用起来很方便,就用那么几个方法就能完成简单xml的读写.之前做的一个项目有一个很变态的需求:C ...

  3. 转载(sublime text 2 调试python时结果空白)

    sublime text 2 调试python时结果空白 之前用的时候都一切正常,今天突然就出现了这个问题.按ctrl+b执行的时候结果只有空白,查了很多文章都只提到了中文路径.系统路径等等,没有解决 ...

  4. RapidJSON 代码剖析(二):使用 SSE4.2 优化字符串扫描

    现在的 CPU 都提供了单指令流多数据流(single instruction multiple data, SIMD)指令集.最常见的是用于大量的浮点数计算,但其实也可以用在文字处理方面. 其中,S ...

  5. UML类图关系(泛化 、继承、实现、依赖、关联、聚合、组合)

    UML类图关系(泛化 .继承.实现.依赖.关联.聚合.组合) 继承.实现.依赖.关联.聚合.组合的联系与区别 分别介绍这几种关系: 继承 指的是一个类(称为子类.子接口)继承另外的一个类(称为父类.父 ...

  6. Android drawableleft drawableTop 设置图片的大小

    例子: Drawable drawable=getResources().getDrawable(R.drawable.xx); //获取图片 drawable.setBounds(left, top ...

  7. Asp.Net通过HttpModule实现URL重写

    首先总结一下为什么要对URL进行Rewrite,比如我可以把/Default.aspx?param=3替换成/Home/Default/3(类似mvc). 一.缩短url,隐藏实际路径提高安全性; 二 ...

  8. C#文本写入文件,追加写入文件

    写入文件和这个对象 StreamWriter using (StreamWriter fs = new StreamWriter(path, true)) { fs.WriteLine(strLog) ...

  9. java 随机数 优惠码 生成 随机字串

    package test; import java.util.HashSet; import java.util.Random; import java.util.Set; public class ...

  10. BZOJ1483: [HNOI2009]梦幻布丁

    传送门 名字起得很高端实际上很简单的算法hhh 启发式合并 简单讲就是一些合并一堆队列的题可以用启发式合并,或者说这是一个思想.每次把小的合并到大的部分,均摊复杂度$O(MlogN)$. //BZOJ ...