在 Vercel 上部署 Bun 應用
Vercel 是一個用於建置、部署和擴充套件應用的雲平臺。Vercel Functions 可以在 Bun 執行環境上執行,可以通過 Vercel 支援的框架執行,也可以作為 Bun.serve() 伺服器執行。
- 在 vercel.json 中設定 Bun
要在 Bun 上執行 Functions,請將
bunVersion欄位新增到vercel.json檔案中:vercel.json{ "bunVersion": "1.4.x" // [!code ++] }Vercel 會管理補丁版本。
為獲得最佳效果,請確保本地 Bun 版本與 Vercel 使用的版本一致。
- 新增伺服器
選擇請求到達程式碼的方式。
Vercel 的 Bun 框架預設會將部署的每個請求傳送到單個
Bun.serve()伺服器。當專案設定了bunVersion、包含bun.lock檔案,並且在以下路徑之一存在伺服器入口點時,Vercel 會使用該預設:server.{js,cjs,mjs,ts,cts,mts}src/server.{js,cjs,mjs,ts,cts,mts}
在 Bun 1.2 或更高版本中,
bun install會建立bun.lock。在舊版本中,請執行bun install --save-text-lockfile。該預設不會檢測二進位制格式的bun.lockb。在模組載入時呼叫一次
Bun.serve()。Vercel 會檢測到該呼叫,並將傳入請求路由到它。Vercel 支援fetch、routes、error和websocket選項:server.ts
Bun.serve({ routes: { "/health": () => Response.json({ status: "ok" }), }, fetch() { return new Response("Hello from Bun on Vercel"); }, });最小專案包含
package.json、bun.lock、server.ts以及上一步中的vercel.json。它不需要api/目錄或任何路由設定。要將 Bun 伺服器新增到同時包含前端的專案中,請建立
api/server.ts,並在模組載入時呼叫一次Bun.serve()。Vercel 會將其作為/api/server下的單個 Function 部署。與框架預設不同,只有針對/api/server的請求才會到達此伺服器。api/server.ts
Bun.serve({ fetch(request) { const url = new URL(request.url); return Response.json({ message: "Hello from Bun on Vercel", pathname: url.pathname, }); }, });此設定只需要上一步中的
bunVersion設定;它不會使用框架預設,也不要求存在bun.lock檔案。若要將其他路徑傳送到此伺服器,請在vercel.json中新增路由覆蓋規則。每個覆蓋規則都必須使用完整請求路徑,包括/api/server字首。詳情請參閱 Vercel Bun 執行環境文件。Vercel 支援的框架(例如 Next.js、Express、Hono 和 Nitro)在設定
bunVersion後即可在 Bun 上執行。如果你要部署 Next.js 專案(包括 ISR),還需要更新
package.json中的指令碼,使 Next.js CLI 在 Bun 下執行:package.json{ "scripts": { "dev": "bun --bun next dev", // [!code ++] "build": "bun --bun next build" // [!code ++] } } - 部署你的應用
將你的程式碼庫連線至 Vercel,或通過 CLI 進行部署:
terminal# 使用 bunx(無全域性安裝) bunx vercel login bunx vercel deploy或者全域性安裝 Vercel CLI:
terminalbun i -g vercel vercel login vercel deploy - 驗證執行環境
要確認你的部署使用了 Bun,可以列印 Bun 版本:
server.ts
console.log("runtime", process.versions.bun);Textruntime 1.4.0
- Fluid 計算:Bun 和 Node.js 執行環境均執行在 Fluid 計算上,並支援相同的核心 Vercel Functions 功能。
- 中介軟體:若要使用 Bun 執行路由中介軟體,需要將執行環境設定為
nodejs:
export const config = { runtime: "nodejs" }; // [!code ++]