[Lv2] Nuxt 3 Rendering Modes:SSR、SSG、CSR 選擇策略
理解 Nuxt 3 的 Rendering Modes,能夠根據專案需求選擇合適的渲染策略(SSR、SSG、CSR)。
1. 面試回答主軸
- Rendering Modes 分類:Nuxt 3 支援 SSR、SSG、CSR、Hybrid Rendering 四種模式
- 選擇策略:根據 SEO 需求、內容動態性、效能要求選擇合適的模式
- 實作經驗:在專案中如何配置與選擇不同的 Rendering Modes
2. Nuxt 3 Rendering Modes 介紹
2.1 四種 Rendering Modes
Nuxt 3 支援四種主要的 Rendering Modes:
| 模式 | 全名 | 渲染時機 | 適用場景 |
|---|---|---|---|
| SSR | Server-Side Rendering | 每次請求時在 Server 端渲染 | 需要 SEO + 動態內容 |
| SSG | Static Site Generation | 建置時預先生成 HTML | 需要 SEO + 內容固定 |
| CSR | Client-Side Rendering | 在瀏覽器端渲染 | 不需要 SEO + 互動性高 |
| Hybrid | Hybrid Rendering | 混合使用多種模式 | 不同頁面有不同需求 |
2.2 SSR (Server-Side Rendering)
定義: 每次請求時,在 Server 端 執行 JavaScript,生成完整的 HTML,然後傳送給瀏覽器。
配置方式:
// nuxt.config.ts
export default defineNuxtConfig({
ssr: true, // 預設為 true
});
流程:
- 瀏覽器請求頁面
- Server 執行 JavaScript,生成完整 HTML
- 傳送 HTML 給瀏覽器
- 瀏覽器 Hydration(啟用互動功能)
優點:
- ✅ SEO 友善(搜尋引擎可以看到完整內容)
- ✅ 首次載入速度快(不需要等待 JavaScript 執行)
- ✅ 支援動態內容(每次請求都能取得最新資料)
缺點:
- ❌ Server 負擔較重(每個請求都需要執行渲染)
- ❌ TTFB(Time To First Byte)可能較長
- ❌ 需要 Server 環境
適用場景:
- 電商產品頁(需要 SEO + 動態價格/庫存)
- 新聞文章頁(需要 SEO + 動態內容)
- 使用者個人頁面(需要 SEO + 個人化內容)
2.3 SSG (Static Site Generation)
定義: 在建置時(Build Time)預先生成所有 HTML 頁面,部署為靜態檔案。
配置方式:
// nuxt.config.ts
export default defineNuxtConfig({
ssr: true, // SSG 需要 SSR 為 true
nitro: {
prerender: {
routes: ['/about', '/contact'], // 指定要預渲染的路由
},
},
});
// 或使用 routeRules
export default defineNuxtConfig({
routeRules: {
'/about': { prerender: true },
'/contact': { prerender: true },
},
});
流程:
- 建置時執行 JavaScript,生成所有頁面的 HTML
- 將 HTML 檔案部署到 CDN
- 瀏覽器請求時直接回傳預先生成的 HTML
優點:
- ✅ 效能最佳(CDN 快取,回應速度快)
- ✅ SEO 友善(完整 HTML 內容)
- ✅ Server 負擔最小(不需要執行時渲染)
- ✅ 成本低(可以部署到 CDN)
缺點:
- ❌ 不適合動態內容(需要重新建置才能更新)
- ❌ 建置時間可能較長(大量頁面時)
- ❌ 無法處理使用者特定的內容
適用場景:
- 關於我們頁面(內容固定)
- 產品說明頁(內容相對固定)
- 部落格文章(發布後不會頻繁變動)
2.4 CSR (Client-Side Rendering)
定義: 在瀏覽器中執行 JavaScript,動態生成 HTML 內容。
配置方式:
// nuxt.config.ts
export default defineNuxtConfig({
ssr: false, // 全域關閉 SSR
});
// 或針對特定路由
export default defineNuxtConfig({
routeRules: {
'/dashboard/**': { ssr: false },
'/user/**': { ssr: false },
},
});
// 或在頁面中設定
// pages/dashboard.vue
<script setup lang="ts">
definePageMeta({
ssr: false,
});
</script>
流程:
- 瀏覽器請求 HTML(通常是空的 shell)
- 下載 JavaScript bundle
- 執行 JavaScript,動態生成內容
- 渲染頁面
優點:
- ✅ 互動性高,適合 SPA
- ✅ 減少 Server 負擔
- ✅ 頁面切換流暢(不需要重新載入)
缺點:
- ❌ SEO 不友善(搜尋引擎可能無法正確索引)
- ❌ 首次載入時間較長(需要下載並執行 JavaScript)
- ❌ 需要 JavaScript 才能看到內容
適用場景:
- 後台管理系統(不需要 SEO)
- 使用者儀表板(不需要 SEO)
- 互動式應用(如遊戲、工具)