mcpField
C
cloudflare-workers-frameworks

cloudflare-workers-frameworks

github.com/secondsky开发240313 次安装5 周前更新
代码仓库

关于 cloudflare-workers-frameworks

这是一份使用 Hono、Remix、Next.js、Astro、SvelteKit、Qwik 和 Nuxt 等框架构建 Cloudflare Workers 全栈应用的参考技能,面向开发者提供框架选择建议及设置、排错资料。

主要功能

  1. 01框架选择指南
  2. 02框架专属设置参考
  3. 03常见错误解决方案
  4. 04Workers 绑定与静态资源模式
  5. 05性能优化建议

适用场景

  1. 01为 Workers 应用选择框架
  2. 02排查框架部署错误
  3. 03配置绑定和静态资源

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/secondsky/claude-skills --skill cloudflare-workers-frameworks

安装后在 Claude Code 中输入/cloudflare-workers-frameworks确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

references/
astro.md
hono.md
nextjs.md
nuxt.md
qwik.md
remix.md
sveltekit.md
templates/
astro-page.astro
hono-app.ts
nextjs-route.ts
nuxt-server.ts
qwik-route.tsx
remix-loader.tsx
sveltekit-route.ts

详细介绍

Workers 框架集成

使用现代框架在 Cloudflare Workers 上构建全栈应用。

快速入门:选择框架

框架最适用于SSR静态Workers 原生支持
HonoAPI、轻量级应用✅✅✅ 原生
Remix全栈应用✅✅✅ 适配器
Next.jsReact 应用✅✅⚠️ OpenNext
Astro内容网站✅✅✅ 适配器
SvelteKitSvelte 应用✅✅✅ 适配器
Qwik可恢复应用✅✅✅ 适配器
NuxtVue 应用✅✅✅ Nitro

框架决策树

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

常见的 10 个框架错误

错误框架原因解决方案
No matching export "default"全部导出格式错误使用 export default app,而不是 module.exports
Worker exceeded CPU limitNext.jsSSR 开销大使用 ISR,减小打包体积
Cannot read properties of undefined (reading 'env')Remix缺少上下文将 context 传递给 loader/action
globalThis is not defined全部Node.js 全局变量使用 nodejs_compat 标志
Dynamic require not supported全部ESM 中使用 CJS转换为 ESM 导入
Response body is locked全部响应体已读取读取前克隆响应
Bindings not available全部缺少 wrangler 配置将绑定添加到 wrangler.jsonc
404 on static assets全部静态资源配置错误在 wrangler.jsonc 中配置 assets
Hydration mismatchReact/Vue服务端与客户端不一致确保渲染一致
Maximum call stack exceeded全部循环导入重构模块结构

Hono 快速入门(推荐)

// 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" }
  ]
}

静态资源配置

// 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;

何时加载参考文档

在以下情况下,为用户加载对应框架的参考文档:

参考文档加载时机
references/hono.md构建 API、微服务或轻量级应用
references/remix.md使用 loaders/actions 构建全栈 React 应用
references/nextjs.md通过 OpenNext 在 Workers 上使用 Next.js App Router
references/astro.md构建内容网站、博客、文档或营销页面
references/sveltekit.md在 Workers 上构建 Svelte 应用
references/qwik.md构建可恢复应用,实现即时加载
references/nuxt.md使用 Nitro 构建 Vue 3 应用

各框架通用模式

环境绑定访问
// 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
错误处理模式
// 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
  );
});

性能提示

  1. 打包体积:压缩后控制在 1MB 以内
  2. 冷启动:尽量减少顶层代码
  3. 流式传输:在可用时使用流式 SSR
  4. 缓存:利用 Cache API 和 CDN
  5. 代码拆分:为路由使用动态导入

另请参阅

  • workers-performance - 优化技巧
  • workers-runtime-apis - Workers API 参考
  • cloudflare-worker-base - Workers 基础设置

评论

支持 Markdown