今天會介紹 Angular 專案的建置流程,以及兩種進階的建置模式 SSR 和 SSG。
在 Angular 專案中,build 是將開發階段的程式碼轉換成適合部署到生產環境的靜態檔案的過程。
使用以下指令,會將 Angular 專案的程式碼編譯並打包成靜態檔案,讓瀏覽器可以載入並執行這些檔案。
npm run build // ng build
這些靜態檔案通常會放在專案的 dist/
的專案名稱資料夾中。
將檔案建置後,就可以考慮部署到伺服器或靜態主機上。
Angular 支援三種渲染模式:
預設情況下,建構的專案屬於單頁式應用程式(SPA),僅在客戶端執行,所有 UI 渲染都發生在瀏覽器端。因此,前端只需部署在靜態主機上,無需額外的後端伺服器。
這種模式的缺點是 SEO 效果較差,因為初始載入的 HTML 幾乎沒有內容,搜尋引擎較難正確索引。此外,若初始資料量較大,使用者可能會感覺載入速度較慢。
Angular 對於建置專案到不同平台,有提供不同的工具 來協助部署專案到不同的平台。
在建置前需要先安裝相關的套件,再來執行建置指令
ng add angular-cli-ghpages
ng deploy
當部署 Angular 專案到 GitHub Pages 或子目錄時,常需設定 baseHref,否則路徑會錯誤。可在 angular.json 新增 deploy 設定:
"deploy": {
"builder": "angular-cli-ghpages:deploy",
"options": {
"baseHref": "/angular-demo-todo/",
"repo": "https://github.com/<your-github-username>/angular-demo-todo.git",
}
}
伺服器端渲染 Server-Side Rendering
在建立專案時,可以使用 --ssr
參數來啟用 SSR 功能
ng new --ssr
或者在現有專案中加入 SSR 功能
ng add @angular/ssr
啟用後 Angular 會自動調整專案結構,並新增一些必要的設定和檔案。例如:會產生 server.ts
來設定伺服器端的渲染邏輯
運行 npm run build 後,會在 dist 資料夾中產生兩個子資料夾:
需要注意的是,開發 SSR 時,會有一些限制,例如
localStorage
、sessionStorage
、document
、window
等這些在伺服器端不存在的物件。使用
afterRender
生命週期來確保程式碼只在瀏覽器端執行
constructor() {
afterRender(() => {
// 這裡的程式碼只會在瀏覽器端執行
const test = localStorage.getItem('test');
});
}
Static Site Generation 靜態網站生成
angular.json
的 prerender 中可以指定路由檔案
...
prerender: {
"routesFile": "routes.txt"
}
將需要預先產生靜態頁面的路由列出來,放到檔案中
// routes.txt
/users/u1/details
/users/u2/details
在執行 npm run build
後,就會在 dist/
資料夾中產生對應的靜態 HTML 檔案
SSR 、SSG 部屬都需要 Node.js 的伺服器環境,無法部署在純靜態主機上。因此可考慮像是 Firebase、Vercel 等支援 Node.js 的平台。
Firebase 和 Angular 一樣,是由 Google 開發的。透過 Firebase App Hosting 部署 Angular 應用程式相對簡單。可以按照官方文件中步驟進行操作
最後一天介紹了 Angular 專案的建置流程,以及兩種進階的建置模式 SSR 和 SSG。