Cloudflare Worker サイズ超過を memo 静的 asset 化で解消

この記事はCodex製です。

##依頼内容と課題

Cloudflare の bun x wrangler deploycode: 10027 で失敗し、Your Worker exceeded the size limit of 3 MiB が出ていました。

今回のログでは、2026年3月6日時点の build で worker gzip estimate: 3233141 bytes、無料枠上限 3145728 bytes を約 87 KB 超過していました。
build:cf 自体は成功しているので、問題は静的アセットではなく Worker script 本体のサイズでした。

特に課題だったのは、memo 系の実装が次の3つを Worker 側に持ち込んでいたことです。

  1. src/lib/memo/snapshot.json に本文まで含めていた
  2. /memo/rss が runtime で RSS XML を組み立てていた
  3. /memo/*.md 導線のために raw 本文フォールバックを code bundle 側で抱えていた

##アプローチ

Worker に本文を載せない方針へ切り替えました。

  1. scripts/generate-content-snapshots.mjsmemo 本文を metadata snapshot と分離
  2. raw 本文は public/memo/raw/**/*.md として build 前に静的 asset 化
  3. /api/memo/raw/[...slug]
    • ローカル source があれば直接返す
    • source が無い環境では静的 asset へ 307 redirect
  4. /memo/rss は runtime 生成をやめ、public/memo/rss.xml を build 前に生成して redirect のみに変更
  5. /memo/[...slug]fallback: "blocking" をやめて fallback: false に変更
  6. memo 一覧/詳細は top-level import を減らし、build-time の動的 import へ寄せた

重要なのは「Worker に必要なものだけ残す」ことでした。
OpenNext の default handler が route runtime 依存を bundle するため、runtime でしか使わない本文データや RSS 生成処理を static asset へ逃がすのが最短でした。
この bundle への効き方は、cf-build-size の前後差分からの inference です。

##アウトプット

主な変更:

  • scripts/generate-content-snapshots.mjs
    • memo metadata snapshot 生成
    • public/memo/raw/**/*.md 生成
    • public/memo/rss.xml 生成
  • src/lib/memo/api.ts
    • metadata-only 前提に整理
    • raw asset path helper 追加
  • src/pages/api/memo/raw/[...slug].ts
    • source 直読み or static asset redirect へ変更
  • src/pages/memo/[...slug].tsx
    • fallback: false
  • src/pages/memo/rss.tsx
    • static RSS への redirect のみに変更
  • src/components/memo/MemoShell.tsx
    • RSS リンクを /memo/rss.xml に変更

結果:

  1. 修正前: worker gzip estimate = 3233141 bytes
  2. 中間: 3153219 bytes
  3. 最終: 3138043 bytes

無料枠上限 3145728 bytes7685 bytes 下回りました。

さらに実デプロイも通過し、Cloudflare 反映結果は次でした。

  • Deploy command: bun x wrangler deploy
  • Deploy result: success
  • Worker URL: https://ro1-dev.ro1.workers.dev
  • Version ID: 66f64dc8-cbf9-4233-83c9-a50651d53e79

##参照した一次情報・一次ソース

推論明記:

  • OpenNext の default handler へ route runtime 依存が乗ったこと自体は、cf-build-size の差分と bundle 挙動からの実装上の inference です。