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 FunctionsServerless Functions
运行时Edge Runtime (V8)Node.js
冷启动<50ms500ms-3s
执行时限30s (Pro)60s (Pro),企业版可达 900s
内存128 MB最高 3008 MB
请求体大小1 MB4.5 MB
部署包<1 MB50 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? fschild_processcrypto.createCipheriv(仅支持 Web Crypto)、net/tls 模块均不可用;fetchRequestResponseURL 等 Web API 完整可用。
  • Prisma 能在 Edge 上跑吗? Prisma Accelerate(HTTP 驱动)可以,但传统 Prisma Client(TCP 连接池)不行。同理,需 TCP 连接的数据库驱动都无法在 Edge 使用。
  • Edge 的 128MB 内存够用吗? 路由/认证/缓存场景足够,但不要在 Edge 中做 JSON 大对象解析或图片处理,超出会 OOM。
标签:Vercel