1. 程式人生 > >使用用 Angular CLI 來建立Angular2專案、應用和庫程式碼,以及檔案說明

使用用 Angular CLI 來建立Angular2專案、應用和庫程式碼,以及檔案說明

1、要安裝CLI命令必須首先安裝Nodejs和npm包,npm包在裝好nodejs後自帶的。

2、首先建立一個目錄,用來建立Angular專案,如下圖所示:

3、開啟dos視窗,然後進入到此目錄中,如下圖所示:

4、安裝 Angular CLI,使用:npm install -g @angular/cli 命令全域性安裝 Angular CLI,如下圖所示:

5、安裝完之後如果沒有錯誤,說明cli命令安裝成功,如下圖所示:

6、安裝好之後還要加入環境變數,否則無法識別ng命令,全域性安裝的路徑為:C:\Users\Administrator\AppData\Roaming\npm,然後將此目錄新增到path中,如下圖所示:

8、開啟dos視窗,然後輸入:ng --version檢視版本號,如果沒有出現錯誤,說明cli命令配置成功,如下圖所示:

9、然後輸入ng new my-app命令來建立專案,如下圖所示:

10、如果建立成功,就會出現Successfully,如下圖所示:

11、建立好的目錄結構如下圖所示:

12、進入到my-app目錄,然後輸入ng serve --open或者npm start,用來啟動服務,在啟動之前會先編譯模組,如下圖所示:

13、編譯完成之後就是啟動web服務了,如下圖所示:

14、啟動之後會自動開啟瀏覽器,然後顯示出頁面資訊,如下圖所示:

15、生成的檔案目錄為:

16、angular.json:使用ng命令時所使用的檔案,當使用ng serve --open命令時,ng命令就會去讀取該檔案,內容如下:

{
  "$schema": "./node_modules/@angular/cli/lib/config/schema.json",//JSON Schema 是一個允許我們註解和驗證JSON資料格式的工具。Angular CLI使用它來強化對於Angular Workspace schema的解釋說明,有了此說明,在書寫json時會自動提示並且有校驗正確性功能。
  "version": 1,//指明瞭Angular 工作空間 概要的版本。
  "newProjectRoot": "projects",//這個屬性定義了由CLI建立的新的內部應用和庫放置的位置。預設值為:projects
  "projects": {//這個屬性包含了工作空間中所有專案的配置資訊。
    "my-app": {
      "root": "",//指定了專案檔案的根資料夾,可能為空,但是它指定了一個特定的資料夾。
      "sourceRoot": "src",//指定了專案原始檔位置,就是當前檔案所在目錄下的src目錄
      "projectType": "application",//表明了 專案的狀態 是 `appliaction`還是`library`。
      "prefix": "app",//當CLI建立 自動為selector元資料的值新增的字首名。
      "schematics": {},//屬性配置 `Schematics packages`。
      "architect": {//任何專案都可以自定義 自動化命令,如 打包、serve、test、lint等等。這些都是基於prebuilt builders ,叫做Architect Targets。
        "build": {
          "builder": "@angular-devkit/build-angular:browser",//
          "options": {//使用ng builid所需要的配置項
            "outputPath": "dist/my-app",// 編譯後的輸出目錄
            "index": "src/index.html",//主頁檔案
            "main": "src/main.ts",//程式入口檔案
            "polyfills": "src/polyfills.ts",// 指定polyfill檔案
            "tsConfig": "src/tsconfig.app.json",//指定tsconfig檔案
            "assets": [//記錄資原始檔夾,構建時複製到`outDir`指定的目錄
              "src/favicon.ico",
              "src/assets"
            ],
            "styles": [//引入全域性樣式,構建時會打包進來,常用於第三方庫引入的樣式
              "src/styles.css"
            ],
            "scripts": []// 引入全域性指令碼,構建時會打包進來,常用語第三方庫引入的指令碼
          },
          "configurations": {//build配置環境檔案
            "production": {//設定編譯目錄
              "fileReplacements": [//決定使用哪個環境檔案
                {
                  "replace": "src/environments/environment.ts",
                  "with": "src/environments/environment.prod.ts"
                }
              ],
              "optimization": true,//使用ng build時,相當於在命令列中使用ng build --optimization
              "outputHashing": "all",//使用ng build時,相當於在命令列中使用ng build --outputHashing
              "sourceMap": false,//使用ng build時,相當於在命令列中不使用ng build --sourceMap
              "extractCss": true,//使用ng build時,相當於在命令列中使用ng build --extractCss
              "namedChunks": false,//使用ng build時,相當於在命令列中不使用ng build --namedChunks
              "aot": true,//使用ng build時,相當於在命令列中使用ng build --aot
              "extractLicenses": true,//使用ng build時,相當於在命令列中使用ng build --extractLicenses
              "vendorChunk": false,//使用ng build時,相當於在命令列中不使用ng build --vendorChunk
              "buildOptimizer": true,//使用ng build時,相當於在命令列中使用ng build --build--optimizer
              "budgets": [
                {
                  "type": "initial",
                  "maximumWarning": "2mb",
                  "maximumError": "5mb"
                }
              ]
            }
          }
        },
        "serve": {
          "builder": "@angular-devkit/build-angular:dev-server",//
          "options": {//當使用ng serve命令時,會讀取配置項
            "browserTarget": "my-app:build"//然後就會去執行my-app:build的配置
          },
          "configurations": {
            "production": {
              "browserTarget": "my-app:build:production"//然後環境檔案使用builid中的production
            }
          }
        },
        "extract-i18n": {
          "builder": "@angular-devkit/build-angular:extract-i18n",
          "options": {
            "browserTarget": "my-app:build"
          }
        },
        "test": {
          "builder": "@angular-devkit/build-angular:karma",
          "options": {
            "main": "src/test.ts",
            "polyfills": "src/polyfills.ts",
            "tsConfig": "src/tsconfig.spec.json",
            "karmaConfig": "src/karma.conf.js",
            "styles": [
              "src/styles.css"
            ],
            "scripts": [],
            "assets": [
              "src/favicon.ico",
              "src/assets"
            ]
          }
        },
        "lint": {
          "builder": "@angular-devkit/build-angular:tslint",
          "options": {
            "tsConfig": [
              "src/tsconfig.app.json",
              "src/tsconfig.spec.json"
            ],
            "exclude": [
              "**/node_modules/**"
            ]
          }
        }
      }
    },
    "my-app-e2e": {
      "root": "e2e/",
      "projectType": "application",
      "prefix": "",
      "architect": {
        "e2e": {
          "builder": "@angular-devkit/build-angular:protractor",
          "options": {
            "protractorConfig": "e2e/protractor.conf.js",
            "devServerTarget": "my-app:serve"
          },
          "configurations": {
            "production": {
              "devServerTarget": "my-app:serve:production"
            }
          }
        },
        "lint": {
          "builder": "@angular-devkit/build-angular:tslint",
          "options": {
            "tsConfig": "e2e/tsconfig.e2e.json",
            "exclude": [
              "**/node_modules/**"
            ]
          }
        }
      }
    }
  },
  "defaultProject": "my-app"//當使用CLI命令時,`defaultProject`代表顯示的名字。
}

17、package.json:使用npm命令時所使用的檔案,npm命令就會去讀取該檔案,內容如下:

{
  "name": "my-app",//專案名稱
  "version": "0.0.0",//版本號
  "scripts": {//定義npm選項,如:npm ng,npm start,npm build,npm test,npm lint,npm e2e
    "ng": "ng",//npm ng相當於執行ng命令
    "start": "ng serve",//npm start 相當於執行ng serve命令
    "build": "ng build",//npm start 相當於執行ng build命令
    "test": "ng test",//npm start 相當於執行ng test
    "lint": "ng lint",//npm start 相當於執行ng lint命令
    "e2e": "ng e2e"//npm start 相當於執行ng e2e命令
  },
  "private": true,//如果你在包的package.json中設定"private": true,則npm會拒絕釋出它。
  "dependencies": {//開發時所依賴的包,如果別人只是使用或下載你的npm包,就不需要安裝這裡面的,包含了npm包名字與版本範圍(version range)的對映。版本範圍是一個字串,包含了一個或多個描述符。dependencies同樣可以用一個tarball或git url來定義。
	/*
		>version 版本號必須比version大
		>=version 大於等於
		<version 小於
		<=version 小於等於
		~version "近似等價於version"
		^version "與version相相容"
	*/
    "@angular/animations": "~7.1.0",//@angular/animations屬於包名,~7.1.0屬於包的版本號
    "@angular/common": "~7.1.0",
    "@angular/compiler": "~7.1.0",
    "@angular/core": "~7.1.0",
    "@angular/forms": "~7.1.0",
    "@angular/platform-browser": "~7.1.0",
    "@angular/platform-browser-dynamic": "~7.1.0",
    "@angular/router": "~7.1.0",
    "core-js": "^2.5.4",
    "rxjs": "~6.3.3",
    "tslib": "^1.9.0",
    "zone.js": "~0.8.26"
  },
  "devDependencies": {//開發時所依賴的包,如果別人只是使用或下載你的npm包,就不需要安裝這裡面的,測試和編譯程式碼所需要的包
    "@angular-devkit/build-angular": "~0.11.0",
    "@angular/cli": "~7.1.0",
    "@angular/compiler-cli": "~7.1.0",
    "@angular/language-service": "~7.1.0",
    "@types/node": "~8.9.4",
    "@types/jasmine": "~2.8.8",
    "@types/jasminewd2": "~2.0.3",
    "codelyzer": "~4.5.0",
    "jasmine-core": "~2.99.1",
    "jasmine-spec-reporter": "~4.2.1",
    "karma": "~3.1.1",
    "karma-chrome-launcher": "~2.2.0",
    "karma-coverage-istanbul-reporter": "~2.0.1",
    "karma-jasmine": "~1.1.2",
    "karma-jasmine-html-reporter": "^0.2.2",
    "protractor": "~5.4.0",
    "ts-node": "~7.0.0",
    "tslint": "~5.11.0",
    "typescript": "~3.1.6"
  }
}

18、tsconfig.json:

{
  "compileOnSave": false,//在最頂層設定compileOnSave標記,可以讓IDE在儲存檔案的時候根據tsconfig.json重新生成檔案。
  "compilerOptions": {//配置編譯預設屬性
    "baseUrl": "./",//解析非相對模組名的基準目錄
    "outDir": "./dist/out-tsc",//輸出目錄
    "sourceMap": true,//debug把 ts 檔案編譯成 js 檔案的時候,同時生成對應的 map 檔案
    "declaration": false,//是否生成相應的.d.ts檔案。
    "module": "es2015",//指定module 的版本,'none', 'commonjs', 'amd', 'system', 'umd', 'ES6', or 'es2015'
						//只有 ‘amd' 和 'system’ 可以和 outFile 屬性一起用
						//當target 屬性是 ES5或者更低版本的時候,'ES6'和'es2015' 這兩個值可能不能生效,
    "moduleResolution": "node",//模組的解析
    "emitDecoratorMetadata": true,//給原始碼裡的裝飾器宣告加上設計型別元資料
    "experimentalDecorators": true,//啟用實驗性的ES裝飾器。
    "importHelpers": true,
    "target": "es5",//編譯目標平臺(es3, es5, es2015)
    "typeRoots": [//如果指定了typeRoots,只有typeRoots下面的包才會被包含進來
      "node_modules/@types"//node_modules/@types資料夾下以及它們子資料夾下的所有包都是可見的
    ],
    "lib": [ //編譯過程中需要引入的庫檔案的列表
      "es2018",
      "dom"
    ]
  }
}

19、src/tsconfig.app.json檔案:

{
  "extends": "../tsconfig.json",//從tsconfig.json檔案繼承過來
  "compilerOptions": {
    "outDir": "../out-tsc/app",//將tsconfig.json檔案中的屬性覆蓋掉,然後使用此檔案的屬性
    "types": []//如果指定了types,只有被列出來的包才會被包含進來
  },
  "exclude": [//不包含的編譯目錄
    "test.ts",
    "**/*.spec.ts"
  ]
}

20、執行順序,當在命令列中輸入npm start(會自動執行ng serve)或ng serve時,就會去找angular.json檔案中"projects"->"my-app"->"architect"->"serve",而在serve中又有"options"->"browserTarget":"my-app:build",則表明在此執行"projects"->"my-app"->"architect"->"build",然後在build中的options選項中設定了入口檔案、主頁檔案、靜態檔案及目錄、樣式檔案和使用TypeScript編譯的配置檔案(tsconfig.app.json)而tsconfig.app.json檔案又繼承與tsconfig.json檔案,所以使用TypeScript編譯後就可以執行,那麼執行就是main.ts檔案入口。

21、main.ts檔案:

import { enableProdMode } from '@angular/core';
import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';

import { AppModule } from './app/app.module';
import { environment } from './environments/environment';

if (environment.production) {//是否啟用enableProdMode模式
  enableProdMode();
}
//動態引導,引導AppModule來啟動應用程式platformBrowserDynamic().bootstrapModule相當於main函式,而AppModule是引數,
//此種方式是通過瀏覽器端編譯
platformBrowserDynamic().bootstrapModule(AppModule)
  .catch(err => console.error(err));

22、在裝載AppModule時,會去找/app/app.module.ts裝載,如下程式碼:

import { BrowserModule } from '@angular/platform-browser';//匯入BrowserModule,匯入 BrowserModule 是因為它提供了啟動和執行瀏覽器應用的那些基本的服務提供商.
import { NgModule } from '@angular/core';//匯入NgModule,NgModule是我們組織Angular應用所必須的

import { AppComponent } from './app.component';//匯入AppComponent,AppComponent是我們要展現的一個最基本的元件

@NgModule({//我們在 @NgModule 的元資料中配置我們匯入的模組,因為我們需要依賴 BrowserModule 所以我們在 imports 中添加了它,然後我們又在 declarations 和 bootstrap 選項中添加了 AppComponent 元件.
  declarations: [
    AppComponent//在 declarations添加了 AppComponent 元件
  ],
  imports: [
    BrowserModule
  ],
  providers: [],
  bootstrap: [AppComponent]//bootstrap選項中添加了 AppComponent 元件
})
export class AppModule { }

23、在/app/app.module.ts中載入了一個AppComponent元件,是從app/app.component.ts中匯入的,如下程式碼:

import { Component } from '@angular/core';

@Component({//使用@Component裝飾器來定義一個AppComponent元件,Component元件是建立使用者介面的主要元件
  selector: 'app-root',//元件標籤,定義之後就可以在html檔案中使用<app-root></app-root>直接使用該元件了
  templateUrl: './app.component.html',//元件所使用的模板,即app.component.html檔案,UI相關
  styleUrls: ['./app.component.css']//元件所使用的樣式,即app.component.css檔案,UI相關
})
export class AppComponent {
  title = 'my-app';//標題
}

24、首先檢視app.component.html檔案,檔案內容如下,其中Welcome to {{ title }}!中的{{ title }}就是顯示在AppComponent中的title值,由程式碼可以看出值為my-app,那麼在瀏覽器中就會顯示Welcome to my-app,請看第14步截圖。

<div style="text-align:center">
  <h1>
    Welcome to {{ title }}!
  </h1>
  <img width="300" alt="Angular Logo" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNTAgMjUwIj4KICAgIDxwYXRoIGZpbGw9IiNERDAwMzEiIGQ9Ik0xMjUgMzBMMzEuOSA2My4ybDE0LjIgMTIzLjFMMTI1IDIzMGw3OC45LTQzLjcgMTQuMi0xMjMuMXoiIC8+CiAgICA8cGF0aCBmaWxsPSIjQzMwMDJGIiBkPSJNMTI1IDMwdjIyLjItLjFWMjMwbDc4LjktNDMuNyAxNC4yLTEyMy4xTDEyNSAzMHoiIC8+CiAgICA8cGF0aCAgZmlsbD0iI0ZGRkZGRiIgZD0iTTEyNSA1Mi4xTDY2LjggMTgyLjZoMjEuN2wxMS43LTI5LjJoNDkuNGwxMS43IDI5LjJIMTgzTDEyNSA1Mi4xem0xNyA4My4zaC0zNGwxNy00MC45IDE3IDQwLjl6IiAvPgogIDwvc3ZnPg==">
</div>
<h2>Here are some links to help you start: </h2>
<ul>
  <li>
    <h2><a target="_blank" rel="noopener" href="https://angular.io/tutorial">Tour of Heroes</a></h2>
  </li>
  <li>
    <h2><a target="_blank" rel="noopener" href="https://angular.io/cli">CLI Documentation</a></h2>
  </li>
  <li>
    <h2><a target="_blank" rel="noopener" href="https://blog.angular.io/">Angular blog</a></h2>
  </li>
</ul>

25、在定義好app-root標籤後,就可以在主頁index.html使用,如下程式碼所示:

<!doctype html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <title>MyApp</title>
  <base href="/">

  <meta name="viewport" content="width=device-width, initial-scale=1">
  <link rel="icon" type="image/x-icon" href="favicon.ico">
</head>
<body>
  <app-root></app-root>
</body>
</html>

26、這就相當於將app.component.html內容填充到了index.html檔案中的body標籤中,然後在瀏覽器中顯示

此例是根據:https://www.angular.cn/guide/quickstart來做的。