# 【Next.js】 部署模式總覽

下面整理 **Next.js 的主要部署類型**、每種模式的特性與常見應用場景，並特別解釋 **standalone** 是什麼以及它適合的情境。

---

## 1️⃣ Next.js 部署模式總覽

<table id="bkmrk-%E9%83%A8%E7%BD%B2%E9%A1%9E%E5%9E%8B-next.config.js-" style="width: 809px;"><thead><tr><th style="width: 106px;">部署類型</th><th style="width: 141px;">`next.config.js` / 指令</th><th style="width: 167px;">產物</th><th style="width: 395px;">特性與適用場景</th></tr></thead><tbody><tr><td style="width: 106px;">**1. Node Server (傳統模式)**</td><td style="width: 141px;">`next build && next start`</td><td style="width: 167px;">`.next/`</td><td style="width: 395px;">**預設**，完整支援 SSR、ISR、API Routes。部署到任何 Node 環境（PM2、Docker、K8s、AWS EC2、GCP、Heroku…）。</td></tr><tr><td style="width: 106px;">**2. Standalone**</td><td style="width: 141px;">`output: 'standalone'` + `next build`</td><td style="width: 167px;">`.next/standalone` + `.next/static`</td><td style="width: 395px;">只輸出**最小可執行檔**（server.js + 必要檔案），方便 Docker/容器化。功能與 Node Server 相同（SSR/ISR/API Routes 皆可）。</td></tr><tr><td style="width: 106px;">**3. Static Export**</td><td style="width: 141px;">`next export` 或 `output: 'export'`</td><td style="width: 167px;">`out/`</td><td style="width: 395px;">完全靜態 HTML/CSS/JS。無 SSR/ISR/API Routes。適合純內容網站、部落格、文件站。</td></tr><tr><td style="width: 106px;">**4. Edge Runtime / Vercel**</td><td style="width: 141px;">`runtime: 'edge'` 或自動判斷</td><td style="width: 167px;">Vercel Edge Functions (或 Cloudflare Workers)</td><td style="width: 395px;">以 Web 標準 API 為基礎，無 Node built-ins。啟動極快、全球節點分布，適合 Middleware、即時驗證、A/B 測試。</td></tr><tr><td style="width: 106px;">**5. Serverless Functions**</td><td style="width: 141px;">Vercel / AWS Lambda</td><td style="width: 167px;">Lambda zip</td><td style="width: 395px;">每個頁面/Route 轉成獨立 Serverless Function。可自動擴展，適合不維護長駐伺服器的架構。</td></tr><tr><td style="width: 106px;">**6. Custom Server**</td><td style="width: 141px;">自行建立 `server.js` 並 `next()`</td><td style="width: 167px;">`.next/`</td><td style="width: 395px;">自定義 Node 伺服器，整合 Koa/Express/Fastify，做複雜路由或中介層。</td></tr></tbody></table>

> <span style="background-color: #ffffff;">註：模式之間可以組合，例如 </span>**Node Server + Standalone**<span style="background-color: #ffffff;">、</span>**Vercel Serverless + Edge Middleware**<span style="background-color: #ffffff;">。</span>

---

<table id="bkmrk-%E6%A8%A1%E5%BC%8F-%E9%9C%80-node.js-runtime"><thead><tr><th>模式</th><th>需 Node.js Runtime</th><th>常見部署基底</th><th>代表場景</th></tr></thead><tbody><tr><td>Node Server</td><td>✅</td><td>Node image / VM</td><td>全功能 SSR/ISR + API</td></tr><tr><td>Standalone</td><td>✅ (但包體精簡)</td><td>Node image / VM</td><td>Docker/K8s 輕量部署</td></tr><tr><td>Static Export</td><td>❌</td><td>Nginx、GitHub Pages、S3+CDN</td><td>純靜態內容</td></tr><tr><td>Edge Runtime</td><td>❌ (Web Worker API)</td><td>Vercel Edge / Cloudflare Workers</td><td>全球低延遲運算、Middleware</td></tr><tr><td>Serverless Functions</td><td>✅ (平台提供)</td><td>AWS Lambda / Vercel Functions</td><td>無伺服器、自動擴展</td></tr><tr><td>Custom Server</td><td>✅</td><td>Node image / VM</td><td>自訂路由、混合架構</td></tr></tbody></table>

## 2️⃣ 各模式詳解

### ① **Node Server (預設)**

- **啟動**：`next build && next start`
- **產物**：`.next/` 目錄
- **特性**：完整支援 SSR、ISR、API Routes。
- **適用**：自行管理伺服器（EC2、Kubernetes、Docker Swarm、Heroku…）。
- **優缺**：最彈性，但部署包體積較大，需要完整 node\_modules。

---

### ② **Standalone** ⭐

- **設定**：
    
    ```js
    // next.config.js
    module.exports = {
      output: 'standalone',
    }
    
    ```
- **產物**：
    
    ```
    .next/standalone      # 精簡 Node 專案，可直接 node server.js
    .next/static          # 靜態資源
    
    ```
- **原理**：
    
    
    - `next build` 會分析依賴，只把執行需要的檔案、node\_modules 打包進 `standalone`。
    - 不再需要完整專案原始碼，也不必把整個 node\_modules 打進 Docker。
- **適用場景**：
    
    
    - Docker / 容器化：  
        只複製 `.next/standalone` + `.next/static`，image 更小、build 更快。
    - Kubernetes / ECS：  
        配合多階段 Docker build，把 `RUN npm ci` 階段與最終執行環境分離。
- **功能**：與 Node Server 相同（SSR / ISR / API Routes 全支援）。

---

### ③ **Static Export**

- **指令**：`next build && next export`
- **產物**：`out/` 完全靜態
- **限制**：無 SSR、無 API Routes、無 ISR。
- **適用**：
    
    
    - 部落格、說明文件、Landing Page
    - 部署到任何靜態空間（S3+CloudFront、GitHub Pages、Netlify）。

---

### ④ **Edge Runtime / Middleware**

- **用法**：在頁面或 route handler 中 `export const runtime = 'edge'`
- **部署**：Vercel Edge Functions、Cloudflare Workers、Deno Deploy。
- **特性**：全球節點極低延遲；不能用 Node built-ins。
- **適用**：
    
    
    - 驗證/權限檢查
    - A/B 測試、URL 轉向
    - 即時 Header/Cookie 操作

---

### ⑤ **Serverless Functions (Vercel / AWS Lambda)**

- **部署**：Vercel 自動化，或 `serverless-http` 將 Next 整包轉為 Lambda。
- **特性**：
    
    
    - 每個頁面/路由轉成獨立 Lambda。
    - 自動擴展、免維運。
- **適用**：
    
    
    - 高併發但流量不穩定。
    - 只需 Node 短期計算、不需長連線。

---

### ⑥ **Custom Server**

- **方式**：建立 `server.js`
    
    ```js
    const express = require('express')
    const next = require('next')
    const app = next({ dev: false })
    const handle = app.getRequestHandler()
    app.prepare().then(() => {
      const server = express()
      server.get('/health', (req, res) => res.send('ok'))
      server.all('*', (req, res) => handle(req, res))
      server.listen(3000)
    })
    
    ```
- **適用**：
    
    
    - 需要與既有 Node 架構整合。
    - 自訂路由、中介層或 WebSocket。

---

## 3️⃣ 如何選擇

<table id="bkmrk-%E9%9C%80%E6%B1%82-%E5%BB%BA%E8%AD%B0%E6%A8%A1%E5%BC%8F-%E4%BC%81%E6%A5%AD%E5%85%A7%E9%83%A8%E3%80%81%E8%87%AA%E7%AE%A1-dock"><thead><tr><th>需求</th><th>建議模式</th></tr></thead><tbody><tr><td>**企業內部、自管 Docker/K8s**</td><td>**Standalone (Node Server)**：產物小、部署快</td></tr><tr><td>**純靜態內容、無後端邏輯**</td><td>**Static Export**</td></tr><tr><td>**全球極低延遲、近使用者運算**</td><td>**Edge Runtime / Middleware**</td></tr><tr><td>**彈性擴展、免維運**</td><td>**Serverless Functions (Vercel / AWS Lambda)**</td></tr><tr><td>**需與自訂 Node 架構整合**</td><td>**Custom Server**</td></tr></tbody></table>

---

### ✅ 總結

- **Standalone** 是 **Node Server 模式的輕量化打包**，非常適合容器化部署。
- 如果要保留完整 SSR、ISR、API Routes，又希望 **映像檔小、啟動快**，選 **Standalone** 幾乎是最佳解。
- 其他模式（Static Export、Edge、Serverless）則依你的應用是否需要即時運算、全球分佈或純靜態內容來決定。

---

## 📊 Next.js 部署模式功能支援度

<table id="bkmrk-%E9%83%A8%E7%BD%B2%E6%A8%A1%E5%BC%8F-%E9%9C%80%E8%A6%81-node-runtime"><thead><tr><th>部署模式</th><th>需要 Node Runtime</th><th>**SSR**</th><th>**ISR**</th><th>**API Routes**</th><th>適用場景</th></tr></thead><tbody><tr><td>**Node Server** (`next build && next start`)</td><td>✅</td><td>✅</td><td>✅</td><td>✅</td><td>傳統部署，功能完整。適合自管伺服器、Docker、K8s。</td></tr><tr><td>**Standalone** (`output: 'standalone'`)</td><td>✅</td><td>✅</td><td>✅</td><td>✅</td><td>與 Node Server 相同，但打包精簡，適合容器化。</td></tr><tr><td>**Static Export** (`next export`)</td><td>❌</td><td>❌</td><td>❌</td><td>❌</td><td>只能輸出純 HTML/JS/CSS。適合靜態網站（部落格、Landing Page）。</td></tr><tr><td>**Serverless Functions** (Vercel / AWS Lambda)</td><td>✅（平台提供）</td><td>✅</td><td>✅</td><td>✅</td><td>拆分成獨立 Functions，自動擴展。適合流量不穩的專案。</td></tr><tr><td>**Edge Runtime** (`runtime: 'edge'`)</td><td>❌（Web API 而非 Node）</td><td>⚠️ 部分支援（僅 Server Components，可撈 API）</td><td>❌</td><td>⚠️ 部分支援（需 Web API，不支援 Node drivers）</td><td>全球低延遲運算、Middleware、A/B 測試。</td></tr><tr><td>**Custom Server** (Express/Koa/Fastify + Next)</td><td>✅</td><td>✅</td><td>✅</td><td>✅</td><td>自訂路由/中介層，整合既有 Node 架構。</td></tr></tbody></table>

---

## 📌 補充說明

- **Static Export**：因為沒有 Node 伺服器 → **無法即時渲染**（SSR）、**無法再生**（ISR）、**無 API Routes**。
- **Edge Runtime**：
    
    
    - 可以做 SSR（例如 Server Components 即時抓資料），但**無 Node API**（不能用 `fs`、原生 DB drivers）。
    - 適合處理 Header、Cookie、權限驗證、低延遲資料讀取。
- **Serverless Functions**：Vercel/AWS 會把 SSR/ISR/API Route 拆成獨立 Function → 自動擴展，但要注意冷啟動與 DB 連線池。

---

## 🎯 總結

- **要完整功能（SSR/ISR/API Routes）** → 用 **Node Server** 或 **Standalone**。
- **要純靜態內容** → 用 **Static Export**。
- **要全球低延遲** → 用 **Edge Runtime**（但功能有限制）。
- **要免維運，自動擴展** → 用 **Serverless Functions**（Vercel、AWS Lambda）。

---