Cloudflare Pages でフロントエンドをデプロイする完全ガイド:React/Vue/Next.js の設定とエラー対処
前言
React プロジェクトを公開しようとして Cloudflare Pages の設定画面を開くと、「Build Command」と「Build Output Directory」で手が止まることがあります。npm run build か npm build か。出力は build か dist か。環境変数はどう設定するか。
本記事では、React、Vue、Next.js を Cloudflare Pages にデプロイする手順を、設定チェックリストと環境変数の設定、5 つのよくあるエラー対処(特に Next.js の nodejs_compat)までまとめて解説します。
なぜ Cloudflare Pages を選ぶのか
Vercel や Netlify があるのに、なぜ Cloudflare Pages かと思うかもしれません。私も最初は Vercel でした。無料版には制限があり、小さなプロジェクトを合わせると月 100GB を超え、速度制限に当たりました。
3 つのプラットフォームを比較すると、無料プランでは Cloudflare Pages がかなり有利です。
無制限トラフィックは大きな魅力です。個人プロジェクトを CF Pages に置いても、流量を気にしなくてよくなりました。
向いているシーン:
- 個人ブログ、ポートフォリオ
- 中小規模フロントエンド(SPA、静的サイト)
- グローバル加速が必要なプロジェクト
- トラフィックが読めないプロジェクト
あまり向かないシーン:
- 複雑な SSR が必要な大規模 Next.js(Vercel ほど Next.js 向きではない)
- ビルドが非常に多いプロジェクト(月 500 回制限)
- Vercel 固有機能(Edge Middleware など)が必須の場合
デプロイ前の準備
- Cloudflare アカウント
- Cloudflare で無料登録
- メール認証後すぐ使えます
- コードリポジトリ
- GitHub または GitLab にプッシュ
- CF Pages は Git から直接ビルドします
- ビルド設定の把握
- CRA か Vite か
- ビルドコマンド(多くは
npm run build) - 成果物ディレクトリ(CRA は
build、Vite はdist)
準備ができたら、実際にデプロイしていきます。
React アプリのデプロイ手順
React はよく使われるフレームワークで、CF Pages に載せた経験から設定の型をまとめました。
手早く React プロジェクトを作る(まだない場合)
# 方式 1:Vite(推奨、ビルドが速い)
npm create vite@latest my-react-app -- --template react
cd my-react-app
npm install
# 方式 2:Create React App
npx create-react-app my-react-app
cd my-react-app
個人的には Vite を推します。CRA はプロジェクトが大きいとビルドが遅くなりがちです。
Cloudflare Pages 設定チェックリスト
Cloudflare Dashboard → Pages →「プロジェクトを作成」→「Git に接続」でリポジトリを選びます。
| 設定項目 | Vite | CRA |
|---|---|---|
| Framework preset | None | Create React App |
| Build command | npm run build | npm run build |
| Build output directory | dist | build |
| Root directory | /(デフォルト) | /(デフォルト) |
| Environment variables | VITE_* | REACT_APP_* |
注意:
- Vite は Framework preset を None でよい(自動認識)
- CRA は「Create React App」で自動入力される
- 出力ディレクトリを間違えやすい:Vite は
dist、CRA はbuild
環境変数
クライアントで使う変数にはプレフィックスが必須です。
Vite: VITE_(例:VITE_API_URL)
CRA: REACT_APP_(例:REACT_APP_API_URL)
設定方法:
- Cloudflare Pages(推奨):プロジェクト → Settings → Environment variables → Add variable → Production または Preview
- コード内:
// Vite
const apiUrl = import.meta.env.VITE_API_URL;
// CRA
const apiUrl = process.env.REACT_APP_API_URL;
ローカル: ルートに .env.local
# Vite
VITE_API_URL=https://api.example.com
VITE_API_KEY=your-api-key-here
# CRA
REACT_APP_API_URL=https://api.example.com
REACT_APP_API_KEY=your-api-key-here
重要: .env.local は Git にコミットしない(.gitignore に .env*.local)。変数変更後は再デプロイが必要です。
SPA ルートの 404 対策
React Router 利用時、リロードで 404 になることがあります。SPA はすべてのパスを index.html に向ける必要があります。
public に _redirects を作成:
/* /index.html 200
すべてのパスを index.html に転送し 200 を返します。保存して再デプロイすればルーティングが直ります。
デプロイ成功の確認
「Save and Deploy」後、Deployments でログを確認します。
成功の目安:
- ログに “Success: Deployed to…”
xxx.pages.devの URL が発行される- サイトが表示される
失敗時:
- ログのエラーを確認
- よくある原因:出力ディレクトリの誤り、Node バージョン(
NODE_VERSION=18)、依存関係の問題
Vue アプリのデプロイ手順
Vue は React と似ていますが、細部に注意点があります。
手早く Vue プロジェクトを作る(任意)
# Vite(推奨)
npm create vite@latest my-vue-app -- --template vue
cd my-vue-app
npm install
# Vue CLI
vue create my-vue-app
cd my-vue-app
設定チェックリスト
| 設定項目 | Vite | Vue CLI |
|---|---|---|
| Framework preset | None | Vue |
| Build command | npm run build | npm run build |
| Build output directory | dist | dist |
| Root directory | /(デフォルト) | /(デフォルト) |
| Environment variables | VITE_* | VUE_APP_* |
重点: Vue CLI も Vite も出力は dist。プレフィックスは Vite が VITE_、Vue CLI が VUE_APP_。
環境変数
# .env.local(Vite+Vue)
VITE_API_BASE_URL=https://api.example.com
VITE_APP_TITLE=My Vue App
# .env.production(Vue CLI)
VUE_APP_API_BASE_URL=https://api.example.com
VUE_APP_TITLE=My Vue App
// Vite
const apiUrl = import.meta.env.VITE_API_BASE_URL;
// Vue CLI
const apiUrl = process.env.VUE_APP_API_BASE_URL;
Vue Router
History モードではリダイレクト必須。public/_redirects に /* /index.html 200(推奨)。
サブパスデプロイ時は vite.config.js で base: '/' を確認。
よくある問題
静的アセット 404: publicPath / base が / か確認。
Vite で “Unknown file extension”: Node が古いことが多い。環境変数に NODE_VERSION=18 を追加して再デプロイ。
Next.js アプリのデプロイ手順(重点)
3 フレームワークの中で Next.js は CF Pages 上で最も手間がかかります。初回は nodejs_compat で半日つまずきました。大規模 SSR が必要なら Vercel も選択肢ですが、静的サイトや軽い SSR なら CF Pages で十分。無料無制限トラフィックは大きいです。
Next.js の特殊性
- CF Pages は Next.js 専用ではない(Vercel とは違う)
- 静的エクスポート(簡単)と SSR(アダプター)の 2 方式
- SSR には
@opennextjs/cloudflare(旧@cloudflare/next-on-pagesは非推奨)
方式 1:静的エクスポート(初心者向け)
SSR・API Routes・ISR が不要なら最も簡単です。
向く例: ブログ、ドキュメント、展示サイト、動的データが少ないサイト
手順:
next.config.js:
/** @type {import('next').NextConfig} */
const nextConfig = {
output: 'export',
images: {
unoptimized: true,
},
}
module.exports = nextConfig
- Cloudflare Pages:
| 設定項目 | 内容 |
|---|---|
| Framework preset | Next.js (Static HTML Export) |
| Build command | npm run build |
| Build output directory | out |
| Root directory | /(デフォルト) |
制限:
- API Routes 不可
- ISR 不可
- Server Components 不可
- 動的ルートの SSR 不可
方式 2:SSR(OpenNext アダプター)
API Routes、SSR、動的ルートが必要な場合。
npm install @opennextjs/cloudflare
/** @type {import('next').NextConfig} */
const nextConfig = {
images: {
unoptimized: true,
},
}
module.exports = nextConfig
| 設定項目 | 内容 |
|---|---|
| Framework preset | None |
| Build command | npx @opennextjs/cloudflare |
| Build output directory | .worker-next |
| Root directory | / |
Compatibility Flags(最重要):
- プロジェクト → Settings → Functions
- Compatibility flags
- Configure Production compatibility flag
- フラグ
nodejs_compatを追加 - Compatibility Date は
2024-09-23以降
Production と Preview の両方に設定。未設定だとデプロイ後 500 になります。
Edge Runtime:
// app/api/hello/route.js
export const runtime = 'edge';
export async function GET(request) {
return new Response(JSON.stringify({ message: 'Hello from CF Pages' }), {
headers: { 'content-type': 'application/json' },
});
}
// pages/api/hello.js
export const config = {
runtime: 'edge',
};
export default function handler(req) {
return new Response(JSON.stringify({ message: 'Hello from CF Pages' }), {
headers: { 'content-type': 'application/json' },
});
}
サーバー側で動かすファイルにはすべてこの宣言が必要です。
Next.js の環境変数
クライアント(プレフィックス必須):
NEXT_PUBLIC_API_URL=https://api.example.com
NEXT_PUBLIC_SITE_NAME=My Next.js Site
サーバー(プレフィックス不要):
DATABASE_URL=postgresql://...
API_SECRET=your-secret-key
Settings → Environment variables で Production / Preview を選んで追加。
const apiUrl = process.env.NEXT_PUBLIC_API_URL;
const dbUrl = process.env.DATABASE_URL;
Next.js よくあるエラー(5 つ)
エラー 1:nodejs_compat is not defined / 500
Error: The global scope does not support nodejs_compat
原因: nodejs_compat 未設定。
対処: Settings → Functions → Production / Preview 両方に nodejs_compat を追加して再デプロイ。
エラー 2:デプロイ成功だが 404
症状: ビルド成功、xxx.pages.dev が 404、またはトップのみ表示。
原因: Edge Runtime 未設定、出力ディレクトリの誤り。
対処:
- API Routes / Server Components に
runtime = 'edge' - 出力は
.worker-next(アダプター)またはout(静的) - 静的なら
_redirectsを確認
エラー 3:FinalizationRegistry is not defined
原因: Compatibility Date が古い。
対処: Compatibility Date を 2024-09-23 以降に更新して再デプロイ。
エラー 4:ビルドが長い / 失敗
原因: Turbopack、依存が多い、プロジェクトが大きい。
対処:
- Build command は
npx @opennextjs/cloudflare(--turbo不要) npm prune- 可能なら静的エクスポートを検討
エラー 5:Image Optimization エラー
Error: Image Optimization using Next.js' default loader is not compatible with `output: 'export'`.
対処: images: { unoptimized: true }。最適化が必要なら Cloudflare Images、Cloudinary、事前圧縮など。
環境変数管理の応用
開発・プレビュー・本番の使い分けに慣れると運用が楽になります。
3 つの環境
| 環境 | トリガー | 用途 |
|---|---|---|
| Production | main など本番ブランチ | ユーザー向け本番 |
| Preview | 他ブランチ・PR | 機能確認 |
| Development | ローカル | 自分の PC のみ |
Dashboard での設定
Settings → Environment variables(Production / Preview タブ)
推奨:
- 本番:API Key などは Secret(例:
API_KEY=prod-key-12345) - プレビュー:テスト用は Plain text でも可(例:
API_KEY=test-key-67890)
ローカル
my-project/
├── .env.local
├── .env.example
├── .gitignore
VITE_API_BASE_URL=http://localhost:3000/api
VITE_API_KEY=local-dev-key
VITE_ENABLE_DEBUG=true
VITE_ENABLE_ANALYTICS=false
VITE_GOOGLE_ANALYTICS_ID=G-XXXXXXXXXX
.env.local は Git 非コミット。.env.example はコミット。.gitignore に .env*.local。
プレフィックス速見表
| フレームワーク | クライアント | サーバー |
|---|---|---|
| Vite | VITE_ | プレフィックスなし(ブラウザから不可) |
| CRA | REACT_APP_ | なし |
| Vue CLI | VUE_APP_ | なし |
| Next.js | NEXT_PUBLIC_ | プレフィックスなし |
覚え方: ブラウザで使う変数はプレフィックス必須。サーバー専用は不要。
効かないときの切り分け
- プレフィックス(Vite で
REACT_APP_、Next.js でNEXT_PUBLIC_忘れ) - 再デプロイ(Retry deployment または小さなコミット)
- 環境の取り違え(Production 変数を Preview URL で見ていないか)
- ビルドログで変数名を検索(Secret は値非表示)
- 参照方法
// ❌ Vite
const apiUrl = process.env.VITE_API_URL;
// ✅ Vite
const apiUrl = import.meta.env.VITE_API_URL;
応用テクニックとベストプラクティス
デプロイ成功は第一歩。以下で運用を一段上げられます。
カスタムドメイン
xxx.pages.dev から独自ドメインへ。
- プロジェクト → Custom domains → Set up a custom domain → 例:
blog.example.com - DNS: Cloudflare 管理なら CNAME 自動。他社なら手動:
CNAME blog your-project.pages.dev - SSL: 無料証明書が 5〜10 分程度で有効。HTTPS 自動。
Preview Deployments
非 main ブランチや PR でプレビュー環境が自動作成されます。
git checkout -b feature/new-button
git add .
git commit -m "Add new button"
git push origin feature/new-button
プレビュー URL 例:https://abc123.your-project.pages.dev
PR で確認し、main マージ後に本番へ。
メリット: ブランチごとに独立プレビュー、PM/デザイナーが本番に影響なく確認。
ビルドキャッシュ
node_modules は CF Pages がキャッシュしますが、さらに最適化できます。
- pnpm:
echo "package-manager=pnpm" > .npmrc - Build command:
pnpm install && pnpm build npm prune
pnpm へ切り替えてビルドが 5 分→2 分になった例もあります。
カスタム Headers
ルートに _headers:
# _headers 例
/*
X-Frame-Options: DENY
X-Content-Type-Options: nosniff
Referrer-Policy: no-referrer-when-downgrade
/static/*
Cache-Control: public, max-age=31536000, immutable
/api/*
Cache-Control: no-cache
再デプロイで反映されます。
まとめ
核心は 3 点です。
1. ビルド設定を押さえる
- Build command(多くは
npm run build) - 出力ディレクトリ(Vite
dist、CRAbuild、Next.js は方式による) - 環境変数のプレフィックス
2. よくあるハマり
- Next.js の
nodejs_compat(未設定で 500) - 環境変数プレフィックス(Vite
VITE_、NextNEXT_PUBLIC_) - SPA 404(
_redirects)
3. Preview を活用
- 本番で直接テストしない
- ブランチで Preview → 問題なければ main へ
初回設定に時間はかかりますが、一度できれば Git Push で自動デプロイ。無料無制限トラフィックは個人運用に効きます。
困ったとき:
- 本記事のエラー集を確認
- ビルドログのメッセージを読む
- Cloudflare Pages Docs
次の一歩:
- 最初のプロジェクトをデプロイ
- カスタムドメインを試す
- Preview Deployments を体験
コメントで質問があれば返信します。デプロイ成功を祈っています。
React/Vue/Next.js を Cloudflare Pages にデプロイする完全フロー
準備から設定・デプロイまで。環境変数とよくあるエラー対処、Next.js の nodejs_compat 設定を詳説
Estimated time: PT30M
-
1
Step 1: 準備と Cloudflare Pages を選ぶ理由
Cloudflare アカウント登録: -
2
Step 2: React デプロイ(Vite と CRA)
設定手順: -
3
Step 3: Vue デプロイ(Vite と Vue CLI)
Vite:preset None、dist、VITE* -
4
Step 4: Next.js デプロイ(静的と SSR)
静的:output export、out、Next.js (Static HTML Export) -
5
Step 5: Next.js エラーと環境変数
エラー 1:nodejs_compat → Functions で両環境に追加 -
6
Step 6: 環境変数の応用
Production / Preview / Development
FAQ
なぜ Vercel や Netlify ではなく Cloudflare Pages?無料版のメリットは?
機能比較:
• 無料トラフィック無制限(Vercel と Netlify は 100GB/月)
• ビルド 500 回/月(Vercel は 6000 分/月、Netlify は 300 分/月)
• 商用プロジェクト対応(Vercel は制限あり、Netlify は対応)
• CDN ノード 300 以上(世界中に分散、HTTPS 自動対応)
無制限トラフィックは特に魅力で、個人プロジェクトを CF Pages に置いても流量を気にしなくてよくなりました。
向いているシーン:
• 個人ブログ、ポートフォリオ
• 中小規模フロントエンド(SPA、静的サイト)
• グローバル加速が必要なプロジェクト
• トラフィックが読めないプロジェクト
あまり向かないシーン:
• 複雑な SSR が必要な大規模 Next.js(CF Pages の Next.js サポートは Vercel ほど充実していない)
• 頻繁にビルドするプロジェクト(月 500 回制限)
• Vercel 固有機能(Edge Middleware など)が必須のプロジェクト
React/Vue/Next.js のビルド設定の違いは?出力ディレクトリは?
Vite:
• Framework preset は None(CF Pages が自動認識)
• Build command は npm run build
• Build output directory は dist
• Root directory は /(デフォルト)
• 環境変数は VITE_* プレフィックス
CRA:
• Framework preset は Create React App(自動入力)
• Build command は npm run build
• Build output directory は build
• Root directory は /(デフォルト)
• 環境変数は REACT_APP_* プレフィックス
注意:出力ディレクトリを間違えやすい。Vite は dist、CRA は build。逆にしないこと。
Vue の設定:
Vite:
• Framework preset は None
• Build command は npm run build
• Build output directory は dist
• 環境変数は VITE_* プレフィックス
Vue CLI:
• Framework preset は Vue
• Build output directory は dist
• 環境変数は VUE_APP_* プレフィックス
Vue CLI と Vite はどちらも dist(React と違う)。プレフィックスは Vite が VITE_、Vue CLI が VUE_APP_。
Next.js:
静的エクスポート:
• Framework preset は Next.js (Static HTML Export)
• Build output directory は out
SSR モード:
• Framework preset は None
• Build command は npx @opennextjs/cloudflare
• Build output directory は .worker-next
環境変数のプレフィックス要件は?フレームワークごとの違いは?
React:
• Vite は VITE_(例:VITE_API_URL)
• CRA は REACT_APP_(例:REACT_APP_API_URL)
Vue:
• Vite+Vue は VITE_
• Vue CLI は VUE_APP_
Next.js:
• クライアントは NEXT_PUBLIC_(例:NEXT_PUBLIC_API_URL)
• サーバーはプレフィックス不要(例:DATABASE_URL)
速見表:
• Vite:クライアント VITE_、サーバーはプレフィックスなし(ブラウザからは見えない)
• CRA:REACT_APP_ のみ
• Vue CLI:VUE_APP_ のみ
• Next.js:NEXT_PUBLIC_ / サーバーは無プレフィックス
覚え方:ブラウザで使う変数はプレフィックス必須。API Key などサーバー専用は不要。
コード:
• Vite:import.meta.env.VITE_API_URL
• CRA:process.env.REACT_APP_API_URL
• Vue CLI:process.env.VUE_APP_API_BASE_URL
• Next.js クライアント:process.env.NEXT_PUBLIC_API_URL
• Next.js サーバー:process.env.DATABASE_URL
Next.js を Cloudflare Pages に載せる要点は?nodejs_compat エラーは?
• CF Pages は Next.js 専用ではない(Vercel とは違う)ため追加設定が必要
• 静的エクスポート(簡単)と SSR(アダプター)の 2 方式
• SSR には @opennextjs/cloudflare(旧 @cloudflare/next-on-pages は非推奨)
静的エクスポート:
• next.config.js に output: 'export'、images: { unoptimized: true }
• Framework preset:Next.js (Static HTML Export)
• Build output directory:out
制限:API Routes、ISR、Server Components、動的ルートの SSR は不可
SSR:
• npm install @opennextjs/cloudflare
• Build command:npx @opennextjs/cloudflare
• Build output directory:.worker-next
Compatibility Flags(最重要):
• Settings → Functions → nodejs_compat を追加
• Compatibility Date は 2024-09-23 以降
• Production と Preview の両方に設定。未設定だと 500 エラー
Edge Runtime:
• API Routes / Server Components には runtime = 'edge'(App Router)または config.runtime = 'edge'(Pages Router)
SPA のルート 404 は?Next.js デプロイ後の 404 は?
• React Router 利用時、リロードで 404 になりやすい
• すべてのルートを index.html に向ける必要がある
対処:public に _redirects を作成し、/* /index.html 200 と 1 行記述して再デプロイ
Vue Router:
• History モードではリダイレクト必須
• 方式 1:public/_redirects に /* /index.html 200
• 方式 2:vite.config.js で base: '/'(サブパスデプロイ時)
Next.js 404:
• ビルド成功でも xxx.pages.dev が 404、またはトップのみ表示
• 原因:Edge Runtime 未設定、Build output directory の誤り
• 対処:runtime = 'edge' を確認、.worker-next または out を確認、静的なら _redirects
環境変数が効かないときの切り分けは?開発・プレビュー・本番の違いは?
1) プレフィックス:Vite で REACT_APP_ を使っていないか。Next.js で NEXT_PUBLIC_ を忘れていないか
2) 再デプロイ:変数変更後は新しいデプロイが必要(Retry deployment または小さなコミット)
3) 環境の取り違え:Production の変数を Preview URL で見ていないか
4) ビルドログ:変数名を検索(Secret は値が表示されない)
5) 参照方法:Vite で process.env.VITE_* は誤り。import.meta.env.VITE_* が正しい
3 環境:
• Production(main など):本番
• Preview(PR・他ブランチ):プレビュー
• Development:ローカルのみ
Dashboard:Settings → Environment variables(Production / Preview タブ)
• 本番の機密は Secret、プレビューは Plain text でも可
ローカル:.env.local(Git 非コミット)、.env.example(テンプレ)、.gitignore に .env*.local
6分で読めます · 公開日: 2025年12月1日 · 更新日: 2026年6月8日
Cloudflare フルスタック実践
検索からこのページに来た場合は、前後の記事もあわせて読むと同じテーマの理解がかなり早く深まります。
前の記事
Cloudflare Pages で静的ブログをデプロイする完全ガイド:5 大フレームワークの設定で落とし穴を避ける
Git リポジトリから Astro・Hugo・Hexo・Gatsby・Eleventy を Cloudflare Pages に一発デプロイ。ビルドコマンドと出力ディレクトリの正しい設定、画面真っ白・ビルド失敗の対処法を解説。10 分で公開まで
第 2 / 23 記事
次の記事
CF Pages のビルド失敗?よくある 8 パターンと解決策で半日分のデバッグを節約
Cloudflare Pages のビルド失敗でよくある 8 シナリオを体系的に整理。依存関係のインストール、Node バージョン、ビルドタイムアウト、モジュール解決などをカバーし、検証済みの解決策と予防策で、原因の特定とデバッグ時間の短縮を支援します。
第 4 / 23 記事
関連記事
Cloudflare無料版の制限2026:Free、Pro、Business料金比較
Cloudflare無料版の制限2026:Free、Pro、Business料金比較
Cloudflare のキャッシュ命中率が 30% しかない?この 3 つのルールで 90% まで引き上げる
Cloudflare のキャッシュ命中率が 30% しかない?この 3 つのルールで 90% まで引き上げる
Cloudflareファイアウォールルール入門:無料5ルールで悪意トラフィック80%をフィルタ(テンプレ付き)
コメント
GitHubアカウントでログインしてコメントできます