@@ -307,6 +307,116 @@ The custom server setup allows you to:
307
307
- Add server-side caching
308
308
- And more!
309
309
310
+ ## Cloudflare Workers Deployment
311
+
312
+ To deploy your React Router app to Cloudflare Workers:
313
+
314
+ 1. **Configure Rsbuild** (` rsbuild .config .ts ` ):
315
+ ` ` ` ts
316
+ import { defineConfig } from ' @rsbuild/core' ;
317
+ import { pluginReact } from ' @rsbuild/plugin-react' ;
318
+ import { pluginReactRouter } from ' @rsbuild/plugin-react-router' ;
319
+
320
+ export default defineConfig ({
321
+ environments: {
322
+ node: {
323
+ performance : {
324
+ chunkSplit: { strategy: ' all-in-one' },
325
+ },
326
+ tools: {
327
+ rspack: {
328
+ experiments: { outputModule: true },
329
+ externalsType: ' module' ,
330
+ output: {
331
+ chunkFormat: ' module' ,
332
+ chunkLoading: ' import' ,
333
+ workerChunkLoading: ' import' ,
334
+ wasmLoading: ' fetch' ,
335
+ library: { type: ' module' },
336
+ module: true ,
337
+ },
338
+ resolve: {
339
+ conditionNames: [' workerd' , ' worker' , ' browser' , ' import' , ' require' ],
340
+ },
341
+ },
342
+ },
343
+ },
344
+ },
345
+ plugins: [pluginReactRouter ({customServer: true }), pluginReact ()],
346
+ });
347
+ ` ` `
348
+
349
+ 2. **Create Worker Entry** (` server/ app .ts ` ):
350
+ ` ` ` ts
351
+ import { createRequestHandler } from ' react-router' ;
352
+
353
+ declare global {
354
+ interface CloudflareEnvironment extends Env {}
355
+ interface ImportMeta {
356
+ env: {
357
+ MODE : string;
358
+ };
359
+ }
360
+ }
361
+
362
+ declare module ' react-router' {
363
+ export interface AppLoadContext {
364
+ cloudflare : {
365
+ env : CloudflareEnvironment ;
366
+ ctx : ExecutionContext ;
367
+ };
368
+ }
369
+ }
370
+
371
+ // @ts-expect-error - virtual module provided by React Router at build time
372
+ import * as serverBuild from ' virtual/react-router/server-build' ;
373
+
374
+ const requestHandler = createRequestHandler (serverBuild, import .meta.env.MODE);
375
+
376
+ export default {
377
+ fetch (request , env , ctx ) {
378
+ return requestHandler (request, {
379
+ cloudflare: { env, ctx },
380
+ });
381
+ },
382
+ } satisfies ExportedHandler< CloudflareEnvironment> ;
383
+ ` ` `
384
+
385
+ 3. **Configure Wrangler** (` wrangler .toml ` ):
386
+ ` ` ` toml
387
+ workers_dev = true
388
+ name = " my-react-router-worker"
389
+ compatibility_date = " 2024-11-18"
390
+ main = " ./build/server/static/js/app.js"
391
+ assets = { directory = " ./build/client/" }
392
+
393
+ [vars]
394
+ VALUE_FROM_CLOUDFLARE = " Hello from Cloudflare"
395
+ ` ` `
396
+
397
+ 4. **Update Package Scripts** (` package .json ` ):
398
+ ` ` ` json
399
+ {
400
+ " scripts" : {
401
+ " build" : " rsbuild build" ,
402
+ " deploy" : " npm run build && wrangler deploy" ,
403
+ " dev" : " rsbuild dev" ,
404
+ " start" : " wrangler dev"
405
+ },
406
+ " dependencies" : {
407
+ " @react-router/node" : " ^7.1.3" ,
408
+ " @react-router/serve" : " ^7.1.3" ,
409
+ " react-router" : " ^7.1.3"
410
+ },
411
+ " devDependencies" : {
412
+ " @cloudflare/workers-types" : " ^4.20241112.0" ,
413
+ " @react-router/cloudflare" : " ^7.1.3" ,
414
+ " @react-router/dev" : " ^7.1.3" ,
415
+ " wrangler" : " ^3.106.0"
416
+ }
417
+ }
418
+ ` ` `
419
+
310
420
## Development
311
421
312
422
The plugin automatically:
0 commit comments