用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

如果浏览器启动并显示以下内容,则表示成功。

angular.PNG

只需要一个选项:稍稍增加编辑。

由于只有这么少的内容实在是太没有创意了,我会稍微添加一点内容。

编辑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>

浏览器展示

angular2.PNG

好的,这次就结束了。(很抱歉)

下次计划使用Go + TaskQueue + CloudDatastore + Angular2.

广告
将在 10 秒后关闭
bannerAds