Skip to content

非公式本サイトは非公式の日本語ドキュメントであり、Cloudflare 公式サイトではありません。最新情報はdevelopers.cloudflare.comをご確認ください。

React Router(旧 Remix)

最終更新 Markdown で表示Agent セットアップ

CLI から始める: React Router v8Cloudflare Vite plugin でフルスタックアプリの土台を作り、高速に開発できます。

npm create cloudflare@latest -- my-react-router-app --framework=react-router

すぐデプロイする: React Router v8 のフルスタックアプリを作成します。CI/CD とプレビューもあらかじめ設定されています。

Workers にデプロイ

React Router検出済み
生成された設定
wrangler.jsonc
main:build/server/index.js
wrangler.jsonc
assets:directory: build/client
wrangler.jsonc
compatibility_flags:nodejs_compat
wrangler.jsonc
observability:enabled: true
Workersデプロイ済み
Wrangler が設定を自動で処理します

React Router とは

React Router v8 は、Web アプリケーションを作るフルスタック React フレームワークです。 Cloudflare Vite plugin と組み合わせると、Cloudflare 上での開発、ビルド、デプロイを第一級の体験として使えます。

フルスタックの React Router アプリを作成する

  1. create-cloudflare CLI(C3)で新しいプロジェクトを作成する

    npm create cloudflare@latest -- my-react-router-app --framework=react-router

    このプロジェクトの構成は?

    プロジェクトの簡易的なファイルツリーは次のとおりです。

    • my-react-router-app
      • app
        • routes
          • ...
        • entry.server.ts
        • root.tsx
        • routes.ts
      • workers
        • app.ts
      • react-router.config.ts
      • vite.config.ts
      • wrangler.jsonc

    react-router.config.tsReact Router の設定ファイル です。 このファイルでは次のとおりです。

    • ssrtrue です。つまりアプリケーションはサーバーサイドレンダリングを使います。

    vite.config.tsVite の設定ファイル です。 plugins 配列に React Router と Cloudflare のプラグインが含まれます。 Cloudflare Vite plugin はサーバーコードを Workers ランタイムで実行し、ローカル開発環境を本番に近づけます。

    wrangler.jsoncWorker の設定ファイル です。 このファイルでは次のとおりです。

    • main./workers/app.ts を指します。 これが Worker のエントリファイルです。 デフォルトエクスポートには fetch ハンドラー があり、リクエストを React Router に委譲します。
    • Cloudflare の開発者プラットフォーム上のリソースへの バインディング を足す場合は、ここで設定します。
  2. ローカルで開発する

    プロジェクトを作成したら、プロジェクトディレクトリで次のコマンドを実行し、ローカル開発サーバーを起動します。

    npm run dev

    ローカル開発では何が起きている?

    このプロジェクトは React Router と Cloudflare Vite plugin を組み合わせて使います。 そのため、アプリケーションは本番と同じ Cloudflare Workers ランタイムで動き、バインディングのローカルエミュレーションにもアクセスできます。

  3. プロジェクトをデプロイする

    プロジェクトは、自分のマシンからも、Cloudflare の Workers Builds を含む任意の CI/CD からも、*.workers.dev サブドメインまたは カスタムドメイン にデプロイできます。

    次のコマンドでプロジェクトをビルドしてデプロイします。CI を使う場合は、「デプロイコマンド」 の設定を適切に更新してください。

    npm run deploy

React Router でバインディングを使う

バインディングを使うと、アプリケーションを Cloudflare Developer Platform と完全に統合でき、コンピュート、ストレージ、AI などにアクセスできます。

Wrangler 設定ファイルでバインディングを設定すると、loader または action 関数の context.cloudflare から使えます。

app/routes/home.tsxts
export function loader({ context }: Route.LoaderArgs) {
	return { message: context.cloudflare.env.VALUE_FROM_CLOUDFLARE };
}

export default function Home({ loaderData }: Route.ComponentProps) {
	return <Welcome message={loaderData.message} />;
}

Worker のエントリファイル(workers/app.ts)に直接アクセスできるため、Durable ObjectsWorkflows などの追加エクスポートも足せます。

例: Workflows を使う

Worker のエントリファイルに、簡単な Workflow を置く例です。

workers/app.tsts
import { createRequestHandler } from "react-router";
import { WorkflowEntrypoint, type WorkflowStep, type WorkflowEvent } from 'cloudflare:workers';

declare global {
	interface CloudflareEnvironment extends Env {}
}

type Env = {
	MY_WORKFLOW: Workflow;
};

export class MyWorkflow extends WorkflowEntrypoint<Env> {
	override async run(event: WorkflowEvent<{ hello: string }>, step: WorkflowStep) {
		await step.do("first step", async () => {
			return { output: "First step result" };
		});

		await step.sleep("sleep", "1 second");

		await step.do("second step", async () => {
			return { output: "Second step result" };
		});

		return "Workflow output";
	}
}

const requestHandler = createRequestHandler(
	() => import("virtual:react-router/server-build"),
	import.meta.env.MODE
);

export default {
	async fetch(request, env, ctx) {
		return requestHandler(request, {
			cloudflare: { env, ctx },
		});
	},
} satisfies ExportedHandler<CloudflareEnvironment>;

Wrangler 設定ファイルで設定します。

{
  "workflows": [
    {
      "name": "my-workflow",
      "binding": "MY_WORKFLOW",
      "class_name": "MyWorkflow"
    }
  ]
}
[[workflows]]
name = "my-workflow"
binding = "MY_WORKFLOW"
class_name = "MyWorkflow"

アプリケーションからは次のように使います。

app/routes/home.tsxts
export async function action({ context }: Route.ActionArgs) {
	const env = context.cloudflare.env;
	const instance = await env.MY_WORKFLOW.create({ params: { "hello": "world" } })
	return { id: instance.id, details: await instance.status() };
}

バインディングを使うと、アプリケーションを Cloudflare Developer Platform と完全に統合でき、コンピュート、ストレージ、AI などへアクセスできます。

役に立ちましたか?