云计算与部署部署到 Vercel

部署到 Vercel

用 bunVersion 让 Vercel Functions 以 Bun 运行,并处理 Next.js 与边界差异

最后更新于

你将得到什么

Vercel Functions 的请求由 Bun 执行,而不是只拿 Bun 装依赖。适用于受支持的框架(含 Next.js)和 /api 下的独立 Function。

1. 开启 Bun runtime

vercel.json
{
  "$schema": "https://openapi.vercel.sh/vercel.json",
  "bunVersion": "1.x"
}

1.x 是当前唯一合法值;小版本和补丁版本由 Vercel 托管。不要自行锁定小版本。

2. Next.js 的额外一步

使用 ISR 的 Next.js 项目必须把 dev / build 脚本交给 Bun 执行:

package.json
{
  "scripts": {
    "dev": "bun run --bun next dev",
    "build": "bun run --bun next build"
  }
}

应用仍由 Next.js 自己的构建链(Turbopack/Webpack)打包;--bun 只改变执行命令的运行时。不使用 ISR 时按 Vercel 当前文档确认是否仍需此步。

3. 独立 Function

/api 目录下的 .ts 文件会按 TypeScript 直接编译运行:

api/hello.ts
export default {
  async fetch(request: Request) {
    const url = new URL(request.url);
    const name = url.searchParams.get('name') || 'World';
    return Response.json({ message: `Hello ${name}!` });
  },
};

与 Node runtime 的差异

  • 没有自动 source map、字节码缓存,以及 node:http / node:https 的请求指标;fetch 指标两个运行时都可用。
  • 支持大多数 Node.js API,但不是全部;Function 里不要启动 Bun.serve
  • Routing Middleware 在设置 bunVersion 后与 Node runtime 行为一致,但 runtime 配置仍需写 nodejs

切换是可逆决策,也要实测

在预览部署上对比冷启动、p95、内存和错误率后再切生产;保留切回 Node runtime 只需删除 bunVersion。已有稳定 Node 工作负载不必为“统一”迁移。

验收

  1. 预览部署的 Function 日志确认 Bun 生效;
  2. 覆盖 SSR/ISR、流式响应、Server Function 和原生依赖路径;
  3. 错误栈可读性(无自动 source map)符合排障要求;
  4. 指标管线不依赖 node:http 请求指标。

官方参考:Vercel Bun runtimeBun on Vercel