从 Node.js Serverless 迁到 Edge:先查依赖图,再谈冷启动
迁 Edge 的动机很一致:冷启动。Node.js Serverless 冷启动 50-500ms,Edge 是 /get/my-key
-H "Authorization: Bearer "
REST 够用就 REST。需要事务/管道这类多步原子操作,别在 Edge 里硬撑,移到 Node.js 更省事。
## 坑五:jsonwebtoken 失效
`jsonwebtoken` 依赖 Node.js crypto 模块,Edge 没有。换 `jose`,底层是 Web Crypto API,运行环境和 bundle 体积都比原方案好:
```ts
import { jwtVerify, SignJWT } from 'jose'
const secret = new TextEncoder().encode(process.env.JWT_SECRET!)
// 签发
const token = await new SignJWT({ userId })
.setProtectedHeader({ alg: 'HS256' })
.setExpirationTime('1h')
.sign(secret)
// 验证
const { payload } = await jwtVerify(token, secret)
注意这是异步 API,替换同步的 jsonwebtoken.sign 时很容易漏掉 await。HTTP 层同理,直接用原生 fetch,不要迁就旧的 axios 调用。
取舍边界:什么时候根本别用 Edge
- 需要 fs 读文件、写文件
- 需要数据库 TCP 直连
- 依赖 Node 原生模块,或者不确定某个 npm 包是否间接依赖
- 任务的执行可能超过 30s
- 内存占用可能超过 128MB
Edge 适合的场景其实是有限的:SSE 透传、AI 流式输出(无硬超时,打字机效果)、地理定位路由、A/B 测试、中间件。Vercel AI SDK 的 streamText + useChat 可以直接用。
页面渲染、数据库操作放 Node.js Serverless;中间件、轻量 API、流式响应放 Edge。这是目前最不别扭的混合结构。
注意:在 Vercel 上,Middleware 始终运行在 Edge Runtime,选不了 Node.js。所以中间件里不要放数据库查询,只做请求级逻辑。
可复现的配置片段
Next.js 里声明 Edge 路由:
export const runtime = 'edge'
export async function GET(request: Request) {
const country = request.headers.get('x-vercel-ip-country') ?? 'unknown'
return Response.json({ country })
}
需要缓存就加响应头:
return Response.json({ country }, {
headers: {
'Cache-Control': 's-maxage=60, stale-while-revalidate=600'
}
})
非 Next.js 的 Vercel Edge Function(api/hello.ts):
export const config = { runtime: 'edge' }
export default function handler(request: Request) {
return Response.json({ hello: 'edge' })
}
地理定位用 x-vercel-ip-country / city / latitude / longitude / timezone 这几个请求头,多语言路由和 A/B 分流够用了。
失败表现汇总
- 构建期:
Module not found,错误信息指向fs或其他 Node 内置模块,先查依赖树 - 运行期:
TypeError,指向 crypto / fs 缺失 - 数据库 / Redis:连接超时或握手失败
两个实际建议:
- 迁移前先把
package.json的依赖逐个过一遍,凡是 import 了node:前缀模块,或者传递依赖里有fs/net/tls,先写替代方案 npx next build能过只是第一步,本地 dev 环境有 Node 兜底,不能代表 Edge 真实行为,部署后要单独验证所有跑到的路由
Edge 和 Node 是两条平行线,不是低配版和高配版的关系。数据库直连、文件系统、TCP,这三样绕不过去。想保留这三样的业务留在 Node.js Serverless;只碰 HTTP 和 Web API 的轻路径,才交给 Edge。