跳转到内容
搜索文档

React Router(原 Remix)

最后更新 查看 MarkdownAgent 设置

从 CLI 开始:使用 React Router v8 ↗ 和 Cloudflare Vite 插件 搭建全栈应用,获得极速开发体验。

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

或直接部署:使用 React Router v8 创建全栈应用,CI/CD 与预览均已为你配置好。

Deploy to Workers

React RouterDetected
Generated configuration
wrangler.jsonc
main:build/server/index.js
wrangler.jsonc
assets:directory: build/client
wrangler.jsonc
compatibility_flags:nodejs_compat
wrangler.jsonc
observability:enabled: true
WorkersDeployed
Wrangler handles configuration automatically

什么是 React Router?

React Router v8 ↗ 是用于构建 Web 应用的全栈 React 框架。 它与 Cloudflare Vite 插件 结合,为在 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.ts 是你的 React Router 配置文件 ↗。 在此文件中:

    • ssr 设置为 true,意味着应用将使用服务端渲染。

    vite.config.ts 是你的 Vite 配置文件 ↗。 React Router 和 Cloudflare 插件包含在 plugins 数组中。 Cloudflare Vite 插件 在 Workers 运行时中运行服务端代码,确保本地开发环境尽可能接近生产环境。

    wrangler.jsonc 是你的 Worker 配置文件。 在此文件中:

    • main 指向 ./workers/app.ts。 这是 Worker 的入口文件。 默认导出包含 fetch 处理器,将请求委托给 React Router。
    • 若要为 Cloudflare 开发者平台资源添加绑定(binding),在此配置。
  2. 在本地开发

    创建项目后,在项目目录中运行以下命令以启动本地开发服务器。

    npm run dev

    本地开发中发生了什么?

    此项目将 React Router 与 Cloudflare Vite 插件 结合使用。 这意味着应用在 Cloudflare Workers 运行时中运行,与生产环境一致,并支持访问绑定的本地模拟。

  3. 部署项目

    你可以从本地机器或任何 CI/CD 系统(包括 Cloudflare 自有的 Workers Builds)将项目部署到 *.workers.dev 子域或自定义域名。

    以下命令将构建并部署项目。若使用 CI,请确保相应更新你的 「deploy command」 配置。

    npm run deploy

在 React Router 中使用绑定(binding)

通过绑定(binding),应用可与 Cloudflare Developer Platform 完全集成,访问计算、存储、AI 等能力。

在 Wrangler 配置文件中配置绑定(binding)后,可在 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 Objects 和 Workflows。

示例:使用 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() };
}

通过绑定(binding),你的应用程序可以与 Cloudflare Developer Platform 完全集成,让你访问计算、存储、AI 等功能。

Bindings

访问计算、存储、AI 等功能。

这篇文档对您有帮助吗?