CLAUDE LABEN
FORK — Claude Code 2.1.212で/forkの挙動が変わりました。会話を新しいバックグラウンドセッションへ複製し、作業を続けたまま並走できます。従来のセッション内サブエージェントは/subtaskに移りましたLIMITS — WebSearchの呼び出しがセッション単位で既定200回に制限されました。サブエージェントの起動も既定200回が上限で、暴走した検索・委譲のループを止められますMCPBG — 2分を超えるMCPツール呼び出しは自動的にバックグラウンドへ移り、セッションが固まらなくなりました。しきい値はCLAUDE_CODE_MCP_AUTO_BACKGROUND_MSで調整できますPLANFIX — プランモードがtouchやrmといったファイルを変更するBashコマンドを、許可プロンプトもcanUseToolコールバックも通さずに実行してしまう不具合が修正されましたSONNET5 — Claude Sonnet 5は導入価格として入力100万トークンあたり2ドル、出力10ドルで提供中です。8月31日を過ぎると3ドルと15ドルに戻りますIPO — Anthropicが早ければ10月の株式公開を視野に、引受銀行が投資家との面談を組み始めたと報じられていますFORK — Claude Code 2.1.212で/forkの挙動が変わりました。会話を新しいバックグラウンドセッションへ複製し、作業を続けたまま並走できます。従来のセッション内サブエージェントは/subtaskに移りましたLIMITS — WebSearchの呼び出しがセッション単位で既定200回に制限されました。サブエージェントの起動も既定200回が上限で、暴走した検索・委譲のループを止められますMCPBG — 2分を超えるMCPツール呼び出しは自動的にバックグラウンドへ移り、セッションが固まらなくなりました。しきい値はCLAUDE_CODE_MCP_AUTO_BACKGROUND_MSで調整できますPLANFIX — プランモードがtouchやrmといったファイルを変更するBashコマンドを、許可プロンプトもcanUseToolコールバックも通さずに実行してしまう不具合が修正されましたSONNET5 — Claude Sonnet 5は導入価格として入力100万トークンあたり2ドル、出力10ドルで提供中です。8月31日を過ぎると3ドルと15ドルに戻りますIPO — Anthropicが早ければ10月の株式公開を視野に、引受銀行が投資家との面談を組み始めたと報じられています
記事一覧/Claude Code
Claude Code/2026-05-28上級

Cloudflare Workers の 62 MiB 上限を踏んだ朝に、5,000 記事規模で組み直した Content Split アーキテクチャ

個人で 4 ブログを Cloudflare Workers + Next.js で運用していたある朝、articles.json が肥大化して Worker bundle が 62 MiB 上限を踏み、デプロイが止まりました。メタデータと HTML 本文を分離する Content Split Architecture に組み替えた具体的な実装と、切り替え 1 ヶ月で観測したビルド時間・キャッシュ効果・運用上の落とし穴を共有します。

Cloudflare Workers14Next.js7Content Split個人開発110本番運用36OpenNext

プレミアム記事

ある朝、4 つ並べて運用している AI 技術ブログのうち、Claude Lab だけが急にデプロイ失敗で止まりました。ログを見ると Script startup exceeded CPU time limit ではなく、見慣れない Your Worker exceeded the size limit of 62 MiB という一文が並んでいます。前日の push までは普通にデプロイされていたので、原因は前日に追加した 4 本の MDX のどこかにあるはずでした。

私は 2014年から個人開発でアプリを公開し続けて12年、累計5,000万ダウンロードを超える壁紙アプリと癒し系アプリを運用しています。アーティストとしての国際芸術賞 17冠の活動と並行して、2026 年からは Dolice Labs として 4 サイトの AI 技術ブログを Cloudflare Workers + Next.js(OpenNext)で並行運用しており、合計記事数はちょうどこの日 4,500 本を超えたところでした。「気がついたら壁にぶつかっていた」のは、まさに記事数が静かに積み上がっていたためです。

宮大工をしていた両祖父からは「丁寧に作るというのは、後から触る人のために線を引いておくことだ」と教わった気がしています。62 MiB 上限の壁は、まさに自分が後から触る自分への線引きが足りていなかった証拠でした。今回は、その壁を直接踏みながら、メタデータと本文を分離する Content Split Architecture に組み替えた具体的な手順を残しておきます。

62 MiB 上限を踏んだ朝に最初にやった切り分け

Cloudflare Workers の 62 MiB はバンドル後(Brotli 圧縮後)のサイズ制限です。OpenNext を通した Next.js は Server Components や middleware を含めて一つの Worker bundle に詰め込まれるため、コードだけでなく bundled 扱いになっている静的データも全部この上限に乗ります。

最初にやったのは、デプロイ前のローカルビルドで実際のサイズを見ることでした。

cd /tmp/repos/claudelab.net
npm run build
ls -lh .open-next/worker.js
# -rw-r--r--  1 user  staff   18M  May  3 09:14 worker.js

18 MB は Brotli 前のサイズですが、ここに 4,500 本の MDX を JSON 化したものがほぼ全部入っていることを du -sh で確認しました。src/generated/articles.json 単体で 18 MB を超えていました。

ls -lh src/generated/articles.json
# -rw-r--r--  1 user  staff   18M  May  3 09:14 articles.json

ここでようやく、これまで articles.json 一つにメタデータも HTML 本文も全部詰め込んでいたことが致命傷だと気づきました。1 本あたり 4 KB 程度でも、4,500 本で 18 MB です。さらに 1 日 4 本ペースで増えていきますから、放っておけば 3 ヶ月で 25 MB を超え、半年後には 30 MB を超えます。Brotli 圧縮率が良くても、JSON 内の HTML は重複部分が少なく、圧縮後サイズの伸びはほぼ線形でした。

articles.json を太らせていた設計の限界

そもそも初期設計では、ビルド時に generate-content.mjs が MDX を全部読み込み、メタデータとレンダリング済み HTML を articles.json 一つに集約していました。理由は単純で、Server Components から import articles from "@/generated/articles.json" だけで全記事にアクセスできるからです。

// 旧 generate-content.mjs(要約)
const articles = [];
for (const file of allMdxFiles) {
  const { data, content } = matter(fs.readFileSync(file));
  const html = await mdxToHtml(content);
  articles.push({ ...data, slug, html });
}
fs.writeFileSync("src/generated/articles.json", JSON.stringify(articles));

この設計は 100 本のときは便利でした。500 本でも気にならないサイズでした。1,000 本を超えた頃から「ローカルビルドが遅いな」と感じるようになり、2,000 本で「fs.readFileSync の起動コストが見えるな」と思い、3,500 本で「IDE のオートインポートが重いな」と感じ、4,500 本で 62 MiB を踏みました。後から触る自分への線引きが、気づかないうちに細っていたのです。

ここで線を引き直すべきは、メタデータと本文を物理的に別ファイルに分けるという一点でした。

ここまでお読みいただきありがとうございます。

この記事の続きを読む

この先には、実装コードやベンチマーク結果など、実務でお役に立てる内容をご用意しています。このサイトは広告を掲載しておらず、サーバーや開発にかかる費用はメンバーの皆様のご支援で成り立っています。もしお役に立てていましたら、ご支援いただけますと大変ありがたいです。

この記事で得られること
Worker bundle が 62 MiB 上限を踏んだ瞬間の症状切り分け手順と、articles.json が 18 MB を超えていた原因の特定方法
generate-content.mjs に二段階出力(メタデータ JSON + 本文 HTML を public/content/ に個別書き出し)を仕込む実装と、ASSETS バインディング経由でフェッチする getArticleContent() のコード
Cloudflare CI の prebuild フックで自動実行させる package.json の構成と、5,000 記事規模で観測した Worker bundle サイズ 18 MB → 2.4 MB の比較値
Stripe による安全な決済 · いつでもキャンセル可能

この記事を購入する

この先の内容をすべてお読みいただけます。一度のご購入で、いつでも何度でもアクセスできます。このサイトは広告を掲載しておらず、皆さまのご支援がサーバー費用などの運営を支えています。

または
メンバーシップなら全記事が読み放題 →
シェア

お読みいただきありがとうございます

Claude Lab は広告なしで運営しており、サーバー費用などの運営コストはメンバーシップのご支援で賄っています。実装コード・ベンチマーク・本番設計パターンなど、実務でお役立ていただける記事を毎日更新しています。もし読んでよかったと感じていただけましたら、ぜひご覧ください。

  • コピー&ペーストで使える実装コード付き
  • 毎日新しい上級ガイドを追加
  • ¥580/月 または ¥1,480 の永久アクセス
メンバーシップを見る →

関連記事

Claude Code2026-04-21
Claude Code で Next.js × Cloudflare Workers の本番運用を乗り越える — バンドルサイズ危機からエッジキャッシュ設計まで、実際に詰まった場所と解決策を全公開
Next.js アプリを Cloudflare Workers で運用するとき、Claude Code は単なるコード補完ツール以上の存在になります。62 MiB バンドル制限・エッジキャッシュ設計・Content Split Architecture など、実運用で詰まった問題と解決策を完全公開。
Claude Code2026-06-17
デプロイ直後に「500」と出るのに curl は 200 を返す — Next.js のエラー境界が ChunkLoadError を取り違えていた話
本番のNext.js記事ページがブラウザで「500 Internal Server Error」と表示されるのにcurlでは200。原因はサーバーではなくChunkLoadErrorとerror.tsxの誤表示でした。切り分け手順と自動リロードを組み込んだ修正を記録します。
Claude Code2026-05-24
iOS Crashlytics の障害トリアージを Claude Code で自動化する — dSYM シンボリケーションから修正候補生成までの本番運用設計
Firebase Crashlytics に届く iOS クラッシュを Claude Code で受け取り、dSYM シンボリケーション、影響範囲推定、修正候補のドラフト PR までを一筆書きで流すパイプラインの本番運用設計を、累計5,000万DLのアプリ事業での実例と数値とともにまとめます。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます
もっと見る →