mcpField
W
workers-frameworks

workers-frameworks

github.com/secondsky開発24082 回インストール5 週間前に更新
リポジトリ

workers-frameworks について

Cloudflare Workers 上で Hono、Remix、Next.js などを使ってアプリを構築する開発者向けのスキルです。フレームワーク選定の指針に加え、設定例やよくある問題の対処法をまとめています。

主な機能

  1. 017種類のWebフレームワークを比較
  2. 02アプリの種類に応じた選定ガイド
  3. 03設定と実装パターンの紹介
  4. 04よくあるエラーと対処法

活用シーン

  1. 01Workersプロジェクトのフレームワーク選定
  2. 02静的アセットと環境バインディングの設定
  3. 03SSRやデプロイの問題解決

インストール

コマンドをコピーしてターミナルで実行します。

$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"すべてエクスポート形式の誤りmodule.exports ではなく export default app を使用します
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 内の CJSESM の import に変換します
Response body is lockedすべて本文がすでに読み込まれている読み込む前にレスポンスを複製します
Bindings not availableすべてwrangler の設定が不足wrangler.jsonc にバインディングを追加します
404 on static assetsすべて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.mdAPI、マイクロサービス、または軽量アプリを構築する場合
references/remix.mdloader/action を使用したフルスタック React を構築する場合
references/nextjs.mdOpenNext を介して Workers 上で Next.js App Router を使用する場合
references/astro.mdコンテンツサイト、ブログ、ドキュメント、マーケティングページを構築する場合
references/sveltekit.mdWorkers 上で Svelte アプリケーションを構築する場合
references/qwik.md再開可能なアプリや即時読み込みを実現する場合
references/nuxt.mdNitro を使用した 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 の基本設定

コメント