cloudflare-mbt-worker-bundle について
MoonBit の JavaScript 出力を TypeScript の Cloudflare Worker エントリとまとめるビルドパイプラインのテンプレートです。Workers に MoonBit コードをデプロイするチーム向けに、必要なコード書き換えとバンドル検査を含みます。
主な機能
- 01MoonBit から JavaScript へのビルド準備
- 02Worker FFI のソース書き換え
- 03cf と Vite のビルドパイプライン
- 04生成バンドルの検証
- 05モード別 Worker 設定
活用シーン
- 01Worker ビルド前の MoonBit 出力の準備
- 02Cloudflare Workers へのビルド済みバンドルのデプロイ
- 03生成バンドルの不正な出力の検査
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ mizchi/ skills --skill cloudflare-mbt-worker-bundleインストール後、Claude Code で/cloudflare-mbt-worker-bundleを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
README.mdassets/scripts/check-worker-bundle.test.tscheck-worker-bundle.tsprepare-worker.ts.templateassets/templates/cloudflare.config.ts.templatevite.config.ts.templateworker.ts.templatereferences/cf-traps.mdmoonbit-ffi-rewrites.md詳細
Cloudflare Workers + MoonBit バンドルパイプライン
cf、cloudflare.config.ts、Cloudflare Vite プラグインを使って、MoonBit の JS 出力を TypeScript Worker のエントリーポイントとバンドルします。現在の cf/Vite セットアップについては、mizchi/cf-example(~/ghq/github.com/mizchi/cf-example)を参照してください。確認済みのバージョンは、Node.js 24 上の cf beta.5 と Vite プラグインの beta です。
パイプライン
moon build --target js --release
→ prepare-worker (FFI rewrites into src/_generated/<PKG>-core.js)
→ cf build --mode <mode>
→ check emitted bundle
→ cf deploy --prebuilt --mode <same-mode> --dry-run
→ cf deploy --prebuilt --mode <same-mode>
MoonBit の変更を含めてリリースするすべてのビルドの前に、準備処理を実行する必要があります。ローカル開発では、まず生成済み JS を準備し、pnpm exec cf dev を実行します。MoonBit のソースが変更されたら、生成し直してください。Vite は moon build を自動では呼び出しません。
MoonBit はプレーンな ESM JS を出力します。TypeScript のエントリーポイントは準備済みファイルを副作用インポートし、globalThis.__appServerFetch を登録します。元の _build/ ファイルをインポートすると、書き換えが適用されず、Worker がハングする場合があります。
このテンプレートが対象とするランタイムバージョンでは、次の 2 つのソース書き換えが必要です。
moonbitlang$async$internal$event_loop$$reschedule()を、生成された再帰的な再スケジュール用シンボルに置き換えます。これにより、await された処理が再開します。- モジュールスコープでのランダムシード初期化を決定的な定数に置き換えます。Workers ではモジュール初期化時のランダム I/O が禁止されています。
requiredReplace は、想定したソースが見つからない場合に失敗する必要があります。MoonBit/ランタイムをアップグレードした後は、生成コードを確認し、書き換えを黙ってスキップするのではなく、意図的に更新してください。詳細はmoonbit-ffi-rewrites.mdを参照してください。
アセット
- worker.ts.template:
./_generated/<PKG>-core.jsとテレメトリーのラッパーをインポートする TypeScript エントリーポイントです。src/worker.tsにコピーし、必要に応じて<PKG>とハンドラー登録名を置き換えてください。 - prepare-worker.ts.template:
scripts/prepare-worker.tsにコピーし、<PKG>を置き換えて、両方の FFI 書き換えを適用し、準備済み JS をsrc/_generated/に書き出してください。 - cloudflare.config.ts.template:
cloudflare.config.tsにコピーしてください。モードによって、本番/ステージング Worker 名、D1 ID、R2 名を選択します。リソースをプロビジョニングした後に ID を置き換え、cf d1 migrations apply DATABASE_ID --dir db/migrationsで D1 マイグレーションを適用してください。 - vite.config.ts.template:
cf dev/cf buildが使用する Vite 連携設定です。 - check-worker-bundle.ts:出力された JS バンドルに、破損した制御バイト、スタブ出力、プロジェクト固有のマーカーがないか確認します。
worker.config.jsonのマニフェストでメインモジュールを確認し、そのパスを.cloudflare/output/v0/workers/<worker>/bundle/以下で指定してください。Vite がモジュールを分割する場合は、ほかのモジュールにあるマーカーも含められるよう、バンドルディレクトリを確認してください。
pnpm で cf、@cloudflare/vite-plugin@beta、Vite、TypeScript を追加し、ロックファイルをコミットします。pnpm exec cf workers types で型を生成し、.cloudflare/types を TypeScript に含めてください。ビルドモードは、ビルド済みの成果物をデプロイする際にも使用してください。必須のシークレットバインディングについては、検証とデプロイに、無視対象の --secrets-file を渡してください。
既存の Worker を移行する場合は、プロジェクトのコマンドを使う前に cf migrate --dry-run、続いて cf migrate を実行してください。以前の DO ライフサイクル履歴とリソース ID を維持し、既存のバインディングが失われるような設定を新たに初期化しないでください。cf 設定ガイドを参照してください。
参考資料
- cf-traps.md:モード、ビルド成果物、リソース ID、未対応の beta 操作について説明しています。
- moonbit-ffi-rewrites.md:ランタイムの書き換え対象と症状について説明しています。
- cf-example:cf/Vite/型/Playwright の例です。
- cloudflare-starterkit-mbt と mnemo:MoonBit のハンドラー/ランタイムの例です。古い CLI セットアップを cf 向けに置き換えてください。