React ↗ は、ユーザーインターフェイスを作るフレームワークです。再利用できる UI コンポーネントを作り、アプリケーションの状態を効率よく管理できます。React でシングルページアプリケーション(SPA)を作り、Cloudflare Workers 上のバックエンド API と組み合わせてフルスタックアプリケーションにできます。
このガイドでは、React + Vite アプリケーションを Cloudflare Workers にデプロイします。create-cloudflare CLI(C3)で新規プロジェクトを作るか、既存の React + Vite プロジェクトを適応できます。
CLI から始める - React SPA、Cloudflare Workers API、高速な開発向けの Cloudflare Vite プラグイン を含むフルスタックアプリを足場にします。
npm create cloudflare@latest -- my-react-app --framework=reactyarn create cloudflare my-react-app --framework=reactpnpm create cloudflare@latest my-react-app --framework=reactまたはすぐデプロイする - React、Workers API、Vite を使うフルスタックアプリを作成します。CI/CD とプレビューも用意されます。
-
create-cloudflare CLI(C3)で新規プロジェクトを作成する
npm create cloudflare@latest -- my-react-app --framework=reactyarn create cloudflare my-react-app --framework=reactpnpm create cloudflare@latest my-react-app --framework=reactこのプロジェクトの構成は?
プロジェクトのファイルツリーを簡略化すると、次のとおりです。
- my-react-app
- src/
- App.tsx
- worker/
- index.ts
- index.html
- vite.config.ts
- wrangler.jsonc
- src/
wrangler.jsoncは Wrangler 設定ファイル です。 このファイルでは:mainはworker/index.tsを指します。これが Worker で、バックエンド API として動きます。assets.not_found_handlingはsingle-page-applicationです。React SPA が扱うルートは Worker に届かず、課金されません。- Cloudflare の開発者プラットフォーム上のリソースへのバインディングを足す場合は、ここで設定します。バインディング を参照してください。
vite.config.tsは Cloudflare Vite プラグイン を使うように設定されています。Worker を Cloudflare Workers ランタイムで実行し、ローカル開発環境を本番に近づけます。worker/index.tsはバックエンド API で、テキストレスポンスを返す/api/エンドポイントが 1 つあります。src/App.tsxでは、React アプリがこのエンドポイントを呼び出してメッセージを取得し、表示します。 - my-react-app
-
Cloudflare Vite プラグイン でローカル開発する
プロジェクトを作成したあと、プロジェクトディレクトリで次のコマンドを実行し、ローカル開発サーバーを起動します。
npm run devyarn run devpnpm run devローカル開発では何が起きている?
このプロジェクトはローカル開発とビルドに Vite を使うため、ホットモジュールリプレースメント(HMR)を含む Vite の機能がすべて使えます。
加えて、
vite.config.tsは Cloudflare Vite プラグインを使うように設定されています。アプリケーションは本番と同じ Cloudflare Workers ランタイムで動き、バインディングのローカルエミュレーションにもアクセスできます。 -
プロジェクトをデプロイする
プロジェクトは、自分のマシンまたは任意の CI/CD(Cloudflare の Workers Builds を含む)から、
*.workers.devサブドメインまたは Custom Domain にデプロイできます。次のコマンドでビルドとデプロイを行います。CI を使う場合は、"デプロイコマンド" の設定を適切に更新してください。
npm run deployyarn run deploypnpm run deploy
すでに React + Vite アプリケーションがある場合は、Cloudflare Vite プラグインで Cloudflare Workers 向けに適応できます。既存のコードを保ったまま、静的アセットと任意の API Worker 付きで Cloudflare のエッジネットワークにデプロイできます。
-
プロジェクトディレクトリを開く
既存の React + Vite プロジェクトを、使っているエディターで開きます。まだない場合は、先に Vite で新規プロジェクトを足場にします。
npm create vite@latest -- my-react-app --template react-tsyarn create vite my-react-app --template react-tspnpm create vite@latest my-react-app --template react-ts次に、
my-react-appディレクトリをエディターで開きます。 -
Cloudflare Vite プラグインを追加する
npm i -D @cloudflare/vite-plugin wrangleryarn add -D @cloudflare/vite-plugin wranglerpnpm add -D @cloudflare/vite-plugin wranglerbun add -d @cloudflare/vite-plugin wranglervite.config.tsで、フレームワークのプラグインのあとに Cloudflare Vite プラグインを追加します。vite.config.tsts import { defineConfig } from "vite"; import react from "@vitejs/plugin-react"; import { cloudflare } from "@cloudflare/vite-plugin"; export default defineConfig({ plugins: [react(), cloudflare()], });Cloudflare Vite プラグインは、既定では設定不要です。アプリケーションのルートにある
wrangler.jsonc、wrangler.json、またはwrangler.tomlを探します。設定オプションは API リファレンス を参照してください。
-
Wrangler 設定ファイルを追加する
プロジェクトのルートに
wrangler.jsoncファイルを作成します。{ "$schema": "./node_modules/wrangler/config-schema.json", "name": "my-app", // Set this to today's date "compatibility_date": "2026-09-20", "assets": { "not_found_handling": "single-page-application" } }name = "my-app" # Set this to today's date compatibility_date = "2026-09-20" [assets] not_found_handling = "single-page-application"not_found_handlingの値はsingle-page-applicationに設定しています。 存在しないパスへのリクエストはすべてindex.htmlを返します。React Router など、クライアントサイドルーティングのソリューションではこの設定が必要です。Cloudflare プラグインでは、Vite のデフォルト動作の代わりに
assetsのルーティング設定を使います。 これにより、開発中も本番へデプロイしたときも、アプリケーションの ルーティング設定 は同じように動きます。Vite でアセットを設定する場合、
directoryフィールドは使いません。 出力設定のdirectoryは、クライアントのビルド出力を自動的に指します。 詳しくは 静的アセット を参照してください。 -
.gitignoreファイルを更新するWorkers を開発する際、Git に保存すべきでない追加ファイルが使われたり生成されたりします。 次の行を
.gitignoreファイルに追加します。.gitignoretxt .wrangler .dev.vars* -
ローカルで開発する
フレームワークの開発コマンドを実行し、Vite の開発サーバーを起動して、アプリケーションが想定どおりに動くことを確認します。
npm run devyarn run devpnpm run devフロントエンドのみのアプリケーションであれば、このあとビルド、プレビュー、デプロイできます。 以降のセクションでは、さらに進めて API Worker を追加する方法を説明します。
-
プロジェクトをビルドしてデプロイする
ビルドコマンドを実行して、アプリケーションをビルドします。
npm run buildyarn run buildpnpm run builddistディレクトリには、クライアントのビルド出力がclientサブディレクトリに入り、Worker のコードと出力されたwrangler.json設定ファイルが同じ場所に置かれます。preview コマンドを実行して、アプリケーションが想定どおりに動作することを確認します。
npm run previewyarn run previewpnpm run previewこのコマンドは、ビルド出力をローカルの Workers ランタイムで実行します。本番環境での動作に近い形で確認できます。
デプロイコマンドを実行して、アプリケーションを Cloudflare へデプロイします。
npx wrangler deployyarn wrangler deploypnpm wrangler deployこのコマンドは、ビルド出力に含まれる
wrangler.jsonを自動的に使います。
既存の React + Vite プロジェクトに API Worker を追加する場合は、次の手順も実施します。
-
Worker コード用に TypeScript を設定する
npm i -D @cloudflare/workers-typesyarn add -D @cloudflare/workers-typespnpm add -D @cloudflare/workers-typesbun add -d @cloudflare/workers-typesNode の TypeScript 設定を継承し、Workers の型を追加する
tsconfig.worker.jsonを作成します。tsconfig.worker.jsonjsonc { "extends": "./tsconfig.node.json", "compilerOptions": { "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.worker.tsbuildinfo", "types": ["@cloudflare/workers-types/2023-07-01", "vite/client"], }, "include": ["worker"], }次に、ルートの
tsconfig.jsonから、この新しい設定を参照します。tsconfig.jsonjsonc { "files": [], "references": [ { "path": "./tsconfig.app.json" }, { "path": "./tsconfig.node.json" }, { "path": "./tsconfig.worker.json" }, ], } -
設定に Worker のエントリポイントを追加する
Wrangler 設定ファイルを更新し、Worker のエントリポイントを指す
mainフィールドを追加します。{ "$schema": "./node_modules/wrangler/config-schema.json", "name": "my-app", // Set this to today's date "compatibility_date": "2026-09-20", "main": "./worker/index.ts", "assets": { "not_found_handling": "single-page-application" } }name = "my-app" # Set this to today's date compatibility_date = "2026-09-20" main = "./worker/index.ts" [assets] not_found_handling = "single-page-application"mainフィールドは、Worker コードのエントリファイルを指定します。 -
API Worker を追加する
次の内容で
worker/index.tsファイルを作成します。worker/index.tsts export default { fetch(request) { const url = new URL(request.url); if (url.pathname.startsWith("/api/")) { return Response.json({ name: "Cloudflare", }); } return new Response(null, { status: 404 }); }, } satisfies ExportedHandler;前のコードブロックで定義した Worker は、静的アセットに一致しないナビゲーション以外のリクエストで呼び出されます。
pathnameが/api/で始まる場合は JSON レスポンスを返し、それ以外は404レスポンスを返します。 -
クライアントから API を呼び出す
React コンポーネントから API を呼べます。たとえば
src/App.tsxでは:src/App.tsxtsx import { useState } from "react"; function App() { const [name, setName] = useState("unknown"); return ( <div className="card"> <button onClick={() => { fetch("/api/") .then((res) => res.json() as Promise<{ name: string }>) .then((data) => setName(data.name)); }} > Name from API is: {name} </button> </div> ); } export default App;
React を SPA として使う場合は、Wrangler 設定ファイルで not_found_handling = "single-page-application" を設定します。
デフォルトでは、Cloudflare はまずリクエストパスを静的アセットのパスと照合します。このパスは、アップロードしたアセットディレクトリのファイル構造に基づきます。対象は、Wrangler 設定の assets.directory で指定したディレクトリ、または Cloudflare Vite plugin の場合はクライアントビルドの出力ディレクトリです。一致しない場合は、Worker があれば呼び出します。Worker がない場合、または Worker がアセットバインディングを使う場合、Cloudflare は not_found_handling で設定した動作にフォールバックします。
静的アセットでのルーティングの仕組みと、この動作のカスタマイズについては、ルーティングのドキュメント を参照してください。
プロジェクトには ./worker/index.ts の Worker も含められます。React アプリケーションのバックエンド API として使えます。React アプリケーションから Workers バインディングへ直接アクセスはできませんが、この Worker 経由でやり取りできます。React アプリケーションから Worker へ fetch() リクエスト を送り、Worker がリクエストを処理してバインディングを使います。Workers バインディングの設定 を参照してください。
バインディングを使うと、アプリケーションを Cloudflare Developer Platform と完全に統合でき、コンピュート、ストレージ、AI などへアクセスできます。