Next.js 16 与 Remix 对比
Next.js 16(默认启用 Turbopack、支持部分预渲染)与 Remix(Shopify 出品,注重 Web 标准)——2026 年 React 元框架对比。
Next.js 的缔造者——零配置即可率先体验最新特性
全球 V8-isolate 网络——零出站流量费用,如今还有自研的 Next.js 层 vinext
视具体情况而定。如果你想毫无延迟地使用最新的 Next.js 特性,就选择 Vercel——功能对等的风险为零。如果你的项目带宽消耗大、面向全球用户,并且更看重成本的可预测性,那么 Cloudflare 是正确的选择;除了成熟的 OpenNext,现在还有虽处于 beta 阶段但发展迅速的 vinext。关键业务从 OpenNext 开始,新项目可以尝试 vinext。
| 分类 | Vercel | Cloudflare (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 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 — 将 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)。