如何設定 Angular 環境變數 ?
實務上會有不同 Angular 執行環境,如開發用的 dev
環境,測試用的 lab
與 stg
環境,正式上線用的 prod
環境,不同的環境會有不同的 環境變數
,如 API server 、S3 server 的設定 … 等,Angular CLI 提供了很方便的機制處理環境變數問題,讓我們切換不同環境時,完全不用改 code,只要在 Angular CLI 編譯時使用不同的參數切換即可。
Version
Node.js 8.9.3
Angular CLI 1.6.2
Angular 5.2
Angular CLI 預設 Environments
一個乾淨的 Angular 專案,已經提供了預設的 environment 設定。
- 選擇專案根目錄的
.angular-cli.json
- 在
environments
property 下,已經有dev
與prod
兩個設定,分別對應到environments
目錄下的environment.ts
與environment.prod.ts
environment.prod.ts
為prod
環境所使用的設定檔;而environment.ts
為dev
環境所使用的設定檔以
environment.prod.ts
為例,設定了production: true
;而environment.ts
則設定了production: false
Q :
production
property 設定為true
或false
有什麼影響 ?
- production: true : JavaScript 與 CSS 都會壓縮,且不提供 source map,因此最後的 JavaScript 與 CSS 會較小,適合
stg
與prod
環境使用,但不利於 debug - production: false : JavaScript 與 CSS 不會壓縮,會提供 source map,因此最後的 JavaScript 與 CSS 會較大,適合
dev
與lab
環境使用,方便 debug
新增 Lab 與 Stage 環境設定
Angular CLI 預設只提供了 dev
與 prod
兩個環境變數,但實務上最少還有 lab
與 stage
兩個環境,這必須手動建立。
Lab 環境
- 在
src/app/environments
目錄下新增environment.lab.ts
- 將
environment.ts
內容複製到environment.lab.ts
目前 Angular CLI 尚未提供指令建立 environment,必須手動建立,Angular CLI 的 naming convention 是
environment.
+環境名稱
+.ts
environment.lab.ts
1 | expot const environment = { |
- production: false :
lab
環境不提供 JavaScript 壓縮與最佳化,方便 debug - envName:
lab
: 可自行設定自己的變數
Stage 環境
- 在
src/app/environments
目錄下新增environment.stg.ts
- 將
environment.prod.ts
內容複製到environment.stg.ts
environment.stg.ts
1 | export const environment = { |
- production: true :
stg
環境提供 JavaScript 壓縮與最佳化,與prod
環境相同 - envName:
stg
: 可自行設定自己的變數
為了測試方便,請在
environment.ts
加上envName: 'dev'
,environment.prod.ts
加上envName: 'prod'
修改 .angular-cli.json
- 選擇專案根目錄的
.angular-cli.jsonv
- 新增
lab
與stg
設定
.angular-cli.json
1 | { |
26 行
1 | "environments": { |
新增 lab
與 stg
,與其對應的 environments/environment.lab.ts
與 environments/environment.stg.ts
。
使用環境變數
app.component.html
1 | <!--The content below is only a placeholder and can be replaced.--> |
第 6 行
1 | <h1> |
在 Angular 專案預設的 app.component.html
加上 ,用來讀取
環境變數
。
app.component.ts
1 | import { Component } from '@angular/core'; |
11 行
1 | environmentName = environment.envName; |
直接讀取剛剛 export 的 environment.envName
。
切換環境變數
理想上,無論我們怎麼切換環境,都不應該去改 code,這才符合 開放封閉原則
的要求。
package.json
1 | { |
第 5 行
1 | "scripts": { |
原本的 scripts
加上 start-lab
、start-stg
、start-prod
與 build-stg
。
第 7 行
1 | "start": "ng serve", |
Angular CLI 原本內建的 start
,不加任何參數,預設就是跑 dev
環境變數。
第 8 行
1 | "start-lab": "ng serve --environment=lab", |
新增 starrt-lab
,ng serve
時執行 lab
環境變數。
第 9 行
1 | "start-stg": "ng serve --environment=stg", |
新增 starrt-stg
,ng serve
時執行 stg
環境變數。
10 行
1 | "start-prod": "ng serve --environment=prod", |
新增 starrt-prod
,ng serve
時執行 prod
環境變數。
11 行
1 | "build": "ng build --prod", |
Angular CLI 原本內建的 build
,不加任何參數,預設就是跑 prod
環境變數。
12 行
1 | "build-stg": "ng build --prod --environment=stg", |
新增 build-stg
,ng build
除了如同 prod
編譯 JavaScript 外,同時跑 stg
環境變數。
以 Angular CLI 執行
執行 ng serve
時,跑的是 Angular CLI 內建的 web server。
使用 dev
執行
1 | ~/MyProject $ npm run start |
在專案目錄下執行 npm run start
。
Angular 首頁顯示 dev
環境。
使用 lab
執行
1 | ~/MyProject $ npm run start-lab |
在專案目錄下執行 npm run start-lab
。
Angular 首頁顯示 lab
環境。
使用 stg
執行
1 | ~/MyProject $ npm run start-stg |
在專案目錄下執行 npm run start-stg
。
Angular 首頁顯示 stg
環境。
使用 prod
執行
1 | ~/MyProject$ npm run start-prod |
在專案目錄下執行 npm run start-prod
。
Angular 首頁顯示 prod
環境。
以實際 Web Server 執行
Angular CLI 雖然內建 web server,但你或許覺得要實際跑過 ng build
的結果,較接近 stg
與 prod
環境。
安裝 http-server
1 | $ npm install -g http-server |
另外安裝 http-server
執行 ng build
結果,不透過 Angular CLI。
- -g : 安裝
http-server
在 global
使用 stg
編譯
1 | ~/MyProject $ npm run build-stg |
在專案目錄下執行 npm run build-stg。
1 | ~/MyProject/dist $ http-server |
ng build
會將編譯後的檔案放到 dist
目錄下,在 dist
目錄下執行 http-server
。
http-server
會啟動在 http://172.20.10.12:8080
。
Angular 首頁顯示 stg
環境。
使用 prod
編譯
1 | ~/MyProject $ npm run build |
在專案目錄下執行 npm run build。
ng build
會將編譯後的檔案放到 dist
目錄下,在 dist
目錄下執行 http-server
。
http-server
會啟動在 http://172.20.10.12:8080
。
Angular 首頁顯示 prod
環境。
Conclusion
- Angular CLI 已經幫我們設計好完整的
環境變數
機制,只要配合 Angular CLI 的架構,可以在完全不用修改任何一行 code 的狀態下,透過指令切換環境變數
Sample Code
完整的範例可以在我的 GitHub 上找到
Reference
Shayne Boyer, Angular 2: Application Settings using the CLI Environment Option