哈囉,各位邦友們!
歷經從 Standalone 專案起手,走過服務、HTTP、Signals 與 @defer
。
今天的目標,就是讓 Day01~Day26 打造的專案透過 ng build
打包,並部署到 GitHub Pages,正式對外公開。
ng build
產出可部署的靜態資源,理解基礎設定與常見參數。ngModel
。這些讓專案結構清晰、依賴明確,是部署前檢視可維護性的第一步。resource()
與 @defer
應用到位,並在 Day26 總結時完成整體驗收。這意味著狀態管理與效能策略都已就緒,可以放心對外展示。ng build
打包生產版hero-journey
),執行 npm install
或 npm ci
,確保依賴完整。angular.json
可以看到以下片段:"build": {
"builder": "@angular/build:application",
"options": {
"browser": "src/main.ts",
"tsConfig": "tsconfig.app.json",
"inlineStyleLanguage": "scss",
"assets": [
{
"glob": "**/*",
"input": "public"
}
],
"styles": [
"src/styles.scss"
],
"server": "src/main.server.ts",
"outputMode": "server",
"ssr": {
"entry": "src/server.ts"
}
},
"configurations": {
"production": {
"budgets": [
{
"type": "initial",
"maximumWarning": "500kB",
"maximumError": "1MB"
},
{
"type": "anyComponentStyle",
"maximumWarning": "4kB",
"maximumError": "8kB"
}
],
"outputHashing": "all"
},
"development": {
"optimization": false,
"extractLicenses": false,
"sourceMap": true
}
},
"defaultConfiguration": "production"
}
預設為 SSR 專案(outputMode: "server"
),代表 ng build
會輸出 dist/hero-journey/browser
與 dist/hero-journey/server
。GitHub Pages 僅能托管靜態檔案,因此稍後要取用 browser 目錄內容。
baseHref
GitHub Pages 會把網站掛在 https://<使用者>.github.io/<repo>/
,因此需要設定 baseHref
讓路由與資源路徑正確。
有兩種做法:
npx ng build --configuration production --output-mode=static --base-href "/hero-journey/"
angular.json
的 build.options
增加 "baseHref": "/hero-journey/"
,或建立 project.json
環境設定檔。小提示:如果你使用自己的 GitHub 仓庫,將
/hero-journey/
替換成實際 repo 名稱即可。
靜態部署時,Angular 會依據 app.routes.server.ts
的設定產生預渲染路徑。為了避免 /detail/:id
在 GitHub Pages 重新整理時出現 404,我們新增以下設定,讓 CLI 在建置時替每位英雄產生對應的靜態頁面:
import { DEFAULT_HEROES } from './in-memory-data';
export const serverRoutes: ServerRoute[] = [
{
path: 'detail/:id',
renderMode: RenderMode.Prerender,
getPrerenderParams: async () =>
DEFAULT_HEROES.map((h) => ({ id: String(h.id) })),
},
{
path: '**',
renderMode: RenderMode.Prerender,
},
];
這段程式碼會迭代 DEFAULT_HEROES
,並把每個 id
轉成字串傳給 getPrerenderParams
。也因此我們將 DEFAULT_HEROES
於 src/app/in-memory-data.ts
匯出,讓同一份資料可供 SSR 與 API 模擬共用;未來若改成呼叫後端,只需在此改成抓取真實資料清單即可銜接。
npm run build -- --configuration production --output-mode browser --base-href "/hero-journey/"
npm run build
透過 CLI 執行 ng build
。--configuration production
套用壓縮、tree-shaking 等最佳化。--output-mode=static
強制產出純前端資源,避免把 dist/.../server
誤傳到靜態主機。--base-href
確保靜態資源尋址正確。建置完成後會看到類似結果:
dist/hero-journey/
├── browser/
│ ├── index.html
│ ├── main-HASH.js
│ ├── styles-HASH.css
└── 3rdpartylicenses.txt
└── prerendered-routes.json
部署到 GitHub Pages 時,只需要 browser/
目錄即可。若想預覽生產版,直接在本機啟動簡易伺服器:
npx http-server dist/hero-journey/browser -p 4200
hero-journey
推送至 GitHub。main
或 master
) 已開啟 GitHub Actions。angular-cli-ghpages
最簡單、快速的方式,適合個人專案。
npm install angular-cli-ghpages --save-dev
npm run build -- --configuration production --output-mode=static --base-href "/hero-journey/"
npx angular-cli-ghpages --dir=dist/hero-journey/browser
gh-pages
分支並推送至遠端。Deploy from a branch
並指向 gh-pages
。https://<使用者>.github.io/hero-journey/
造訪。適合團隊合作或常態發佈。
在專案根目錄新增 .github/workflows/deploy.yml
:
name: Deploy Angular to GitHub Pages
on:
push:
branches:
- main
workflow_dispatch: {}
jobs:
build-and-deploy:
runs-on: ubuntu-latest
permissions:
contents: write
pages: write
id-token: write
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 22
- name: Install dependencies
run: npm ci
working-directory: projects/hero-journey
- name: Build browser bundle
run: npm run build -- --configuration production --output-mode=static --base-href "/hero-journey/"
working-directory: projects/hero-journey
- name: Upload artifact
uses: actions/upload-pages-artifact@v3
with:
path: projects/hero-journey/dist/hero-journey/browser
- name: Deploy to GitHub Pages
uses: actions/deploy-pages@v4
首次執行後,GitHub 會自動建立 github-pages
環境並指向最新部署結果。你只需要把程式碼推到 main
,部署就交給 CI。
baseHref
與 redirect
設定是否正確。@defer
或懶載入,於 GitHub Pages 上再檢查一次觸發條件是否正常。部署到 GitHub Pages 是最容易入門的方式,但在實務專案中,我們常需要 SSL、後端 API、版本管理或自動回滾。以下提供三條進階道路:
npm install -g firebase-tools
→ firebase login
→ firebase init hosting
→ 指定 dist/hero-journey/browser
→ firebase deploy
。npm run build -- --output-mode=static
與 Output dist/hero-journey/browser
→ 一鍵部署。npm run build -- --output-mode=static
、Publish Directory dist/hero-journey/browser
→ 啟用自動部署。建議依專案需求挑選平台,並持續將部署腳本自動化,避免手動操作造成遺漏。
baseHref
或 deploy-url
設定錯誤。記得清理瀏覽器快取或使用 DevTools 檢查資源載入路徑。dist/hero-journey/browser
內複製一份 index.html
為 404.html
,或善用 angular-cli-ghpages
自動處理。npm ci
,確保 Angular CLI 能正確運作。browser
目錄,避免多餘檔案增加下載量。*今日小結:
今天我們正式開啟把專案部署上線。透過 ng build
掌握打包流程、搞定 baseHref
與靜態資源路徑,再善用 GitHub Pages 或雲端平台,就能讓 Day01~Day26 的成果與更多人分享。