Installation
Install the required dependencies:Configuration
import { createRequestHandler } from "@react-router/cloudflare";
// @ts-expect-error - virtual module provided by React Router
import * as build from "virtual:react-router/server-build";
export default {
async fetch(request, env, ctx) {
const handler = createRequestHandler(build, "production");
return handler(request, { env, ctx });
},
};
import alchemy from "alchemy";
import { D1Database, KVNamespace, ReactRouter } from "alchemy/cloudflare";
const app = await alchemy("my-react-router-app");
const [db, cache] = await Promise.all([
D1Database("database", {
name: `${app.name}-${app.stage}-db`,
}),
KVNamespace("cache", {
title: `${app.name}-${app.stage}-cache`,
}),
]);
const website = await ReactRouter("website", {
main: "workers/app.ts",
bindings: {
DB: db,
CACHE: cache,
API_SECRET: alchemy.secret.env.API_SECRET,
},
});
console.log({
url: website.url,
});
await app.finalize();
Configuration Options
Properties
main: Path to workers entry point- Default:
workers/app.ts
- Default:
bindings: Cloudflare bindings (KV, R2, D1, etc.)build: Build command override- Default:
react-router typegen && react-router build
- Default:
dev: Dev command override- Default:
react-router typegen && react-router dev
- Default:
entrypoint: Worker entrypoint path- Default:
build/server/index.js(SSR mode)
- Default:
assets: Static assets directory- Default:
build/client
- Default:
spa: Single-page application mode- Auto-detected from
react-router.config.ts
- Auto-detected from
SSR vs SPA Mode
The resource automatically detects whether SSR is enabled by checkingreact-router.config.ts:
Server-Side Rendering (Default)
React Router enables SSR by default:Client-Side Only
Disable SSR for client-side routing:Accessing Bindings
Access Cloudflare bindings in your React Router loaders and actions:Loaders
Actions
TypeScript Configuration
Generate type-safe bindings with React Router’s type generation:.react-router/types/ based on your workers/app.ts.
Local Development
The React Router dev server provides:- Hot module replacement
- Type generation
- Cloudflare Workers emulation
Build Configuration
Customize the build process:Node.js Compatibility
React Router automatically setscompatibility: "node" for Node.js API support:
- Node.js built-in modules
- npm packages with Node.js dependencies
- Full React Router feature set
Deployment Best Practices
- Keep
build/directory in.gitignore - Generate types before deploying
- Use environment variables for secrets
- Configure bindings in
alchemy.run.ts - Test locally with React Router dev server
Related Resources
- Website - Base resource for web applications
- Worker - Cloudflare Workers deployment
- D1 Database - SQL database
- KV Namespace - Key-value storage