作为例子之父,Hello World是每个语言学习之时做的第一个例子,今天我们就来比较一下,使用ES5规范的Hello World和使用Typescript的Hello World有什么异同吧。
ES全称ECMAScript,它实际上是一种脚本在语法和语义上的标准。实际上JavaScript是由ECMAScript,DOM和BOM三者组成的。
ES5相信很多人都用过,绝大多数浏览器都支持ES5,当ES6(ES2015)出来时,加入了很多新特性,对ES5来说,这是一个巨大的飞跃。但是,并非大部分浏览器都能跟上这个脚步,我们如何才可以在还不支持ES6的浏览器中运行ES6呢?
TypeScript是一种由微软开发的自由和开源的编程语言。它是JavaScript的一个超集,而且本质上向这个语言添加了可选的静态类型和基于类的面向对象编程。
它可以将符合ES6规范的ts代码转换为适合ES5规范的js代码,也就是说,我们可以在仅仅支持ES5的浏览器上使用更多特性的ES6代码规范,是不是超酷呢?
index.html
app.js
var App = ng.core.Component({
selector: 'app',
template: 'Hello {{target}}!
'
})
.Class({
constructor: function () {
this.target = 'world';
}
});
ng.platformBrowserDynamic.bootstrap(App);
index.html
<%= TITLE %>
Loading...
<%= INIT %>
app.ts
import {Component} from '@angular/core'
import {bootstrap} from "@angular/platform-browser-dynamic";
@Component({
selector: 'app',
templateUrl: './app.html',
})
class App {
target:string;
constructor() {
this.target = 'world';
}
}
bootstrap(App);
app.html
Hello {{target}}!
输出后的app.js
"use strict";
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
return c > 3 && r && Object.defineProperty(target, key, r), r;
};
var __metadata = (this && this.__metadata) || function (k, v) {
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
};
var core_1 = require('angular2/core');
var browser_1 = require("angular2/platform/browser");
var App = (function () {
function App() {
this.target = 'world';
}
App = __decorate([
core_1.Component({
selector: 'app',
templateUrl: './app.html',
}),
__metadata('design:paramtypes', [])
], App);
return App;
}());
browser_1.bootstrap(App);
输出后的index.html
Switching to Angular 2
Loading...
对于ES5规范下的代码,相信我们都很容易懂,app.js中定义了
但是对于Typescript,我们就需要解释一番了。
Angular2本身是一个JS文件,所以我们需要一个script标签来引入它,并且需要引入一些Angular/TypeScript依赖的文件:
·es6-shim(为了兼容旧浏览器)
·angular2-polyfills(提供跨浏览器的一些基本的标准化,包含的代码专门用于zone,promise和reflection)
·SystemJS(模块加载器,帮助创建模块和解决模块之间的依赖,使复杂的模块加载在浏览器端过程变得容易)
·RxJS(库用与在JS中进行反应式编程)
也就是我们在输出后的index.html的中添加的标签。
import语句定义了在我们代码中需要用到的模块,这里我们导入了两个模块,Component和Bootstrap。我们从@angular/core模块导入了Component模块,@angular/core这部分告诉我们程序在哪里可以找到我们依赖;同样从模块@angular/platform-browser-dynamic中导入bootstrap模块。
我们Angular应用中编写HTML标签,浏览器只认识内置的标签,如
一个基本组件分为两部分:
·Component注解
·定义组件的类
注解会作为元数据添加到您的代码里。当我们在App类上使用@Component,会装饰App类成为一个组件。比如,我们希望用
@Component({
selector:'app'
})
@Component({
selector:'app',
template:'
Hello World!
'
)}
或者通过@Component中的templateUrl选项来添加模板链接(引入的模板)
@Component({
selector:'app',
templateUrl:'./app.html'
)}
System.import("./app")
这行告诉System.js要加载app.js作为主要入口。(但是现在还没有一个app.js,我们的文件还是app.ts,现在就要用到将ts转换为js,非常简单的一行代码,有兴趣的小伙伴可以自行查找)