mcpField
W
workers-frameworks

workers-frameworks

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

关于 workers-frameworks

面向在 Cloudflare Workers 上构建应用的开发者,提供 Hono、Remix、Next.js 等框架的选择建议、配置模式和常见问题参考。

主要功能

  1. 01对比七种 Web 框架
  2. 02按应用类型选择框架
  3. 03提供配置与编码模式
  4. 04整理常见错误及修复方法

适用场景

  1. 01为 Workers 项目选择框架
  2. 02配置静态资源与环境绑定
  3. 03排查 SSR 或部署问题

安装

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

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

安装后在 Claude Code 中输入/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