TanStack Start ↗ 是一个全栈框架,用于构建具有服务端渲染、流式传输、服务端函数和打包功能的 Web 应用。
创建预配置用于 Cloudflare Workers 的 TanStack Start 应用:
npm create cloudflare@latest -- my-tanstack-start-app --framework=tanstack-startyarn create cloudflare my-tanstack-start-app --framework=tanstack-startpnpm create cloudflare@latest my-tanstack-start-app --framework=tanstack-start启动本地开发服务器,在开发期间预览项目:
npm run devyarn run devpnpm run dev如果你已有 TanStack Start 应用,将其配置为在 Cloudflare Workers 上运行:
-
安装
@cloudflare/vite-plugin和wrangler:npm i @cloudflare/vite-plugin wrangler -- -Dyarn add @cloudflare/vite-plugin wrangler -Dpnpm add @cloudflare/vite-plugin wrangler -Dbun add @cloudflare/vite-plugin wrangler -D -
将 Cloudflare 插件添加到你的 Vite 配置:
vite.config.jsjs import { defineConfig } from "vite"; import { tanstackStart } from "@tanstack/react-start/plugin/vite"; import { cloudflare } from "@cloudflare/vite-plugin"; import react from "@vitejs/plugin-react"; export default defineConfig({ plugins: [ cloudflare({ viteEnvironment: { name: "ssr" } }), tanstackStart(), react(), ], });vite.config.tsts import { defineConfig } from "vite"; import { tanstackStart } from "@tanstack/react-start/plugin/vite"; import { cloudflare } from "@cloudflare/vite-plugin"; import react from "@vitejs/plugin-react"; export default defineConfig({ plugins: [ cloudflare({ viteEnvironment: { name: "ssr" } }), tanstackStart(), react(), ], }); -
添加
wrangler.jsonc配置文件:{ "$schema": "node_modules/wrangler/config-schema.json", "name": "<YOUR_PROJECT_NAME>", // Set this to today's date "compatibility_date": "2026-08-17", "compatibility_flags": ["nodejs_compat"], "main": "@tanstack/react-start/server-entry", "observability": { "enabled": true, }, }"$schema" = "node_modules/wrangler/config-schema.json" name = "<YOUR_PROJECT_NAME>" # Set this to today's date compatibility_date = "2026-08-17" compatibility_flags = [ "nodejs_compat" ] main = "@tanstack/react-start/server-entry" [observability] enabled = true -
更新
package.json中的scripts部分:package.jsonjson { "scripts": { "dev": "vite dev", "build": "vite build", "preview": "vite preview", "deploy": "npm run build && wrangler deploy", "cf-typegen": "wrangler types" } }
从本地机器或任何 CI/CD 系统(包括 Workers Builds)部署到 *.workers.dev 子域或自定义域名。
npm run deployyarn run deploypnpm run deployTanStack Start 使用 @tanstack/react-start/server-entry 作为默认入口点。创建自定义服务端入口点以添加额外的 Worker 处理器,例如 Queues 和 Cron Triggers。你也可以在此添加额外的导出,例如 Durable Objects 和 Workflows。
-
创建自定义服务端入口点文件:
src/server.jsjs import handler from "@tanstack/react-start/server-entry"; // Export Durable Objects as named exports export { MyDurableObject } from "./my-durable-object"; export default { fetch: handler.fetch, // Handle Queue messages async queue(batch, env, ctx) { for (const message of batch.messages) { console.log("Processing message:", message.body); message.ack(); } }, // Handle Cron Triggers async scheduled(event, env, ctx) { console.log("Cron triggered:", event.cron); }, };src/server.tsts import handler from "@tanstack/react-start/server-entry"; // Export Durable Objects as named exports export { MyDurableObject } from "./my-durable-object"; export default { fetch: handler.fetch, // Handle Queue messages async queue(batch, env, ctx) { for (const message of batch.messages) { console.log("Processing message:", message.body); message.ack(); } }, // Handle Cron Triggers async scheduled(event, env, ctx) { console.log("Cron triggered:", event.cron); }, }; -
更新 Wrangler 配置以指向自定义入口点:
{ "main": "src/server.ts", }main = "src/server.ts"
使用 /cdn-cgi/handler/scheduled 端点在本地测试 scheduled 处理器:
curl "http://localhost:3000/cdn-cgi/handler/scheduled?cron=*+*+*+*+*"示例:使用 Workflows
从自定义入口点导出 Workflow 类以运行持久、多步骤任务:
import {
WorkflowEntrypoint,
WorkflowStep,
WorkflowEvent,
} from "cloudflare:workers";
export class MyWorkflow extends WorkflowEntrypoint {
async run(event, step) {
const result = await step.do("process data", async () => {
return `Processed: ${event.payload.input}`;
});
await step.sleep("wait", "10 seconds");
await step.do("finalize", async () => {
console.log("Workflow complete:", result);
});
}
}import {
WorkflowEntrypoint,
WorkflowStep,
WorkflowEvent,
} from "cloudflare:workers";
export class MyWorkflow extends WorkflowEntrypoint<Env> {
async run(event: WorkflowEvent<{ input: string }>, step: WorkflowStep) {
const result = await step.do("process data", async () => {
return `Processed: ${event.payload.input}`;
});
await step.sleep("wait", "10 seconds");
await step.do("finalize", async () => {
console.log("Workflow complete:", result);
});
}
}将 Workflow 配置添加到 Wrangler 配置:
{
"workflows": [
{
"name": "my-workflow",
"binding": "MY_WORKFLOW",
"class_name": "MyWorkflow",
},
],
}[[workflows]]
name = "my-workflow"
binding = "MY_WORKFLOW"
class_name = "MyWorkflow"示例:使用 Service Bindings
添加 service binding 以从 TanStack Start 应用调用另一个 Worker 的 RPC 方法:
{
"services": [
{
"binding": "AUTH_SERVICE",
"service": "auth-worker",
},
],
}[[services]]
binding = "AUTH_SERVICE"
service = "auth-worker"从服务端函数调用绑定 Worker 的方法:
import { createServerFn } from "@tanstack/react-start";
import { env } from "cloudflare:workers";
const verifyUser = createServerFn()
.inputValidator((token) => token)
.handler(async ({ data: token }) => {
const result = await env.AUTH_SERVICE.verify(token);
return result;
});import { createServerFn } from "@tanstack/react-start";
import { env } from "cloudflare:workers";
const verifyUser = createServerFn()
.inputValidator((token: string) => token)
.handler(async ({ data: token }) => {
const result = await env.AUTH_SERVICE.verify(token);
return result;
});你的 TanStack Start 应用可以通过绑定(binding)在本地开发和生产环境中与 Cloudflare Developer Platform 完全集成。
通过在服务端代码中导入 env 对象访问绑定(binding):
import { createFileRoute } from "@tanstack/react-router";
import { createServerFn } from "@tanstack/react-start";
import { env } from "cloudflare:workers";
export const Route = createFileRoute("/")({
loader: () => getData(),
component: RouteComponent,
});
const getData = createServerFn().handler(() => {
// Access bindings via env
// For example: env.MY_KV, env.MY_BUCKET, env.AI, etc.
});
function RouteComponent() {
// ...
}import { createFileRoute } from "@tanstack/react-router";
import { createServerFn } from "@tanstack/react-start";
import { env } from "cloudflare:workers";
export const Route = createFileRoute("/")({
loader: () => getData(),
component: RouteComponent,
});
const getData = createServerFn().handler(() => {
// Access bindings via env
// For example: env.MY_KV, env.MY_BUCKET, env.AI, etc.
});
function RouteComponent() {
// ...
}根据 Wrangler 配置为绑定(binding)生成 TypeScript 类型:
npm run cf-typegenyarn run cf-typegenpnpm run cf-typegen通过绑定(binding),你的应用程序可以与 Cloudflare Developer Platform 完全集成,让你访问计算、存储、AI 等功能。
Bindings
向 Wrangler 配置添加 R2 bucket binding:
{
"r2_buckets": [
{
"binding": "MY_BUCKET",
"bucket_name": "<YOUR_BUCKET_NAME>",
},
],
}[[r2_buckets]]
binding = "MY_BUCKET"
bucket_name = "<YOUR_BUCKET_NAME>"在服务端函数中访问 bucket:
import { createServerFn } from "@tanstack/react-start";
import { env } from "cloudflare:workers";
const uploadFile = createServerFn({ method: "POST" })
.validator((data) => data)
.handler(async ({ data }) => {
await env.MY_BUCKET.put(data.key, data.content);
return { success: true };
});
const getFile = createServerFn()
.validator((key) => key)
.handler(async ({ data: key }) => {
const object = await env.MY_BUCKET.get(key);
return object ? await object.text() : null;
});import { createServerFn } from "@tanstack/react-start";
import { env } from "cloudflare:workers";
const uploadFile = createServerFn({ method: "POST" })
.validator((data: { key: string; content: string }) => data)
.handler(async ({ data }) => {
await env.MY_BUCKET.put(data.key, data.content);
return { success: true };
});
const getFile = createServerFn()
.validator((key: string) => key)
.handler(async ({ data: key }) => {
const object = await env.MY_BUCKET.get(key);
return object ? await object.text() : null;
});在构建时将应用预渲染为静态 HTML,并作为静态资源提供。
import { defineConfig } from "vite";
import { cloudflare } from "@cloudflare/vite-plugin";
import { tanstackStart } from "@tanstack/react-start/plugin/vite";
import react from "@vitejs/plugin-react";
export default defineConfig({
plugins: [
cloudflare({ viteEnvironment: { name: "ssr" } }),
tanstackStart({
prerender: {
enabled: true,
},
}),
react(),
],
});import { defineConfig } from "vite";
import { cloudflare } from "@cloudflare/vite-plugin";
import { tanstackStart } from "@tanstack/react-start/plugin/vite";
import react from "@vitejs/plugin-react";
export default defineConfig({
plugins: [
cloudflare({ viteEnvironment: { name: "ssr" } }),
tanstackStart({
prerender: {
enabled: true,
},
}),
react(),
],
});更多选项,请参阅 TanStack Start static prerendering ↗。
要使用生产数据进行预渲染,请使用远程绑定(remote bindings)。
在 CI 环境中,构建期间可能无法获取环境变量或 secrets。要使其可访问:
- 在 CI 环境中设置
CLOUDFLARE_INCLUDE_PROCESS_ENV=true,并将所需值作为环境变量提供。 - 如果使用 Workers Builds,请更新构建设置。