[angular 2]強型別的前端框架,截然不同的angular 2.0,正式Beta版囉

介紹如何初始化angular 2.0的環境,還有一些說明

前言

雖然我使用C# .net來做開發,但自從我開始使用angularjs之後,就很少在使用mvc,反而比較多的是使用web api來做開發,angular 2.0帶來了什麼呢?

  1. 預設就是typescript來做開發,官方文件也是typescript的為主,強型別的開發大大強化了前端的嚴謹性
  2. 更快的效能,之前我有比較過,在20000筆資料的render足足快了四倍
  3. 明確定義每個class用到了哪些東西
  4. 任何寫完的view,都是可以重複利用的component
  5. 官方直接給了server render的支持,這方面可以大大強化seo的幫助
  6. angular 2.0推出了native script,可以直接寫angular 2.0來自動轉換成natiive,可以直接產出native app而不是hybrid哦
  7. 傳統寫javascript不能充份利用多cpu的特性,angular官方支持web worker可以支持多cpu的特性
  8. 在Data Flow的部份,可以使用flux(react.js陣營的),在angular2則是大部份都以rxjs(感覺挺複雜的)

以上是我認為比較亮眼的部份,可以做很多事來講就是要學習的東西就又更多了,光是rx.js的官方文件就非常多了,不過在angular 1和angular 2雖然語法上根本就是兩種語言,但很多概念上還是挺相像的,比如像我們習慣在html上直接使用angular自有的指令的方式。

為何選擇angular 2

其實現在前端的框架那麼多,一開始我在knockout和angular兩者選一的時候,兩個框架都花了三天的時間去試用,最後決定研究和使用angularjs,之後又出了react.js(現在也很火紅),但對我來說angularjs能滿足我大部份的需求,而且又較貼近我後端開發人員的開發思想,個人感覺react.js是比較符合真正前端思想的工程師,最後angular 2.0帶著預設就是typescript出現了,以前明明是前端工作的程式碼,因為維護性和intellisense的考量,我有時候會選擇丟到後端做處理,再拋到前端來binding,現在有angular2配合typescript,這些工作看來都可以在前端完成了,一旦我們html打錯字了,class裡面的屬性不對,也會馬上告知錯誤,不會無聲無息的,更重要的是因為內建了很多angular自定義的directive,在這個思想方面和angular1還是很相像的,對我來說雖然需要去學習他們家的attribute,但是使用這個框架的人都需要follow這個規則使用,我反而認為更有利,最後typescript+angular 2.0又更像c#或java了。

開始angular 2的應用

beta版了,應該會比較穩定了,所以才打算寫點紀錄,之前alpha版的時候跟現在還是有些差異,或許以後可以再比對一下beta版跟以後release版會有什麼差異,首先一定要有npm,angular2預設都是以node.js來下載相關的package,按照官方的文件,來用一樣的結構模式

在根目錄下新增一支package.json,這支檔案主要就是npm的設定或下載相依套件,官方的設定如下

{
  "name": "angular2-quickstart",
  "version": "1.0.0",
  "scripts": {
    "tsc": "tsc",
    "tsc:w": "tsc -w",
    "lite": "lite-server",
    "start": "concurrent \"npm run tsc:w\" \"npm run lite\" "
  },
  "license": "ISC",
  "dependencies": {
    "angular2": "2.0.0-beta.0",
    "systemjs": "0.19.6",
    "es6-promise": "^3.0.2",
    "es6-shim": "^0.33.3",
    "reflect-metadata": "0.1.2",
    "rxjs": "5.0.0-beta.0",
    "zone.js": "0.5.10"
  },
  "devDependencies": {
    "concurrently": "^1.0.0",
    "lite-server": "^1.3.1",
    "typescript": "^1.7.3"
  }
}

以上針對較特別可能有機會自動設定的部份說明一下:

"scripts": {
    "tsc": "tsc",
    "tsc:w": "tsc -w",
    "lite": "lite-server",
    "start": "concurrent \"npm run tsc:w\" \"npm run lite\" "
  }

這部份是npm可以執行的,tsc就是編譯typescript成js檔,tsc-w就是會自動監控當我們修改完ts檔後自動編譯,start就是會一次執行所有裡面的指令,我們可以下npm start來執行,就會自動打開瀏覽器,我們每次修改完儲存完,會自動編譯而且瀏覽器也會自動重整。

 "dependencies": {
    "angular2": "2.0.0-beta.0",
    "systemjs": "0.19.6",
    "es6-promise": "^3.0.2",
    "es6-shim": "^0.33.3",
    "reflect-metadata": "0.1.2",
    "rxjs": "5.0.0-beta.0",
    "zone.js": "0.5.10"
  }

這部份則是npm要下載的套件,當然正常狀況之下我們在commond line下指令去下載,這邊即然裡面都定義好了,我們只要在cmd裡面打上npm install就會自動下載所有需要用到的套件,下載完之後目錄裡面就應該已經有node-modules

接著在根目錄新增tsconfig.json,這支主要是設定typescript的,細節如下

{
  "compilerOptions": {
    "target": "ES5",
    "module": "system",
    "moduleResolution": "node",
    "sourceMap": true,
    "emitDecoratorMetadata": true,
    "experimentalDecorators": true,
    "removeComments": false,
    "noImplicitAny": false
  },
  "exclude": [
    "node_modules"
  ]
}

針對noImplicitAny說明一下,預設為false也就是如果推斷不出型別的話,轉換為js預設都是any,為true的話,就算推斷不出型別一樣會轉換成js,但會回報錯誤,接著在根目錄新增index.html

<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <title></title>
</head>

<body>
    <my-app>Loading...</my-app>
    
    <script src="node_modules/angular2/bundles/angular2-polyfills.js"></script>
    <script src="node_modules/systemjs/dist/system.src.js"></script>
    <script src="node_modules/rxjs/bundles/Rx.js"></script>
    <script src="node_modules/angular2/bundles/angular2.dev.js"></script>
    <script>
        System.config({
        packages: {        
          app: {
            format: 'register',
            defaultExtension: 'js'
          }
        }
      });
      System.import('app/boot')
            .then(null, console.error.bind(console));
    </script>
</body>

</html>

這邊特別說明一下較特別的部份,packages的區段說明的是要戴入app裡面有require的js檔,system.import也就是要載入app裡的boot.ts檔為起始檔,新增一個目錄為app,然後先新增app.component.ts檔

import {Component} from 'angular2/core'; //載入需要用到的moudle

@Component({
    selector:'my-app', //這個則是在html裡面對應的component名稱
    template:`
    <h1>My First Angular 2 App</h1>
    `  //這邊則是要呈現的內容,注意一下符號是數字鍵1旁邊那顆,這樣子可以方便多行字串
})

export class AppComponent{}  //定義class,我們可以想像這個就是controller的意思

在app目錄裡面新增一支boot.ts

import {bootstrap} from 'angular2/platform/browser'; //戴入angular2的module
import {AppComponent} from './app.component';  //戴入剛剛寫好的Component

bootstrap(AppComponent);  //定義起始點的檔案

在alpha階段,官方文件是一支檔案做完這些部份,現在分成兩支以官方說法,有幾個好處,但我個人認知最大的好處就是好做單元測試,這邊可以視個人的觀感來做,全部完成了我們就可以用cmd來執行npm start命令,就會自動開啟瀏覽器如下圖

接著我們可以試試看在AppComponent增加一個expression

import {Component} from 'angular2/core'; //載入需要用到的相依

@Component({
    selector:'my-app', //這個則是在html裡面對應的component名稱
    template:`
    <h1>My First Angular 2 App <br/> {{message}}</h1>
    `  //這邊則是要呈現的內容,注意一下符號是數字鍵1旁邊那顆,這樣子可以方便多行字串
})

export class AppComponent{
    message:string;
    constructor(){
        this.message="this is test";
    }
}  //定義class,我們可以想像這個就是controller的意思

全部動作都會自動化,包括編譯ts成js和自動更新網頁,但是要等一下,自動更新網頁的速度反而沒有比alpha版的時候還要理想,最後可以看一下完整的目錄結構樣子

結論

雖然angular 2跟angularjs 1.X有挺大的語法差異,但我相信如果有angularjs還有c#經驗的開發人員,要學習angular 2.0應該是可以很快上手,只是現在中文資源可以說都還幾乎沒有,第三方套件的支援也都還不如前版的angularjs,但迎頭趕上想必也是時間上的問題而已,最後我會把這個簡單的初始應用放上github,有興趣的人就下載下來試玩看看吧,有任何意見或問題再請多多指教。

https://github.com/kinanson/angular2-start