Edge 與 Node.js 運行環境
在 Next.js 的上下文中,運行環境 (runtime) 指的是程式碼執行期間可用的函式庫、API 和通用功能的集合。
在伺服器端,您的應用程式程式碼可以在兩種運行環境中渲染:
- Node.js 運行環境 (預設) 可存取所有 Node.js API 和生態系統中的相容套件。
- Edge 運行環境 基於 Web API。
運行環境差異
選擇運行環境時有許多考量因素。下表概覽主要差異。如需更深入的分析,請查看下方各節。
Node | Serverless | Edge | |
---|---|---|---|
冷啟動 | / | 一般 | 低 |
HTTP 串流 | 支援 | 支援 | 支援 |
I/O | 全部 | 全部 | 僅 fetch |
擴展性 | / | 高 | 最高 |
安全性 | 一般 | 高 | 高 |
延遲 | 一般 | 低 | 最低 |
npm 套件 | 全部 | 全部 | 較小子集 |
靜態渲染 | 支援 | 支援 | 不支援 |
動態渲染 | 支援 | 支援 | 支援 |
使用 fetch 重新驗證資料 | 支援 | 支援 | 支援 |
Edge 運行環境
在 Next.js 中,輕量級的 Edge 運行環境是 Node.js API 的一個子集。
如果您需要以低延遲提供動態、個人化的內容,且使用小型簡單的函式,Edge 運行環境是理想選擇。Edge 運行環境的速度來自於其極少的資源使用,但在許多情境下可能會有限制。
例如,在 Vercel 上執行的 Edge 運行環境程式碼大小不能超過 1 MB 至 4 MB,此限制包括導入的套件、字型和檔案,並會根據您的部署基礎設施而有所不同。此外,Edge 運行環境不支援所有 Node.js API,這意味著某些 npm
套件可能無法使用。例如出現「Module not found: Can't resolve 'fs'」或類似錯誤。如果您需要使用這些 API 或套件,我們建議使用 Node.js 運行環境。
Node.js 運行環境
使用 Node.js 運行環境可讓您存取所有 Node.js API 以及依賴它們的所有 npm 套件。然而,它的啟動速度不如使用 Edge 運行環境的路由。
將 Next.js 應用程式部署到 Node.js 伺服器需要管理、擴展和配置您的基礎設施。或者,您可以考慮將 Next.js 應用程式部署到像 Vercel 這樣的無伺服器平台,它會為您處理這些事務。
無伺服器 Node.js
如果您需要一個可擴展的解決方案來處理比 Edge 運行環境更複雜的計算負載,無伺服器是理想選擇。例如,在 Vercel 上的無伺服器函式,您的總程式碼大小為 50MB,包括導入的套件、字型和檔案。
與使用 Edge 的路由相比,缺點是無伺服器函式可能需要數百毫秒才能啟動並開始處理請求。根據您網站的流量大小,這種情況可能會頻繁發生,因為這些函式不常處於「熱」狀態。
範例
路由區段運行環境選項
您可以為 Next.js 應用程式中的個別路由區段指定運行環境。為此,宣告並匯出名為 runtime
的變數。該變數必須是字串,且值必須為 'nodejs'
或 'edge'
運行環境。
以下範例展示了一個頁面路由區段,該區段匯出了值為 'edge'
的 runtime
:
您也可以在布局層級定義 runtime
,這將使該布局下的所有路由在 edge 運行環境中執行:
如果未設定區段運行環境,將使用預設的 nodejs
運行環境。如果您不打算從 Node.js 運行環境變更,則不需要使用 runtime
選項。
請參考 Node.js 文件 和 Edge 文件 以獲取完整的可用 API 列表。根據您的部署基礎設施,兩種運行環境也都支援串流。