Vercel vs Cloudflare (Workers + Pages) 对比

Next.js 的缔造者——零配置即可率先体验最新特性

VS
Cloudflare (Workers + Pages)

全球 V8-isolate 网络——零出站流量费用,如今还有自研的 Next.js 层 vinext

15 分钟阅读DevOps

快速结论

视具体情况而定。如果你想毫无延迟地使用最新的 Next.js 特性,就选择 Vercel——功能对等的风险为零。如果你的项目带宽消耗大、面向全球用户,并且更看重成本的可预测性,那么 Cloudflare 是正确的选择;除了成熟的 OpenNext,现在还有虽处于 beta 阶段但发展迅速的 vinext。关键业务从 OpenNext 开始,新项目可以尝试 vinext。

VercelCloudflare (Workers + Pages)
阅读完整结论

评分对比

图表加载中…

详细评分

详细评分: Vercel Cloudflare (Workers + Pages) ——按类别打分,满分 10 分
分类VercelCloudflare (Workers + Pages)
性能
8/10
9/10
学习难易度
9/10
6/10
生态系统
9/10
7/10
社区
9/10
8/10
就业市场
8/10
7/10
面向未来
8/10
8/10

优缺点

Vercel

优点

  • 作为 Next.js 的开发公司,新特性(PPR、Turbopack、App Router)总是率先在这里成熟
  • 零配置部署——只需 git push,build/ISR/edge middleware 全部自动配置
  • 126 个 PoP / 覆盖 51 个国家的 CDN,加上 20 个具备计算能力的区域,实现低延迟 SSR
  • Fluid Compute 采用 Active CPU 计费——等待 I/O 时不计费
  • 每个 PR 自动生成 Preview 部署,天然融入团队协作流程
  • 官方 Next.js 缓存 API(revalidateTag、revalidatePath)享有第一手支持

缺点

  • Fast Data Transfer 为 $0.15/GB(Pro 计划包含首 1TB)——带宽消耗大的网站成本会迅速攀升
  • 没有原生的关系型/向量数据库;除 Blob Storage 外,其他数据都依赖 Marketplace 中的外部供应商
  • SAML SSO 在 Pro 计划中是独立付费插件(每月 $300);Directory Sync(SCIM)仅限 Enterprise 计划
  • 边缘 PoP 数量(126 个)相比 Cloudflare 的全球覆盖范围更为有限
  • 基于函数的计费模式,在高请求量/低 CPU 消耗的网站上,成本可能比 Workers 更高

最适合

希望零延迟使用最新 Next.js 特性(PPR、Turbopack、缓存 API)的团队追求零 DevOps、快速迭代的初创公司和代理机构希望基于 Preview 部署构建团队协作流程的产品团队CPU 消耗较高但流量中等的 SSR 应用

Cloudflare (Workers + Pages)

优点

  • 没有出站/带宽费用——仅按请求($0.30/百万次超额)和 CPU 时间($0.02/百万 CPU-ms 超额)计费
  • 95% 的网络节点距离全球互联网人口 50ms 以内——覆盖范围极广
  • V8 isolate 架构在结构上比基于容器的函数具备更轻量的冷启动
  • 通过 vinext,Next.js 16 API 表面约 94% 已被重新实现并获得支持
  • 借助 KV、R2、D1、Hyperdrive、Durable Objects,数据可以保存在同一个边缘网络中
  • 通过 Access for Workers(2026 年 8 月),身份策略直接绑定到 Worker,不受 route/preview URL 变化影响

缺点

  • vinext 处于 beta 阶段——建议在采用前先运行 `npx vinext check`;GitHub 仓库也说明它尚未能完全替代所有生产工作负载
  • OpenNext 适配器的 ISR+PPR R2 缓存后端存在约 24 小时后过期的风险(Issue #662;在适配器 v1.0.2 版本中被报告,至今仍未关闭)
  • next/image 优化仅获得部分支持——某些场景下需要额外配置
  • 由于不是 Next.js 的开发方,新框架特性的支持相比 Vercel 会有延迟
  • $5/月基础费 + 按请求/CPU 时间计费的模式,在低流量但 CPU 消耗大的应用上会降低成本的可预测性
  • OpenNext/vinext 这一层会带来额外的运维负担(适配器更新、缓存后端选择)

最适合

带宽消耗大(图片/视频/API 密集型)的网站——由于出站流量免费,成本更加可预测面向全球、多地区用户群体的应用倾向于在单一生态系统内使用 KV/D1/R2/Hyperdrive 等数据层的团队需要集中式身份/访问策略(Access)的多路由内部应用

代码对比

Vercel
// Vercel — Next.js 16 App Router,Cache Components(默认启用 PPR)+ 按需清除缓存
// next.config.ts
import type { NextConfig } from "next";

const nextConfig: NextConfig = {
  cacheComponents: true,
};

export default nextConfig;

// app/blog/[slug]/page.tsx — 使用 'use cache' + cacheTag 缓存数据
import { cacheTag } from "next/cache";

async function getPost(slug: string) {
  "use cache";
  cacheTag(`post-${slug}`);
  const res = await fetch(`https://api.example.com/posts/${slug}`);
  return res.json();
}

export default async function BlogPost({
  params,
}: {
  params: Promise<{ slug: string }>;
}) {
  const { slug } = await params;
  const post = await getPost(slug);

  return (
    <article>
      <h1>{post.title}</h1>
      <div dangerouslySetInnerHTML={{ __html: post.html }} />
    </article>
  );
}

// app/api/revalidate/route.ts — 按需清除缓存(Vercel Data Cache)
// "max" = stale-while-revalidate;若需在 webhook 中立即失效则使用 { expire: 0 }
import { revalidateTag } from "next/cache";
import { NextRequest, NextResponse } from "next/server";

export async function POST(req: NextRequest) {
  const { slug } = await req.json();
  revalidateTag(`post-${slug}`, "max");
  return NextResponse.json({ revalidated: true });
}

// vercel.json — 区域偏好与函数执行时长
{
  "regions": ["fra1"],
  "functions": {
    "app/api/revalidate/route.ts": { "maxDuration": 10 }
  }
}

// 部署
// $ vercel --prod
Cloudflare (Workers + Pages)
// Cloudflare — 将 Next.js 16 部署到 Workers(vinext,官方默认路径)
// 1)先评估兼容性,再添加到项目中(vinext init 会生成 Vite 配置)
// $ npx vinext check
// $ npx vinext init

// vite.config.ts — 路由级 ISR 使用 Workers Cache,数据缓存使用 KV
import { cloudflare } from "@cloudflare/vite-plugin";
import { cdnAdapter } from "@vinext/cloudflare/cache/cdn-adapter";
import { kvDataAdapter } from "@vinext/cloudflare/cache/kv-data-adapter";
import { defineConfig } from "vite";
import vinext from "vinext";

export default defineConfig({
  plugins: [
    vinext({
      // cdnAdapter 仅在 wrangler.jsonc 中设置 "cache": { "enabled": true } 时生效
      cache: { cdn: cdnAdapter(), data: kvDataAdapter() },
    }),
    cloudflare({
      viteEnvironment: { name: "rsc", childEnvironments: ["ssr"] },
    }),
  ],
});

// 部署 — 会自动生成 Worker 配置
// $ npx @vinext/cloudflare deploy

// 另一种方式:OpenNext 适配器 — open-next.config.ts
import { defineCloudflareConfig } from "@opennextjs/cloudflare";
import r2IncrementalCache from "@opennextjs/cloudflare/overrides/incremental-cache/r2-incremental-cache";

export default defineCloudflareConfig({ incrementalCache: r2IncrementalCache });
// $ opennextjs-cloudflare build && opennextjs-cloudflare deploy

// Access for Workers — 将 Worker 绑定到 Access 应用
// POST /accounts/{account_id}/access/apps
// "destinations": [{ "type": "worker", "worker_id": "<worker-id>" }]

结论

视具体情况而定。如果你想毫无延迟地使用最新的 Next.js 特性,就选择 Vercel——功能对等的风险为零。如果你的项目带宽消耗大、面向全球用户,并且更看重成本的可预测性,那么 Cloudflare 是正确的选择;除了成熟的 OpenNext,现在还有虽处于 beta 阶段但发展迅速的 vinext。关键业务从 OpenNext 开始,新项目可以尝试 vinext。

获取免费咨询
常见问题

常见问题

不完全,但已经很接近:Cloudflare 全新的 vinext 层支持 Next.js 16 API 表面的约 94%(App Router、Server Actions、ISR、middleware),并且是官方默认路径——但仍处于 beta 阶段;官方文档建议在现有生产应用中采用前先运行 `npx vinext check`。更成熟的 `@opennextjs/cloudflare` 适配器则在 ISR + Partial Prerendering 的 R2 缓存后端上存在一个缓存过期问题(GitHub 上仍是未关闭的 issue)。

相关博客文章

查看全部文章

相关项目

查看全部项目
全部对比