Angular的啟動過程

風靈使發表於2018-08-29

在上一篇的部落格中,我們詳細瞭解了新專案的專案結構。知道了main.ts是整個Angular專案的入口點,那麼,Angular專案的啟動過程是怎樣的呢?

那麼我們就要搞清楚三個問題。

1.啟動時載入了哪個頁面。
2.啟動時執行了哪些指令碼
3.這些指令碼都做了什麼

首先我們看一下angular-cli.json這個檔案,上一篇部落格說到這個檔案是命令列工具的配置檔案。我們先來看看裡面的程式碼

{
  "$schema": "./node_modules/@angular/cli/lib/config/schema.json",
  "project": {
    "name": "test"//專案名稱
  },
  "apps": [
    {
      "root": "src",/*指向的是angular應用啟動時從哪個目錄找資源,預設指向src目錄*/
      "outDir": "dist",
      "assets": [/*資源目錄*/
        "assets",
        "favicon.ico"
      ],
      "index": "index.html",/* index指向Angular應用啟動時載入的頁面  預設指向src目錄中index.html*/
      "main": "main.ts",/* main屬性指向Angular應用啟動時載入的指令碼  預設指向src目錄中的main.ts*/
      "polyfills": "polyfills.ts",
      "test": "test.ts",
      "tsconfig": "tsconfig.app.json",
      "testTsconfig": "tsconfig.spec.json",
      "prefix": "app",
      "styles": [
        "styles.css"
      ],
      "scripts": [
        "../node_modules/jquery/dist/jquery.js"
      ],
      "environmentSource": "environments/environment.ts",
      "environments": {
        "dev": "environments/environment.ts",
        "prod": "environments/environment.prod.ts"
      }
    }
  ],
  "e2e": {
    "protractor": {
      "config": "./protractor.conf.js"
    }
  },
  "lint": [
    {
      "project": "src/tsconfig.app.json"
    },
    {
      "project": "src/tsconfig.spec.json"
    },
    {
      "project": "e2e/tsconfig.e2e.json"
    }
  ],
  "test": {
    "karma": {
      "config": "./karma.conf.js"
    }
  },
  "defaults": {
    "styleExt": "css",
    "component": {}
  }
}

上面的程式碼我們主要看apps中的rootindexmain屬性:
root屬性指向的是angular應用啟動時從哪個目錄找資源,預設指向src目錄
index指向Angular應用啟動時載入的頁面 預設指向src目錄中index.html
main屬性指向Angular應用啟動時載入的指令碼 預設指向src目錄中的main.ts

這個時候我們就知道了
程式啟動時載入的是index.html這個頁面,執行了main.ts這個指令碼。

下面我們來看看指令碼做了什麼。

main.ts中的程式碼

/*開發者模式的配置*/
import { enableProdMode } from '@angular/core';
/*告訴Angular使用哪個模組啟動應用*/
import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
/*匯入主模組*/
import { AppModule } from './app/app.module';
/*倒入環境配置*/
import { environment } from './environments/environment';

/*如果是生產環境  關閉開發者模式*/
if (environment.production) {
  enableProdMode();
}

/*程式的起點,整個程式就是從這裡執行的,AppModule指向的是/app/app.module,也就是說程式啟動時會去載入/app/app.module這個檔案*/
platformBrowserDynamic().bootstrapModule(AppModule);

main.ts告訴Angular主模組是AppModule,Angular也就知道了去載入AppModule

index.html中的程式碼很簡單,在上一篇部落格中也說過<app-root></app-root> 這個標籤就是元件展示的地方。

<!doctype html>
<html>
<head>
  <meta charset="utf-8">
  <title>Test</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>Loading...</app-root>
</body>
</html>

好了,到現在為止我們就知道上面的三個問題的答案了
下面就是Angular應用的啟動過程

1.Angular應用在啟動時首先會去angular-cli.json這個配置檔案中去尋找要載入的頁面和指令碼。
預設是載入index.htmlmain.ts

這裡寫圖片描述

2.然後去main.ts中找到宣告指定的主模組,預設的主模組是app.module

這裡寫圖片描述

3.然後去app.module中找到指定的主元件,預設的主元件是app.component
這裡寫圖片描述

4.然後再去app.component中找到指定的選擇器,模板和樣式等等
這裡寫圖片描述

5.最後,將元件渲染到index.html中的選擇器中
這裡寫圖片描述

在將元件渲染到選擇器之前,會先顯示選擇器本身的內容,直到將選擇器中的內容替換為主元件中模本的內容。
這也就是為什麼我們開啟頁面的時候會先出現loading的字樣。

以上就是整個專案的啟動過程!

相關文章