Claude-skills cloudflare-workers-frameworks
Framework integration for Cloudflare Workers. Use when building with Hono, Remix, Next.js, Astro, SvelteKit, Qwik, or Nuxt on Workers. Covers routing, SSR, static assets, and edge deployment.
install
source · Clone the upstream repo
git clone https://github.com/secondsky/claude-skills
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/secondsky/claude-skills "$T" && mkdir -p ~/.claude/skills && cp -r "$T/plugins/cloudflare-workers/skills/cloudflare-workers-frameworks" ~/.claude/skills/secondsky-claude-skills-cloudflare-workers-frameworks && rm -rf "$T"
manifest:
plugins/cloudflare-workers/skills/cloudflare-workers-frameworks/SKILL.mdsource content
Workers Frameworks Integration
Build full-stack applications on Cloudflare Workers using modern frameworks.
Quick Start: Choose Your Framework
| Framework | Best For | SSR | Static | Workers Native |
|---|---|---|---|---|
| Hono | APIs, lightweight apps | ✅ | ✅ | ✅ Native |
| Remix | Full-stack apps | ✅ | ✅ | ✅ Adapter |
| Next.js | React apps | ✅ | ✅ | ⚠️ OpenNext |
| Astro | Content sites | ✅ | ✅ | ✅ Adapter |
| SvelteKit | Svelte apps | ✅ | ✅ | ✅ Adapter |
| Qwik | Resumable apps | ✅ | ✅ | ✅ Adapter |
| Nuxt | Vue apps | ✅ | ✅ | ✅ Nitro |
Framework Decision Tree
Need an API only? └─ Yes → Hono (fastest, smallest) └─ No → Building a full app? └─ React → Next.js (OpenNext) or Remix └─ Vue → Nuxt └─ Svelte → SvelteKit └─ Content-heavy → Astro └─ Max performance → Qwik
Top 10 Framework Errors
| Error | Framework | Cause | Solution |
|---|---|---|---|
| All | Wrong export format | Use not |
| Next.js | Heavy SSR | Use ISR, reduce bundle size |
| Remix | Missing context | Pass to loader/action |
| All | Node.js globals | Use flag |
| All | CJS in ESM | Convert to ESM imports |
| All | Body already read | Clone response before reading |
| All | Missing wrangler config | Add bindings to wrangler.jsonc |
| All | Wrong assets config | Configure in wrangler.jsonc |
| React/Vue | Server/client differ | Ensure consistent rendering |
| All | Circular imports | Refactor module structure |
Hono Quick Start (Recommended)
// src/index.ts import { Hono } from 'hono'; import { cors } from 'hono/cors'; import { logger } from 'hono/logger'; interface Env { DB: D1Database; KV: KVNamespace; } const app = new Hono<{ Bindings: Env }>(); // Middleware app.use('*', logger()); app.use('/api/*', cors()); // Routes app.get('/', (c) => c.text('Hello Workers!')); app.get('/api/users', async (c) => { const { results } = await c.env.DB.prepare('SELECT * FROM users').all(); return c.json(results); }); app.post('/api/users', async (c) => { const { name, email } = await c.req.json(); await c.env.DB.prepare('INSERT INTO users (name, email) VALUES (?, ?)') .bind(name, email) .run(); return c.json({ success: true }, 201); }); export default app;
// wrangler.jsonc { "name": "my-app", "main": "src/index.ts", "compatibility_date": "2024-12-01", "compatibility_flags": ["nodejs_compat"], "d1_databases": [ { "binding": "DB", "database_name": "my-db", "database_id": "xxx" } ] }
Static Assets Configuration
// wrangler.jsonc - Serving static files { "name": "my-app", "main": "src/index.ts", "assets": { "directory": "./public", "binding": "ASSETS" } }
// Serve static with fallback to app import { Hono } from 'hono'; const app = new Hono<{ Bindings: { ASSETS: Fetcher } }>(); // API routes app.get('/api/*', apiHandler); // Static assets fallback app.get('*', async (c) => { return c.env.ASSETS.fetch(c.req.raw); }); export default app;
When to Load References
Load the specific framework reference when user:
| Reference | Load When |
|---|---|
| Building APIs, microservices, or lightweight apps |
| Full-stack React with loaders/actions |
| Next.js App Router on Workers via OpenNext |
| Content sites, blogs, docs, marketing pages |
| Svelte applications on Workers |
| Resumable apps, instant loading |
| Vue 3 applications with Nitro |
Common Patterns Across Frameworks
Environment Bindings Access
// Hono app.get('/', (c) => c.env.DB.prepare('...')); // Remix export async function loader({ context }) { return context.cloudflare.env.DB.prepare('...'); } // Astro const db = Astro.locals.runtime.env.DB; // SvelteKit export async function load({ platform }) { return platform.env.DB.prepare('...'); } // Nuxt const { cloudflare } = useRuntimeConfig(); // Or via nitro: event.context.cloudflare.env.DB
Error Handling Pattern
// Universal error boundary pattern app.onError((err, c) => { console.error(`[${c.req.path}] ${err.message}`); if (err instanceof HTTPException) { return err.getResponse(); } return c.json( { error: 'Internal Server Error' }, 500 ); });
Performance Tips
- Bundle Size: Keep under 1MB compressed
- Cold Starts: Minimize top-level code
- Streaming: Use streaming SSR when available
- Caching: Leverage Cache API and CDN
- Code Splitting: Dynamic imports for routes
See Also
- Optimization techniquesworkers-performance
- Workers APIs referenceworkers-runtime-apis
- Basic Workers setupcloudflare-worker-base