5月27日 21:46
Vercel 的 Edge Functions 和 Serverless Functions 有什么区别?
核心区别
Edge Functions 运行在全球边缘节点的 V8 隔离实例上,冷启动 <50ms;Serverless Functions 运行在中心化服务器的 Node.js 运行时中,冷启动 500ms-3s。本质区别是运行时环境和部署位置:Edge 用轻量 V8 Runtime 换取极低延迟,Serverless 用完整 Node.js 换取功能全面。
关键参数对比
| 维度 | Edge Functions | Serverless Functions |
|---|---|---|
| 运行时 | Edge Runtime (V8) | Node.js |
| 冷启动 | <50ms | 500ms-3s |
| 执行时限 | 30s (Pro) | 60s (Pro),企业版可达 900s |
| 内存 | 128 MB | 最高 3008 MB |
| 请求体大小 | 1 MB | 4.5 MB |
| 部署包 | <1 MB | 50 MB 压缩(解压 250 MB) |
| 文件系统 | 不支持 | 只读访问 |
| Node.js API | 受限(无 fs/child_process) | 完整支持 |
| 数据库连接 | 不支持连接池,需 HTTP 驱动 | 支持 Prisma/ORM 连接池 |
| 部署位置 | 全球边缘节点自动就近 | 指定区域 |
Edge Functions 适用场景
路由重写、A/B 测试、地理路由、认证鉴权、缓存控制——特点是逻辑轻、响应要求快:
javascript// middleware.js import { NextResponse } from "next/server"; export const runtime = "edge"; export function middleware(request) { const token = request.cookies.get("auth-token"); if (!token) { return NextResponse.redirect(new URL("/login", request.url)); } // 地理路由 if (request.geo?.country === "CN") { return NextResponse.rewrite(new URL("/zh", request.url)); } return NextResponse.next(); }
Serverless Functions 适用场景
复杂业务逻辑、数据库操作、文件处理、长时间计算——需要完整 Node.js 生态:
javascript// pages/api/data.js import { PrismaClient } from "@prisma/client"; const prisma = new PrismaClient(); export default async function handler(req, res) { const users = await prisma.user.findMany({ include: { posts: true }, }); res.status(200).json({ users }); } export const config = { maxDuration: 30, memory: 2048, };
混合使用:Edge 挡在前面
实际项目中常用 Edge 做认证和路由,请求通过后再交给 Serverless 处理业务。这样既利用了 Edge 的低延迟拦截,又不丢失 Serverless 的完整功能。
面试追问
- Edge Runtime 具体不支持哪些 API?
fs、child_process、crypto.createCipheriv(仅支持 Web Crypto)、net/tls模块均不可用;fetch、Request、Response、URL等 Web API 完整可用。 - Prisma 能在 Edge 上跑吗? Prisma Accelerate(HTTP 驱动)可以,但传统 Prisma Client(TCP 连接池)不行。同理,需 TCP 连接的数据库驱动都无法在 Edge 使用。
- Edge 的 128MB 内存够用吗? 路由/认证/缓存场景足够,但不要在 Edge 中做 JSON 大对象解析或图片处理,超出会 OOM。