cloudflare-nextjs について
OpenNextアダプターを使い、Next.jsアプリをCloudflare Workersへデプロイするためのスキルです。一般的なNext.jsのパターンではなく、Workers固有の設定、バインディング、キャッシュ、デプロイ手順、トラブルシューティングを扱います。
主な機能
- 01OpenNextとWorkersの設定ガイド
- 02既存プロジェクトの移行
- 03ローカルプレビューとデプロイスクリプト
- 04Cloudflareバインディングと型生成
- 05キャッシュ設定のガイド
- 06Workersのエラー調査
活用シーン
- 01Next.jsアプリのWorkersへのデプロイ
- 02既存Next.jsプロジェクトの移行
- 03バインディングとキャッシュの設定
- 04ビルドや実行時エラーの診断
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ secondsky/ claude-skills --skill cloudflare-nextjsインストール後、Claude Code で/cloudflare-nextjsを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
assets/workflow-diagram.mdreferences/advanced.mdbindings-and-services.mdcaching.mddatabase-client-example.tsdev-deploy-and-env.mderror-catalog-extended.mdfeature-support.mdknown-issues.mdopen-next.config.tspackage.jsontroubleshooting.mdwrangler.jsoncscripts/analyze-bundle.shsetup-existing-project.shsetup-new-project.sh詳細
OpenNext Cloudflare Adapter — Workers 上の Next.js
OpenNext アダプター(@opennextjs/cloudflare)を使用して、Next.js アプリケーションを Cloudflare Workers にデプロイします。このアダプターは標準的な Next.js ビルドを受け取り、package.json のビルドスクリプトを実行した後、Node.js 互換性レイヤー(nodejs_compat)を使って Workers ランタイム上で動作するように出力を変換します。Edge ランタイムではありません。
重要な要件(誤るとビルド/ランタイムが失敗します)
| 要件 | 値 | 理由 |
|---|---|---|
| ランタイム | Node.js(デフォルト)。export const runtime = "edge"; をすべて削除します | Edge ランタイムはサポートされていません。OpenNext は nodejs_compat を使用します。 |
compatibility_flags | ["nodejs_compat", "global_fetch_strictly_public"] | Node API を利用し、アプリコード内で fetch() を使えるようにします。 |
compatibility_date | ≥ 2024-09-23、≥ 2025-05-05 を推奨(FinalizationRegistry) | 古い日付では FinalizationRegistry、DO などが動作しません。 |
| Wrangler | デプロイには ≥ 3.99.0、keep_names には ≥ 4.13.0、安定版のリモートバインディングには ≥ 4.36.0 | ドキュメントに記載されている機能要件です。 |
| Next.js | v16 はすべてのマイナー/パッチバージョンをサポート。v14 と v15 は最新のマイナーバージョンをサポート。v14 は 2026 年第 1 四半期にサポート終了 | 概要ページに記載されています。 |
| Worker サイズ(gzip) | Free は 3 MiB/Paid は 10 MiB(圧縮後のみ) | Cloudflare の厳格な上限です。 |
Windows: 完全な動作保証はありません(Next.js のツールに問題があります)。WSL、Linux 仮想マシン、または Linux/macOS の CI を使用してください。既知の問題 #1305 を参照してください。
使い分け:このスキルと nextjs
nextjsスキル → フレームワーク/App Router/Server Components/Cache Components のパターンを扱います。あらゆるプラットフォーム(Vercel、セルフホストなど)が対象です。async params、proxy.tsへの移行、"use cache"に使用します。- このスキル(
cloudflare-nextjs) → OpenNext アダプターを使って Next.js を Workers にデプロイします。対象はwrangler.jsonc、open-next.config.ts、getCloudflareContext、キャッシュ階層、バインディング、スキュー保護、複数 Worker、Workers 固有のエラーです。
proxy.ts に関する注意(Next 16): Next 16 では
middleware.tsがproxy.tsに名称変更されましたが、@opennextjs/cloudflareはまだproxy.tsを認識しません(issue #1277)。Cloudflare では引き続きmiddleware.tsを使用してください。ここだけはnextjsスキルのガイダンスが適用されません。
クイックスタート
新規プロジェクト(推奨)
npm create cloudflare@latest -- my-next-app --framework=next --platform=workers
C3 は Next.js アプリをひな形から作成し、@opennextjs/cloudflare をインストールして、wrangler.jsonc、open-next.config.ts、.dev.vars を作成し、package.json のスクリプトを設定します。また、R2 が有効な場合はキャッシュ用の R2 バケットを作成します。
既存の Next.js プロジェクト(1 コマンド)
npx @opennextjs/cloudflare migrate
migrate は次の処理を自動化します。アダプターと wrangler のインストール、wrangler.jsonc/open-next.config.ts/.dev.vars の作成、スクリプトの更新、public/_headers の追加、.gitignore への .open-next の追加、next.config.ts への initOpenNextCloudflareForDev() の組み込み、そして(アカウントで R2 が有効な場合に限り)キャッシュ用 R2 バケットの作成と設定です。
手動インストール(migrate を実行しない場合)
npm install @opennextjs/cloudflare@latest
npm install --save-dev wrangler@latest
次に、3 つのファイルを作成し(references/wrangler.jsonc、references/open-next.config.ts、references/package.json を参照)、dev/preview/deploy/upload/cf-typegen スクリプトを追加します。アダプターのバージョンを固定し、アップグレード前に監査してください。dependency-upgrade スキルを参照してください。
4 つのスクリプト
// package.json
{
"dev": "next dev", // fast HMR via Next dev server
"preview": "opennextjs-cloudflare build && opennextjs-cloudflare preview", // build + run in workerd locally
"deploy": "opennextjs-cloudflare build && opennextjs-cloudflare deploy", // build + serve immediately
"upload": "opennextjs-cloudflare build && opennextjs-cloudflare upload", // build + upload a version (gradual rollout)
"cf-typegen": "wrangler types --env-interface CloudflareEnv cloudflare-env.d.ts"
}
dev— 最速のフィードバックループです。ローカルでシミュレートされたバインディングやリモートバインディングを使ってgetCloudflareContext()が動作するように、next.config.tsにinitOpenNextCloudflareForDev()を追加します。preview— 実際の Workers ランタイム(Node ではありません)で実行します。ランタイムでのみ発生する問題を検出するため、必ずdeployの前に実行してください。deploy— リモートキャッシュを作成した後、wrangler deployを実行します。アプリはすぐに配信されます。upload— リモートキャッシュを作成した後、wrangler versions uploadを実行します。自動では配信されません。段階的なデプロイに使用します。
build、preview、deploy、upload はすべて暗黙的に populateCache を呼び出すため、手動で実行する必要はありません。
開発用 next.config.ts
import type { NextConfig } from "next";
const nextConfig: NextConfig = { /* ... */ };
export default nextConfig;
import { initOpenNextCloudflareForDev } from "@opennextjs/cloudflare";
initOpenNextCloudflareForDev();
Cloudflare バインディングへのアクセス — getCloudflareContext()
バインディングに process.env を使用しないでください。 正式な API は、@opennextjs/cloudflare の getCloudflareContext() です。
import { getCloudflareContext } from "@opennextjs/cloudflare";
export async function GET() {
const { env, cf, ctx } = getCloudflareContext();
await env.MY_KV.put("foo", "bar");
return new Response(await env.MY_KV.get("foo"));
}
静的ルート(ISR/SSG)では非同期モードを使用する必要があります — 静的生成中にシークレットやローカル値が使用されるため、注意してください。
const { env } = await getCloudflareContext({ async: true });
TypeScript の型: npm run cf-typegen を実行すると cloudflare-env.d.ts が生成されます(バインディングを変更した後は再実行してください)。
リモートバインディング(ローカル開発 → 実際のリソース): Wrangler 4.36.0 で安定版になりました。古い Wrangler では、initOpenNextCloudflareForDev({ experimental: { remoteBindings: true } }) で有効にし、バインディングオプションでは remote ではなく experimental_remote キーを使用してください。注: リモートバインディングはビルド中にも使用されます。
詳しいパターン(D1/R2/KV/AI/Hyperdrive、Drizzle、Prisma、Stripe)→ references/bindings-and-services.md。
キャッシュ — 3 つのコンポーネント、3 つのティア
OpenNext のキャッシュは、Incremental Cache(ストレージ)、Queue(重複排除/再検証)、Tag Cache(オンデマンドの revalidateTag/revalidatePath)の 3 つの部分で構成されています。
| サイトのプロファイル | Incremental | Queue | Tag Cache | 条件 |
|---|---|---|---|---|
| SSG のみ(再検証なし) | staticAssetsIncrementalCache + enableCacheInterception: true | なし | なし | 最速のオプション。読み取り専用 |
| 小規模サイト(ISR/オンデマンド) | r2IncrementalCache | doQueue | d1NextTagCache | トラフィックが少ない場合。D1 タグキャッシュ |
| 大規模/高トラフィックのサイト | withRegionalCache(r2IncrementalCache, { mode: "long-lived" }) | doQueue | doShardedTagCache({ baseShardSize: 12 }) + purgeCache({ type: "direct" }) | DO シャーディング。オンデマンドを使用する場合はキャッシュのパージを追加 |
予約済みのバインディング名(再利用しないでください): ASSETS、WORKER_SELF_REFERENCE、NEXT_INC_CACHE_R2_BUCKET、NEXT_CACHE_DO_QUEUE、NEXT_TAG_CACHE_D1、NEXT_TAG_CACHE_DO_SHARDED、NEXT_CACHE_DO_PURGE、IMAGES。
- 増分キャッシュには Workers KV を使用しないでください — 結果整合性のため、古いデータが無期限に残る可能性があります。
- キャッシュインターセプション + PPR: 現時点では互換性がありません。キャッシュインターセプションはデフォルトで有効ではなく、PPR では動作しません。
- オンデマンド再検証には Tag Cache と Cache Purge コンポーネントの両方が必要です(キャッシュのパージはゾーン/カスタムドメインでのみ動作し、
CACHE_PURGE_API_TOKEN+CACHE_PURGE_ZONE_IDのシークレットが必要です)。 - Pages Router の
res.revalidateには、WORKER_SELF_REFERENCEという名前のセルフリファレンスサービスバインディングが必要です。 - ヘッダーに関する注意点: Worker は静的アセットの前では実行されないため、
public/と不変のビルドファイルにはnext.config.tsのheaders()が適用されません。public/_headersを使用してください。
詳細(すべてのオプション、環境変数、リージョナルモード、0.6 からの移行)→ references/caching.md と references/known-issues.md。
一般的な統合(概要 — 詳細なパターンはリファレンスを参照)
- Drizzle + D1/Hyperdrive/PG、Prisma + D1/PG/Hyperdrive —
reactのcache()を使ってリクエストごとにクライアントを作成します。PG プールにはmaxUses: 1を指定します。ISR/SSG ではgetCloudflareContext({ async: true })を使用します。Prisma ではpreviewFeatures = ["driverAdapters"]が必要です。schema.prismaに出力ディレクトリを指定せず、serverExternalPackages: ["@prisma/client", ".prisma/client"]を設定してください。→references/bindings-and-services.md - Stripe — Workers には
node:httpsがないため、httpClient: Stripe.createFetchHttpClient()を渡してください。→references/bindings-and-services.md - 画像の最適化 —
wrangler.jsoncでimages.binding: "IMAGES"を設定するか、ゾーンではカスタムローダー(/cdn-cgi/image/...)を使用します。minimumCacheTTLとdangerouslyAllowLocalIPはサポートされていません。カスタムローダーはミドルウェアをバイパスし、remotePatternsを無視します。→references/advanced.md - 環境変数 — Next.js の
.envファイルを使用します(.dev.varsだけでは不十分です)。.dev.varsのNEXTJS_ENVで環境を選択し、デプロイ時に--keep-varsを指定します。シークレットは書き込み専用です。→references/dev-deploy-and-env.md - カスタム Worker(
scheduled、Durable Object のエクスポートを追加する場合)— 生成された fetch ハンドラーを再エクスポートする Worker をmainの参照先にします。→references/advanced.md - マルチ Worker(ミドルウェアとサーバーを分割する場合)— Worker ごとのメモリ使用量とコールドスタートを削減します。プレビュー URL、スキュー保護、
@opennextjs/cloudflare deployとは互換性がありません。→references/advanced.md - スキュー保護(プレビュー URL に基づくバージョン照合)—
cloudflare.skewProtection.enabled、run_worker_first: true、getDeploymentId()、環境変数CF_WORKER_NAME/CF_PREVIEW_DOMAIN/CF_WORKERS_SCRIPTS_API_TOKEN/CF_ACCOUNT_IDを設定します。Durable Object を持つ Workers では無効です(DO を別の Worker に移動してください)。→references/advanced.md
よくあるエラー(全項目一覧 → references/error-catalog-extended.md)
1. Worker のサイズ制限超過
"Your Worker exceeded the size limit of 3 MiB"(Free)/"10 MiB"(Paid)。サイズ制限の対象となるのはgzip 圧縮後のサイズのみです。Free の場合は Paid にアップグレードしてください。Paid の場合は、まず npx @opennextjs/cloudflare build を実行してバンドルを分析し、.open-next/server-functions/default/handler.mjs.meta.json を確認します(ESBuild Bundle Analyzer で可視化できます)。未使用の依存関係を削除し、動的インポートを使用してください。
2. 別のリクエストの代わりに I/O を実行できない
グローバルな DB クライアント(例:postgres、pg Pool)を複数のリクエストで再利用しています。クライアントはリクエストハンドラーの内側で作成するか、react の cache() を使用してください。PG プールには maxUses: 1 を指定します。
3. NPM パッケージのインポート/「<package> を解決できませんでした」
nodejs_compat を有効にし、compatibility_date ≥ 2024-09-23 を確認してください。一部のパッケージは workerd エクスポートを提供しています。その場合は、next.config.ts の serverExternalPackages に追加してください(例:@prisma/client、.prisma/client、postgres、jose、react-textarea-autosize、@libsql/isomorphic-ws)。または、.env に WRANGLER_BUILD_CONDITIONS="" と WRANGLER_BUILD_PLATFORM="node" を設定してください。
4. SSRF(CVE-2025-6087)— バージョン < 1.3.0
/_next/image の SSRF。直ちに @opennextjs/cloudflare@^1.3.0(現行:^1.18.1)にアップグレードしてください。
5. チャンク server/chunks/ssr/<name>.js の読み込みに失敗
Turbopack ビルドでアダプターが古くなっています。@opennextjs/cloudflare を最新バージョンにアップグレードするか、webpack に切り替えてください(--turbo を付けずに next build を実行します)。
6. ReferenceError: FinalizationRegistry is not defined
compatibility_date が古すぎます。wrangler.jsonc で "compatibility_date": "2025-05-05"(またはそれ以降)を設定してください。
7. Uncaught ReferenceError: __name is not defined
Wrangler の esbuild keep-names は、実行時に一部のライブラリ(例:next-themes)が eval する生成スクリプト文字列に __name を挿入します。wrangler.jsonc で "keep_names": false を設定してください(Wrangler ≥ 4.13.0 が必要です)。デバッグ時に元の関数名が表示されなくなります。
8. populateCache remote 実行時の「Failed to send request to R2 worker」/403
Cloudflare Access で保護されたアカウントでは、open-next-cache-populate ヘルパーワーカーがブロックされます。このための Access アプリを別途作成しないでください。*.<account>.workers.dev を対象とする既存のアプリに Service Auth ポリシー(Include = Any Access Service Token)を追加し、サービストークンを作成して、CLOUDFLARE_ACCESS_CLIENT_ID/CLOUDFLARE_ACCESS_CLIENT_SECRET をエクスポートしてください。
既知の未解決バグ(最新のトラッカー)
執筆時点で繰り返し発生している問題です。必ずイシュートラッカーを確認してください。
| # | バグ | 回避策 |
|---|---|---|
| #1171 | v1.18.0 で R2 キャッシュの投入が壊れる(修正が保留中) | 1.17.x に固定するか、修正後のバージョンにアップグレードする |
| #1277 | proxy.js はサポートされていません — Next 16 での proxy.ts への名称変更によりルーティングが壊れる | Cloudflare では middleware.ts を使用する |
| #1130 / #1225 | cacheComponents: true でクラッシュする(Unexpected identifier '$'/Connection closed) | cacheComponents を無効にする |
| #1321 | React のハイドレーション不一致が断続的に発生する(読み込みの約9%) | — |
| #1322 / #1214 | Hyperdrive と pg/@prisma/adapter-pg のバンドルに失敗する | — |
| #1315 | Next 16 で時間ベースの fetch キャッシュ再検証が何もせずに終了する(デプロイ済み) | — |
| #1305 | Windows + Turbopack でルートが 500 エラーになる | Linux/macOS または webpack を使用する |
| #1317 | @cf-wasm/photon の Turbopack ビルドが失敗する(生の .wasm) | webpack を使用する |
| #1326 | webpack のチャンクインライン化で名前付きチャンクが見落とされ、Unknown chunk N が発生する | — |
| #617 | Node ミドルウェア(Next 15.2+)は未サポート(機能リクエスト) | 標準のミドルウェアを使用する |
トラッカー全文:https://github.com/opennextjs/opennextjs-cloudflare/issues
機能サポート
| 機能 | 状況 | 備考 |
|---|---|---|
| App Router、Pages Router、Route Handlers、Dynamic routes | ✅ | 完全対応 |
| React Server Components、Server Actions | ✅ | 完全対応 |
| SSG、SSR、ISR | ✅ | 完全対応 |
| Middleware | ✅ | Node ミドルウェア(Next 15.2+、issue #617)を除く |
| Image optimization | ✅ | Cloudflare Images 経由(バインディングまたはカスタムローダー) |
| Partial Prerendering(PPR) | ✅ | ただし、現時点ではキャッシュのインターセプトと PPR は互換性がありません |
Composable Caching('use cache')、after | ✅ | |
| Turbopack | ✅ | ただし、#1305、#1317、#1326 を参照してください。webpack のほうが安全です |
| Edge Runtime | ❌ | Node ランタイムのみ。runtime = "edge" を削除してください |
| Node Middleware(15.2+) | ❌ | #617 |
関連スキル
| スキル | 用途 |
|---|---|
nextjs | あらゆるプラットフォームにおける Next.js フレームワーク/App Router のパターン(proxy.ts/キャッシュ/Server Components のリファレンス) |
cloudflare-workers | 汎用的な Workers のパターン、フレームワークの選択肢(Hono と OpenNext) |
drizzle-orm-d1 | Drizzle + D1 の詳細解説(注:OpenNext では Wrangler をバンドルしないでください。エラーカタログを参照してください) |
cloudflare-r2/cloudflare-kv/cloudflare-d1 | サービスごとの詳細解説 |
dependency-upgrade | @opennextjs/cloudflare のバージョン固定/監査(本番トラフィック) |
参照資料を読み込むタイミング
| ファイル | 読み込むタイミング |
|---|---|
references/caching.md | 増分/キュー/タグキャッシュ、リージョナルキャッシュ、キャッシュの消去を選択/設定するとき |
references/bindings-and-services.md | D1/R2/KV/AI/Hyperdrive、Drizzle/Prisma のリクエストスコープクライアント、Stripe を統合するとき |
references/dev-deploy-and-env.md | 開発/プレビュー/デプロイ、Workers Builds の CI、環境変数/シークレットを設定するとき |
references/advanced.md | カスタム Worker、複数 Worker、スキュー保護、静的アセット、keep_names、workerd パッケージ、画像最適化について確認するとき |
references/known-issues.md | DO のビルド警告、0.6 から 1.0.0-beta への移行について確認するとき |
references/error-catalog-extended.md | 上記の上位 8 件以外のエラーについて確認するとき |
references/troubleshooting.md | 段階的なデバッグ、プロファイリング/圧縮について確認するとき |
references/feature-support.md | 詳細な機能互換性マトリクスを確認するとき |
references/wrangler.jsonc | 小規模/大規模サイト向けの wrangler テンプレート(すべての予約済みバインディング)を確認するとき |
references/open-next.config.ts | 実行可能な設定として、3 つのキャッシュ階層を確認するとき |
references/database-client-example.ts | リクエストスコープの DB クライアントパターンを確認するとき |
references/package.json | 参照用スクリプトとバージョンを確認するとき |
ソース
- 概要 — https://opennext.js.org/cloudflare
- はじめに — https://opennext.js.org/cloudflare/get-started
- CLI — https://opennext.js.org/cloudflare/cli
- バインディング — https://opennext.js.org/cloudflare/bindings
- キャッシュ — https://opennext.js.org/cloudflare/caching
- 方法:Stripe — https://opennext.js.org/cloudflare/howtos/stripeAPI
- 方法:DB — https://opennext.js.org/cloudflare/howtos/db
- 方法:開発/デプロイ — https://opennext.js.org/cloudflare/howtos/dev-deploy
- 方法:環境変数 — https://opennext.js.org/cloudflare/howtos/env-vars
- 方法:画像 — https://opennext.js.org/cloudflare/howtos/image
- 方法:カスタム Worker — https://opennext.js.org/cloudflare/howtos/custom-worker
- 方法:keep_names — https://opennext.js.org/cloudflare/howtos/keep_names
- 方法:workerd — https://opennext.js.org/cloudflare/howtos/workerd
- 方法:スキュー保護 — https://opennext.js.org/cloudflare/howtos/skew
- 方法:アセット — https://opennext.js.org/cloudflare/howtos/assets
- 方法:複数 Worker — https://opennext.js.org/cloudflare/howtos/multi-worker
- パフォーマンス — https://opennext.js.org/cloudflare/perf
- 既知の問題 — https://opennext.js.org/cloudflare/known-issues
- トラブルシューティング — https://opennext.js.org/cloudflare/troubleshooting
- 0.6 から 1.0.0-beta への移行 — https://opennext.js.org/cloudflare/migrate-from-0.6-to-1.0.0-beta
- 未解決の問題 — https://github.com/opennextjs/opennextjs-cloudflare/issues
バージョン: @opennextjs/cloudflare ^1.18.1 · Next.js 14/15/16 · Wrangler ≥ 3.99.0 · compatibility_date ≥ 2025-05-05
最終確認日: 2026-08-05