Framework Comparison

A detailed feature matrix for all 10 frameworks on Cloudflare Workers. Use this to make an informed decision, not just go with the most popular option.

Feature Matrix

FeatureReact Router v7AstroSvelteKitTanStack StartHonoNext.js (OpenNext)NuxtQwik CitySolidStartVite+React SPA
SSRYesYesYesYesPartialYesYesYesYesNo
SSGYesYesYesYesNoYesYesYesYesN/A
StreamingYesYesYesYesYesYesYesYesYesN/A
CF Vite PluginYesYesNoYesOptionalNoNoNoNoYes
workerd in devYesYesNoYesYesNoNoNoNoYes
File routingYesYesYesYesNoYesYesYesYesNo
Bindings in devRealRealMockedRealRealMockedMockedMockedMockedN/A
Worker entry pointYesNoNoYesYesPartialNoNoNoOptional
Durable Objects colocateYesNoNoYesYesNoNoNoNoNo
Auto-detect deployYesYesYesYesNoNoYesYesYesYes

Edge-Friendliness Ranking

Ranked by how well each framework fits the Cloudflare Workers runtime model (V8 isolates, no Node.js, binding-first architecture).

Tier S: Born for Workers

  1. Hono - Native Worker. No adapters, no polyfills, no impedance mismatch. If Workers had a default framework, this would be it. Limited to APIs and server-rendered HTML.

  2. React Router v7 - CF Vite Plugin, Worker entry point access, real bindings in dev. The closest thing to a full-stack Hono with React UI.

  3. TanStack Start - Same integration depth as React Router v7, plus type-safe routing. Newer, smaller community.

Tier A: Strong Integration

  1. Astro - CF Vite Plugin (adapter v13), real workerd in dev, zero-JS default. The best content framework on Cloudflare.

  2. Vite + React SPA - CF Vite Plugin for asset config. No server code to worry about. Zero edge-runtime issues because there’s no edge runtime.

Tier B: Works Well via Adapters

  1. SvelteKit - Solid adapter, good Cloudflare support, but dev runs in Node.js. You’ll catch some bugs only after deploying.

  2. Nuxt - Nitro server engine handles Workers well. Same dev/prod gap as SvelteKit.

  3. SolidStart - Works on Cloudflare Pages. Smaller community, fewer examples.

  4. Qwik City - Resumability model is interesting but the Cloudflare adapter is less mature. Targets Pages.

Tier C: Compatibility Layer

  1. Next.js (OpenNext) - Impressive feature coverage but fundamentally fighting the runtime. Node.js APIs shimmed, no workerd dev parity, community adapter with release lag.

Bundle Size Impact

Workers have a script size limit (3MB compressed free, 10MB paid). Framework server bundles vary significantly.

FrameworkApprox. Server BundleRisk at Free Tier
Hono~20KBNone
Vite+React SPA0 (no server)None
Astro (static)0 (no server)None
Astro (SSR)~100-300KBLow
React Router v7~200-500KBLow
TanStack Start~200-500KBLow
SvelteKit~200-400KBLow
SolidStart~200-400KBLow
Nuxt~500KB-1MBMedium
Qwik City~300-600KBLow-Medium
Next.js (OpenNext)~1-3MBHigh (may need paid)

Gotcha: These are approximate ranges. Your actual bundle depends on dependencies. Check with wrangler deploy --dry-run.

Migration Paths from Next.js

Path 1: Keep Next.js (Least Effort)

Next.js app -> Add OpenNext -> Deploy to Workers
  • Effort: Low
  • Risk: Dev/prod parity gap, community adapter dependency
  • Best when: Large existing codebase, can’t justify rewrite

Path 2: React Router v7 (Same Stack, Better Integration)

Next.js app -> Rewrite routes to React Router v7 -> CF Vite Plugin
  • Effort: Medium-High
  • Risk: Route migration, different data loading patterns
  • Best when: Starting fresh or unhappy with Next.js lock-in

Path 3: Astro (Content Sites)

Next.js content site -> Rewrite pages to .astro -> Add React islands where needed
  • Effort: Medium
  • Risk: Different mental model (MPA vs SPA)
  • Best when: Content-heavy site where most pages don’t need client JS

When NOT to Use Cloudflare

Be honest about the limits:

  • Heavy compute: Image processing, video transcoding, ML inference exceeding Workers AI - use a traditional server
  • Long-running processes: Workers have CPU time limits (10ms free, 30s paid per request)
  • Large dependencies: If your node_modules pull in native bindings (sharp, bcrypt, canvas), Workers won’t run them
  • Relational database needs beyond D1: D1 is SQLite-based. If you need Postgres features, you’ll need an external database and pay for latency
  • WebSocket-heavy apps without Durable Objects: Standard Workers can’t hold persistent WebSocket connections. You need Durable Objects, which adds complexity