用Angular2实现Hello world!
由于计划设计的Web服务将采用RIA,所以为了未来的学习样例,也希望选择一些适合RIA的JS框架。因此,我打算先尝试一下Angular2。首先是hello world。
这篇文章与英语版Angular2的快速入门页面内容几乎相同。
我也在思考着是否值得发布这样的文章。但我意识到世界上肯定也有只因为文档是英文而失去动力的人,所以我写了一篇转载了99%原始内容的文章。
虽然我也可以将代码最小化,但考虑到我对Angular2的了解非常有限,可能会发布错误的信息,所以我决定停止这个想法。
这次想做的事情。
- 用Angular2来显示「hello world」。结束。
环境
-
- Microsoft Surface Pro4 (i5 2.4GHz, Mem 4GB)
-
- OS:Windows 10 Pro
-
- node.js v7.1.9
- npm v3.10.9
事前准备
- Windows用のnode.jsをインストール https://nodejs.org/en/
开始构建
按照此网址上的步骤。
创建并移动至本次示例的目录。
当前位置可以是任何地方。(本人选择了C:\work\angular\)
mkdir hello_angular2
cd hello_angular2
创建用于项目的配置文件
包.json
将package.json文件创建在hello_angular2的根目录下。
类似于maven的pom文件,该文件记录了本项目的依赖库集合和包信息,并通过npm命令进行批量下载。(正如maven一样)
在hello world这么简单的示例中,我也曾想过为什么需要这么多依赖库?但由于我还不了解每个库的含义,所以还是按照快速入门的方式进行使用。
package.json是node.js的标准规范,关于每个字段的详细说明,请参考npm package.json的日本语版说明书等资料。
由于本次示例使用了lite-server作为HTTP服务器,所以在scripts.start中进行了相应的描述。
{
"name": "hello_angular2",
"version": "1.0.0",
"scripts": {
"start": "tsc && concurrently \"tsc -w\" \"lite-server\" ",
"lite": "lite-server",
"tsc": "tsc",
"tsc:w": "tsc -w"
},
"licenses": [
{
"type": "MIT",
"url": "https://github.com/angular/angular.io/blob/master/LICENSE"
}
],
"dependencies": {
"@angular/common": "~2.2.0",
"@angular/compiler": "~2.2.0",
"@angular/core": "~2.2.0",
"@angular/forms": "~2.2.0",
"@angular/http": "~2.2.0",
"@angular/platform-browser": "~2.2.0",
"@angular/platform-browser-dynamic": "~2.2.0",
"@angular/router": "~3.2.0",
"@angular/upgrade": "~2.2.0",
"angular-in-memory-web-api": "~0.1.15",
"core-js": "^2.4.1",
"reflect-metadata": "^0.1.8",
"rxjs": "5.0.0-beta.12",
"systemjs": "0.19.39",
"zone.js": "^0.6.25"
},
"devDependencies": {
"@types/core-js": "^0.9.34",
"@types/node": "^6.0.45",
"concurrently": "^3.0.0",
"lite-server": "^2.2.2",
"typescript": "^2.0.3"
}
}
tsconfig.json的释义是TypeScript配置文件。
将tsconfig.json文件创建在hello_angular2的根目录下。
在Angular2中,使用TypeScript是推荐的方式,作者也喜欢使用TypeScript进行编写,所以打算使用TypeScript。
然而,目前支持TypeScript的浏览器非常有限。
因此,这个配置文件用于将TypeScript代码转换为JavaScript。
“target”参数指定要转换成的JavaScript版本,这里使用”es5″表示转换为EcmaScript5。
基本上,项目中的所有.ts文件都会被转换。
如果您想更详细了解 tsconfig.json,请推荐您查看 tsconfig.json(TypeScript配置文件)- @IT。
{
"compilerOptions": {
"target": "es5",
"module": "commonjs",
"moduleResolution": "node",
"sourceMap": true,
"emitDecoratorMetadata": true,
"experimentalDecorators": true,
"removeComments": false,
"noImplicitAny": false
}
}
系统js配置文件
接下来,在hello_angular2文件夹的根目录下创建systemjs.config.js文件。
这是Angular2启动时的基本配置信息。
关于这个配置信息,主要是英文文档,但是如果在Google中搜索”System.config javascript”,会有一些相关的信息出现,如果感兴趣的话,请自行查找。
/**
* System configuration for Angular samples
* Adjust as necessary for your application needs.
*/
(function (global) {
System.config({
paths: {
// paths serve as alias
'npm:': 'node_modules/'
},
// map tells the System loader where to look for things
map: {
// our app is within the app folder
app: 'app',
// angular bundles
'@angular/core': 'npm:@angular/core/bundles/core.umd.js',
'@angular/common': 'npm:@angular/common/bundles/common.umd.js',
'@angular/compiler': 'npm:@angular/compiler/bundles/compiler.umd.js',
'@angular/platform-browser': 'npm:@angular/platform-browser/bundles/platform-browser.umd.js',
'@angular/platform-browser-dynamic': 'npm:@angular/platform-browser-dynamic/bundles/platform-browser-dynamic.umd.js',
'@angular/http': 'npm:@angular/http/bundles/http.umd.js',
'@angular/router': 'npm:@angular/router/bundles/router.umd.js',
'@angular/forms': 'npm:@angular/forms/bundles/forms.umd.js',
'@angular/upgrade': 'npm:@angular/upgrade/bundles/upgrade.umd.js',
// other libraries
'rxjs': 'npm:rxjs',
'angular-in-memory-web-api': 'npm:angular-in-memory-web-api/bundles/in-memory-web-api.umd.js'
},
// packages tells the System loader how to load when no filename and/or no extension
packages: {
app: {
main: './main.js',
defaultExtension: 'js'
},
rxjs: {
defaultExtension: 'js'
}
}
});
})(this);
安装
■ 目前的组成
你好_angular2/
├ 包配置.json
├ 系统配置.js
└ TypeScript配置.json
您好,您可以在hello_angular2目录下执行以下命令。
npm install
我将创建一个用于放置自制脚本的应用程序目录。
mkdir app
应用程序的设置
app模块.ts
在app文件夹里创建一个app.module.ts文件。
由于是.ts文件,需要使用TypeScript编写的用户脚本。
该文件将用于导入此应用程序中要使用的模块。
有关NgModule的详细信息,请参考这个网站“NgModule導入について – Angular2 Info”。
import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { AppComponent } from './app.component';
@NgModule({
imports: [ BrowserModule ],
declarations: [ AppComponent ],
bootstrap: [ AppComponent ]
})
export class AppModule { }
应用/应用组件.ts
在app的直下创建一个app.component.ts文件。
这也是一个使用TypeScript编写的用户脚本。
由于这个组件的配置对于Angular2来说是最重要的,所以我建议你在完成hello world之后尝试指定一些不同的组件来玩耍。
在Angular2的指南中有各种各样的示例供你参考。
import { Component } from '@angular/core';
@Component({
selector: 'my-app',
template: '<h1>Hello World!</h1>'
})
export class AppComponent { }
应用程序/主要.ts
在应用程序的根目录下创建main.ts文件。
这是在应用程序启动时加载的最基本的脚本文件。
名称并不固定,而是根据systemjs.config.js中的”map.app名称”+”packages.app.main”路径中的文件进行加载。
本例中指定了app和./main.js,但是这个.ts文件将会被转换为ES5的main.js文件,并进行加载。
import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
import { AppModule } from './app.module';
const platform = platformBrowserDynamic();
platform.bootstrapModule(AppModule);
创建一个单页面的HTML。
在hello_angular2项目中创建一个名为index.html的文件。
请注意,它不位于app文件夹下。
你刚才在app.component.ts中指定的组件将被绑定到这里。
<html>
<head>
<title>Angular QuickStart</title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="styles.css">
<!-- 1. Load libraries -->
<!-- Polyfill for older browsers -->
<script src="node_modules/core-js/client/shim.min.js"></script>
<script src="node_modules/zone.js/dist/zone.js"></script>
<script src="node_modules/reflect-metadata/Reflect.js"></script>
<script src="node_modules/systemjs/dist/system.src.js"></script>
<!-- 2. Configure SystemJS -->
<script src="systemjs.config.js"></script>
<script>
System.import('app').catch(function(err){ console.error(err); });
</script>
</head>
<!-- 3. Display the application -->
<body>
<my-app>Loading...</my-app>
</body>
</html>
样式.css
你好_angular2,我們在它下面創建了一個style.css。
這只是一個普通的CSS,沒有什麼特別之處。
/* Master Styles */
h1 {
color: #369;
font-family: Arial, Helvetica, sans-serif;
font-size: 250%;
}
h2, h3 {
color: #444;
font-family: Arial, Helvetica, sans-serif;
font-weight: lighter;
}
body {
margin: 2em;
}
Angular2的启动
■ 目前的构成
你好,Angular2/
├ app/
│ ├ app.component.ts
│ ├ app.module.ts
│ └ main.ts
├ node_modules/
├ index.html
├ package.json
├ styles.css
├ systemjs.config.js
└ tsconfig.json
我们将执行`npm start`命令,由于`package.json`中有`lite-server`的配置,所以在构建完成后会自动启动一个HTTP服务器并打开浏览器。
那么,开始行动吧。
npm start
如果浏览器启动并显示以下内容,则表示成功。
只需要一个选项:稍稍增加编辑。
由于只有这么少的内容实在是太没有创意了,我会稍微添加一点内容。
编辑app/app.component.ts。
我們將編輯剛剛寫的 app.component.ts 文件,並增加 Component 的指定。
import { Component } from '@angular/core';
@Component({
selector: 'my-app',
template: '<h1>Hello World!</h1>'
})
export class AppComponent { }
@Component({
selector: 'key-up2',
template: `
<input #box (keyup)="onKey(box.value)">
<p>{{values}}</p>
`
})
export class KeyUpComponent_v2 {
values = '';
onKey(value: string) {
this.values += value + ' | ';
}
}
app.module.ts 的原始代码
这个也是一样的。
import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { AppComponent,KeyUpComponent_v2 } from './app.component';
import { Ng2TableModule } from 'ng2-table/ng2-table';
@NgModule({
imports: [ BrowserModule ],
declarations: [ AppComponent,KeyUpComponent_v2 ],
bootstrap: [ AppComponent,KeyUpComponent_v2 ]
})
export class AppModule { }
编辑index.html
请编辑之前写的index.html文件,增加key-up2标签。
<html>
<head>
<title>Angular QuickStart</title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="styles.css">
<!-- 1. Load libraries -->
<!-- Polyfill for older browsers -->
<script src="node_modules/core-js/client/shim.min.js"></script>
<script src="node_modules/zone.js/dist/zone.js"></script>
<script src="node_modules/reflect-metadata/Reflect.js"></script>
<script src="node_modules/systemjs/dist/system.src.js"></script>
<!-- 2. Configure SystemJS -->
<script src="systemjs.config.js"></script>
<script>
System.import('app').catch(function(err){ console.error(err); });
</script>
</head>
<!-- 3. Display the application -->
<body>
<my-app>Loading...</my-app>
<key-up2></key-up2>
</body>
</html>
浏览器展示
好的,这次就结束了。(很抱歉)
下次计划使用Go + TaskQueue + CloudDatastore + Angular2.