Next.js 16 vs Remix
Next.js 16(Turbopackデフォルト、Partial Prerendering)vs Remix(Shopify、Web標準)——2026年のReactメタフレームワーク比較。
Next.jsの生みの親——ゼロコンフィグで最新機能を遅延なく提供
グローバルなV8-isolateネットワーク——エグレス無料、そして独自のNext.jsレイヤーvinextを搭載
状況次第で判断しよう。最新のNext.js機能を遅延なく使いたいならVercelを選ぶこと——パリティのリスクはゼロだ。帯域幅の重い、グローバルなプロジェクトで、コストの予測可能性を優先するならCloudflareが正しい賭けだ。OpenNextに加えて、まだベータだが急速に進化している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) まず互換性を測定し、その後プロジェクトに追加(Vite設定はvinext initが生成)
// $ 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 yalnız wrangler.jsonc'de "cache": { "enabled": true } iken çalışır
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に加えて、まだベータだが急速に進化しているvinextもある。重要な案件はOpenNextから始め、新規プロジェクトではvinextを試してみるとよい。
無料相談を受ける完全ではないが、近いところまで来ている:CloudflareのvinextレイヤーはNext.js 16のAPI表面の約94%(App Router、Server Actions、ISR、ミドルウェア)をサポートしており、公式のデフォルトルートとなっている——ただしまだベータ版だ。ドキュメントでは、既存のプロダクションアプリケーションで採用する前に`npx vinext check`を実行するよう案内している。より成熟した`@opennextjs/cloudflare`アダプターの方は、ISR+Partial PrerenderingのR2キャッシュバックエンドに古くなる問題(未解決のGitHub issue)を抱えている。