天天看點

Angular2 快速入門(TypeScript + Webpack) - Jean-Xu

Angular2 快速入門(TypeScript + Webpack)

2016年9月底,谷歌釋出了 Angular2 的正式版,可謂衆望所歸。相比 Angular1.x,Angular2 有了質的改變,元件化(Component)是它的核心靈魂。

本文将從一個簡單的 QuickStart 開始,帶你進入 Angular2 的世界。内容以 Angular 官網的快速指南為準,不同之處是我們在這裡使用了 webpack 作為子產品加載器 對源碼編譯打包,而不是官網使用的 System.js,如果你有選擇困難症 千萬别糾結,隻要達到目的 盡管使用你熟悉的子產品加載器吧。

下面我們一起來搭建這個 QuickStart 應用,讓頁面顯示一條消息:”My First Angular App”。整個示例過程需要你有一些耐心,打開你的編輯器開始 coding 吧。

本文源碼:angular2-quickstart

1. 開發環境和工具準備

關于 IDE,我用的是公認的前端開發神器 Webstrom,當然 Atom 或 Sublime 也很不錯。指令行工具推薦使用 git-bash。

環境方面需要 node v5.x.x 或更高版本以及 npm 3.x.x 或更高版本,

如果你還沒有安裝 node.js,去 node.js官網 下載下傳。

2. 建立本地項目目錄

mkdir angular2-quickstart
cd angular2-quickstart      

3. 建立 package.json

npm init      

npm init 指令 會建立一個預設的 package.json 檔案,如果你沒用過,沒關系隻需要根據指令行提示一步一步填上相關資訊,或直接每次按回車就行。

在IDE裡修改預設的 package.json 内容,如下:

{
  "name": "angular2-quickstart",
  "version": "1.0.0",
  "scripts": {
    "postinstall": "./node_modules/.bin/typings install"
  },
  "author": "Your Name",
  "license": "MIT",
  "dependencies": {
    "@angular/common": "~2.1.0",
    "@angular/compiler": "~2.1.0",
    "@angular/core": "~2.1.0",
    "@angular/forms": "~2.1.0",
    "@angular/http": "~2.1.0",
    "@angular/platform-browser": "~2.1.0",
    "@angular/platform-browser-dynamic": "~2.1.0",
    "@angular/router": "~3.1.0",
    "@angular/upgrade": "~2.1.0",

    "angular-in-memory-web-api": "~0.1.5",
    "bootstrap": "^3.3.7",
    "core-js": "^2.4.1",
    "reflect-metadata": "^0.1.8",
    "rxjs": "5.0.0-beta.12",
    "zone.js": "^0.6.25"
  },
  "devDependencies": {
    "ts-loader": "^0.8.2",
    "typescript": "^2.0.3",
    "typings": "^1.4.0",
    "path": "^0.12.7",
    "webpack": "^1.13.2",
    "webpack-dev-server": "^1.16.1"
  }
}      

簡單解釋下,dependencies 是運作時所需要的依賴,devDependencies 是開發時所需要的依賴,@angular 是 Angular 的核心庫,Angular2 将它分成了很多包,這樣友善開發者靈活的按需引入。

reflect-metadata、rxjs、zone.js 這些都是為 Angular 提供核心功能支援,這裡就不做詳細說明了。

webpack-dev-server 是支援 webpack 的靜态伺服器調試工具,它可以實時監控項目中檔案,檔案改動後使浏覽器自動重新整理或進行熱替換。

ts-loader 是 webpack 将 TypeScript 編譯成 ES5 的編譯器,本文裡 我們使用 TypeScript 來寫例子,它也是 Angular 官方推薦的開發語言。

typings 是 TypeScript 定義的檔案管理系統

4. 建立其他配置檔案:tsconfig.json 和 typings.json

建立 tsconfig.json(定義 TypeScript 編譯成 ES5 的參數):

touch tsconfig.json      
{
  "compilerOptions": {
    "target": "es5",
    "module": "commonjs",
    "moduleResolution": "node",
    "sourceMap": true,
    "emitDecoratorMetadata": true,
    "experimentalDecorators": true,
    "removeComments": true,
    "noImplicitAny": true,
    "declaration": false
  }
}      

建立 typings.json

touch typings.json      
{
  "globalDependencies": {
    "es6-shim": "registry:dt/es6-shim#0.31.2+20160602141504"
  }
}      

5. 安裝所有依賴包

OK,現在運作 npm install 安裝 package.json 裡所有的依賴包,過程可能會有些慢(如果你開了 VPN 就不存在這問題),這裡推薦使用淘寶鏡像指令加快安裝速度 cnpm install

npm install
      

安裝完後,你的項目目錄應該是這樣:

如果在運作 npm install 之後沒有出現 typings 目錄,你就需要通過指令手動安裝它:

npm run typings install      

6. 建立應用入口

NgModules 把 Angular 應用組織成了一些功能相關的代碼塊。 Angular 本身也被拆成了一些獨立的 Angular 子產品。 這讓你可以隻導入你應用中所需的 Angular 部件,以得到較小的檔案體積。每個 Angular 應用都至少有一個子產品: 根子產品 ,在這裡它叫做 AppModule 。

在項目目錄中建立 app 子目錄,接着在 app 目錄下建立 app.module.ts

mkdir app
touch app/app.module.ts      

在剛建立的 app.module.ts 檔案中添加下面代碼:

// zone 為異步任務提供hook支援,主要應用于提高髒檢查效率和降低性能損耗
// reflect-metadata 為Decorator提供反應射API,注意:Decorator是ES6的提案
import \'zone.js/dist/zone\';
import \'reflect-metadata\';

// 引入NgModule裝飾器
import { NgModule } from \'@angular/core\';

// 引入浏覽器子產品
import { BrowserModule } from \'@angular/platform-browser\';

@NgModule({
    imports: [ BrowserModule ]
})

export class AppModule {}      

這個檔案是整個應用的入口,由于應用需要運作在浏覽器中,是以需要從 @angular/platform-browser 中導入BrowserModule,并将它添加到 imports 數組中。

7. 建立元件,并添加到應用中

每個 Angular 應用都至少有一個根元件,整個應用由一個個元件組成,而元件化(Component)則是 Angular 的核心靈魂。

建立元件 AppComponent,即檔案 app.component.ts,在其中添加代碼:

touch app/app.component.ts      
import { Component } from \'@angular/core\';

// 為 AppComponent 元件類添加注解
@Component({
  selector: \'my-app\',
  template: \'<h1>My First Angular App</h1>\'
})

export class AppComponent {}      

@Component 裝飾器 會把一份 中繼資料 關聯到 AppComponent 元件類上

  • selector 用來為該元件的 HTML 元素指定簡單的 CSS 選擇器
  • template 用來告訴 Angular 如何渲染該元件的視圖

class AppComponent 之是以是空的,因為我們的例子不需要應用邏輯。

編輯 app.module.ts 檔案,導入 AppComponent ,并把它添加到 NgModule 裝飾器中的 declarations 和 bootstrap 字段:

// zone 為異步任務提供hook支援,主要應用于提高髒檢查效率和降低性能損耗
// reflect-metadata 為Decorator提供反應射API,注意:Decorator是ES6的提案
import \'zone.js/dist/zone\';
import \'reflect-metadata\';

// 引入NgModule裝飾器
import { NgModule } from \'@angular/core\';

// 引入浏覽器子產品
import { BrowserModule } from \'@angular/platform-browser\';

// 引入元件AppComponent
import { AppComponent } from \'./app.component\';

@NgModule({
    imports: [ BrowserModule ],
    declarations: [ AppComponent ],
    bootstrap: [ AppComponent ]
})

export class AppModule {}      

8. 啟動應用

建立 main.ts 讓 Angular 加載這個根元件,在其中添加如下代碼:

touch app/main.ts      
// 引入啟動器
import { platformBrowserDynamic } from \'@angular/platform-browser-dynamic\';

// 引入入口檔案
import { AppModule } from \'./app.module\';

// 啟動應用
const platform = platformBrowserDynamic();
platform.bootstrapModule(AppModule);
      

為什麼要分别建立 main.ts 、應用子產品 和應用元件的檔案呢?

因為應用的引導過程與 建立子產品或者 展現視圖是互相獨立的關注點。如果該元件不會試圖運作整個應用,那麼測試它就會更容易。

9. 建立應用的宿首頁面 index.html

在目錄下建立 index.html 檔案:

touch index.html      
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>Angular2 QuickStart</title>
</head>
<body>
    <!-- 對應 @Component({ selector: \'my-app\', ... }) -->
    <my-app></my-app>

    <!-- 編譯打包後的檔案 -->
    <script src="dist/bundle.js"></script>
</body>
</html>      

10. 建立 webpack.config.js

我們使用 webpack 作為編譯打包工具,就需要建立 webpack.config.js

touch webpack.config.js      

在 webpack.config.js 中添加代碼:

var path = require(\'path\');

module.exports = {
    entry: {
        main: \'./app/main.ts\'
    },
    output: {
        path: path.resolve(__dirname, \'dist\'),
        publicPath: \'/dist/\',
        filename: \'bundle.js\'
    },
    module: {
        loaders: [
            {
                test: /\.ts$/,
                loader: \'ts\'
            }
        ]
    },
    // require 檔案時可省略字尾 .js 和 .ts
    resolve: {
        extensions: [\'\', \'.js\', \'.ts\']
    },
    // 配置 webpack-dev-server
    devServer:{
        historyApiFallback: true,
        hot: true,
        inline: true,
        port: 9090 // 修改端口,一般預設是8080
    }
};      

修改 package.json 在其中添加 start 指令:

( package.json 的其他部分這裡做了省略 )

{
  "scripts": {
    "start": "webpack-dev-server --inline --hot --colors --progress",
    "postinstall": "./node_modules/.bin/typings install"
  },
}      

一切就緒,先不急着啟動 webpack-dev-server,初學者經常遇到的坑,關于 webpack-dev-server 無法讓浏覽器在代碼修改後進行熱替換,首頁要確定是否全局安裝了 webpack-dev-server,如果沒有就運作下面指令:

npm install webpack-dev-server -g      

更重要的是 webpack-dev-server 隻會将靜态檔案打包在記憶體中 而非你的磁盤裡 這是為了友善開發環境調試,是以初學者會疑惑為什麼運作了 webpack-dev-server,dist 檔案夾下确無檔案産生,想産生檔案就運作 webpack。

10. 大工告成,走起!

在指令行輸入:

npm start      

git-bash 顯示:

在浏覽器打開 http://localhost:9090/index.html,就會看到我們的第一個 angular2 應用了:

你也可以嘗試在 app.component.ts 中将 “My First Angular App” 修改成别的文字,浏覽器會自動進行熱替換,是不是有一些成就感。

相信通過這個快速指南,你已經對 Angular2 産生了興趣。

推薦閱讀:

Angular2 快速入門

Angular QuickStart

posted on

2016-11-02 12:02 

Jean-Xu 

閱讀(6682) 

評論(0) 

編輯 

收藏 

舉報