部署
Next.js 靜態網站
把 Next.js app 匯出成靜態 HTML 和資源檔,上傳 out 目錄,不需要執行 Node.js 伺服器也能全球發佈。
Static export 支援矩陣
上傳 out 前,先確認 app 符合靜態匯出模型。
適合
- 建置時產生的靜態路由
- 可靜態渲染的 App Router 頁面
- Pages Router getStaticProps / getStaticPaths
- Hydration 後的 client-side data fetching
- next/link、dynamic imports、CSS Modules 和靜態資源
需要其他 runtime
- 需要伺服器執行的 API routes 和 route handlers
- Middleware、rewrites、redirects 和自訂 headers
- getServerSideProps 與 request-time rendering
- Incremental Static Regeneration
- 沒有自訂靜態策略的預設 next/image optimization
需要框架能力,但不需要伺服器時使用 Next.js
保留框架,拿掉伺服器
Next.js static export 讓你保留檔案式路由、layout、metadata、build-time rendering、CSS 支援,以及需要時的 client-side React。
輸出結果仍然只是檔案。這很適合行銷頁、文件站、作品集、產品頁、內容中心,以及能在建置時準備好的頁面。
像靜態資源一樣快
預先產生的 HTML 可以積極快取,並直接從邊緣節點提供,不必等待伺服器即時 render。
維運負擔更少
沒有 Node runtime,代表生產環境需要維護的環節更少,部署產物也更清楚。
執行邊界清楚
需要伺服器程式碼的頁面不該硬做成 static export。能提前建置的頁面,out 目錄就是乾淨的發佈產物。
常見 static export 阻礙
因 server-only 功能導致建置失敗
從匯出路由移除 request-time API,把邏輯移到獨立後端,或把該部分部署到支援伺服器功能的平台。
圖片在開發環境正常,匯出後失效
預設 next/image optimizer 需要伺服器。請使用 images.unoptimized、自訂 loader,或一般靜態圖片資源。
動態路由缺頁
在 App Router 用 generateStaticParams,或在 Pages Router 用 getStaticPaths,在建置時產生路由清單。
Redirects 或 rewrites 沒有套用
Next.js redirects 和 rewrites 不屬於 static export。請使用靜態頁結構、client-side navigation,或可用的平台層 redirect。
Next.js 靜態匯出檢查表
設定 output: 'export'
讓 Next.js 在建置時輸出靜態 HTML,而不是期待 next start 或 Node runtime。
output: 'export'建置並檢查 /out
執行正式 build,確認 out 目錄包含要發佈的頁面、資源、404 頁和靜態檔案。
npm run build上傳並測試路由
上傳 out 目錄後,檢查深層路徑、靜態資源和未最佳化圖片是否在上線網站正常。
Next.js 部署常見問題
為什麼 Next.js Image 元件匯出後會壞掉?
預設 Image 最佳化流程需要伺服器。靜態匯出時,請在 next.config.js 設定 images.unoptimized 為 true。
API routes 或 getServerSideProps 可以在這裡用嗎?
不行。Static export 會移除 API routes、middleware、getServerSideProps 等伺服器端 runtime 功能。請把這些邏輯移到獨立後端或 serverless 服務。
可以使用 App Router 嗎?
可以,只要該路由可靜態渲染,且不依賴 headers、cookies 等 dynamic server-only API。
動態內容該怎麼處理?
能在建置時取得就先建置;否則在頁面 hydration 後由 client-side 載入。Static export 最適合 HTML 可提前準備的頁面。
應該上傳 .next 還是 out?
output: 'export' 要上傳 out。.next 是 Next.js 的內部建置目錄,不是你要發佈的靜態匯出產物。
這能取代 Vercel 的 Next.js hosting 嗎?
它適合靜態匯出,不適合每一種 Next.js app。如果你依賴 SSR、middleware、ISR、server actions 或 API routes,就需要支援這些功能的 runtime。