◉CLAUDE LABEN
●2.1.302 — fork サブエージェントが claude -p・Agent SDK・デスクトップで既定オンになりました。無効化は CLAUDE_CODE_FORK_SUBAGENT=0(10/16)●2.1.307 — スリープやキーチェーンロックのあとに MCP が再接続されない問題を修正しました(10/21)。2.1.306 では claude -p の誤表示も解消●SONNET 4.5 — Claude API での提供終了は 11/30、残り38日。移行先は Sonnet 5.5●WINDOWS — 日本語の環境でだけフックが黙って壊れる報告があり、文字コードの確認が呼びかけられています●FAST MODE — Opus 5.5 の Fast mode がリサーチプレビューを終え、ベータヘッダーが不要になりました(10/15)●NEW — Cowork に渡したフォルダの先頭に、十行の約束ファイルを置いてみました●2.1.302 — fork サブエージェントが claude -p・Agent SDK・デスクトップで既定オンになりました。無効化は CLAUDE_CODE_FORK_SUBAGENT=0(10/16)●2.1.307 — スリープやキーチェーンロックのあとに MCP が再接続されない問題を修正しました(10/21)。2.1.306 では claude -p の誤表示も解消●SONNET 4.5 — Claude API での提供終了は 11/30、残り38日。移行先は Sonnet 5.5●WINDOWS — 日本語の環境でだけフックが黙って壊れる報告があり、文字コードの確認が呼びかけられています●FAST MODE — Opus 5.5 の Fast mode がリサーチプレビューを終え、ベータヘッダーが不要になりました(10/15)●NEW — Cowork に渡したフォルダの先頭に、十行の約束ファイルを置いてみました
記事一覧/Claude Code
⟐ Claude Code/2026-10-22上級

記事本文を Worker のバンドルに入れず静的アセットへ出している構成を、約 900 記事ぶんの実バイトで数え直しました

Next.js を Cloudflare Workers で動かす自分の Web サイトで、本文を JSON に含めた場合とメタデータだけにした場合のバイト数を手元の MDX で数え直しました。上限までの余白、見落としていた内訳、数え続けるスクリプトをお伝えします。

Cloudflare Workers17Next.js10バンドルサイズMDX3実測

✦ プレミアム記事

ある朝、自分のサイトの src/generated/articles.json が何バイトあるのかを、ふと数字で答えようとして、答えられないことに気づきました。

私は個人開発で、Next.js を Cloudflare Workers に載せた Web サイトを自分で運営しています。記事は MDX で書き、ビルドの前に HTML へ変換して、本文は静的アセットとして置いています。JSON に入るのはタイトルや説明といったメタデータだけです。この分け方が安全だという感覚はありましたが、理由を数字で説明できてはいませんでした。

この記事は、その感覚を手元のファイルで数え直した記録です。結論を先に書くと、本文まで JSON に入れた場合は約 28.5 MiB、メタデータだけなら約 0.93 MiB でした。そして、数え直して一番驚いたのは、上限までの余白ではなく、メタデータの内訳のほうでした。

先に確かめた上限の値

Cloudflare のドキュメントでは、Workers のサイズ上限は非圧縮で 64 MiB と書かれています。圧縮後のサイズに上限はなく、Wrangler が表示する gzip 後の数字は参考値だそうです。静的アセットは、1 ファイル 25 MiB まで、ファイル数は無料プランで 20,000、有料プランで 100,000 です。

古い情報では「圧縮後 3 MB/10 MB」という数字を見かけます。私も最初はそちらを思い浮かべていました。いまの公式ページを開いて確かめるまで、64 MiB という値は頭にありませんでした。上限は更新されることがあるので、数え直す前に値のほうを確かめるのが先だと思います。

数え方: 同じ記事を二通りに束ねる

数えたいのは単純な問いです。「本文を JSON に含めたら何バイトか。含めなかったら何バイトか」。ビルドを走らせなくても、MDX のフロントマターと本文を読めば近似できます。

#!/usr/bin/env python3
"""記事本文を JSON に入れた場合と、メタデータだけにした場合の余白を数える。
使い方: python3 bundle_guard.py <repo> [月あたりの新規記事数]"""
import json, os, re, sys
 
LIMIT = 64 * 1024 * 1024        # Workers の非圧縮バンドル上限(公式ドキュメントの値)
META_ALERT = 2 * 1024 * 1024    # メタデータ JSON がこれを超えたら設計を見直す(私の線引き)
 
def read_articles(root, locale):
    base = os.path.join(root, "content", "articles", locale)
    for cat in sorted(os.listdir(base)):
        d = os.path.join(base, cat)
        if not os.path.isdir(d):
            continue
        for name in sorted(os.listdir(d)):
            if not name.endswith(".mdx"):
                continue
            text = open(os.path.join(d, name), encoding="utf-8").read()
            m = re.match(r"^---\n(.*?)\n---\n(.*)$", text, re.S)
            if not m:                      # フロントマターが壊れた記事は数えずに知らせる
                print("skip:", locale, cat, name, file=sys.stderr)
                continue
            yield cat, name[:-4], m.group(1), m.group(2)
 
def field(fm, key):
    m = re.search(rf'^{key}:\s*"?(.*?)"?\s*$', fm, re.M)
    return m.group(1) if m else ""
 
def main(root, per_month=40):
    meta_total = full_total = pairs = 0
    for loc in ("ja", "en"):
        meta, full = [], []
        for cat, slug, fm, body in read_articles(root, loc):
            row = {k: field(fm, k) for k in ("title", "level", "date", "description")}
            row.update(slug=slug, category=cat)
            meta.append(row)
            full.append({**row, "content": body})
        sep = (",", ":")
        meta_total += len(json.dumps(meta, separators=sep, ensure_ascii=False).encode())
        full_total += len(json.dumps(full, separators=sep, ensure_ascii=False).encode())
        pairs = max(pairs, len(meta))
    per_pair_full, per_pair_meta = full_total / pairs, meta_total / pairs
    print(f"記事数(1言語): {pairs}")
    print(f"メタのみ: {meta_total/1024/1024:.2f} MiB / 本文込み: {full_total/1024/1024:.2f} MiB")
    print(f"本文込みで上限まで: あと約 {(LIMIT-full_total)/per_pair_full:.0f} 組 ≒ {(LIMIT-full_total)/per_pair_full/per_month:.1f} か月")
    print(f"メタのみで上限まで: あと約 {(LIMIT-meta_total)/per_pair_meta:.0f} 組")
    return 1 if meta_total > META_ALERT else 0
 
if __name__ == "__main__":
    sys.exit(main(sys.argv[1], float(sys.argv[2]) if len(sys.argv) > 2 else 40))

手元のリポジトリ(日本語・英語とも 917 記事)で実行した出力は、次のとおりです。

記事数(1言語): 917
メタのみ: 0.93 MiB / 本文込み: 28.54 MiB
本文込みで上限まで: あと約 1140 組 ≒ 28.5 か月
メタのみで上限まで: あと約 62334 組

ここでの「組」は、日本語版と英語版を一対にした数です。最近の公開ペースは月に 40 本前後なので、本文込みでも 2 年以上は持つ計算になります。

✦

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

この記事の続きを読む

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

この記事で得られること
✦自分の Next.js サイトで、コンテンツを JSON に抱えた場合の増え方を、手元のファイルだけで上限日まで見積もれるようになる
✦「ビルドは通るのに、ある日デプロイだけ落ちる」というサイズ起因の事故を、上限に届く何か月も前に気づけるようになる
✦メタデータ JSON のどのフィールドが重いかを数え、見直す順番を根拠つきで決められるようになる
Stripe による安全な決済 · いつでもキャンセル可能
✦

この記事を購入する

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

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

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

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

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

関連記事

⟐ Claude Code2026-10-20
ビルドが黙って剥がしていたリンク切れ267本を数え、類似スラッグでの自動修復を見送りました
MDX の記事ビルドが切れた内部リンクを黙って除去していました。除去の一覧を出す監査スクリプトと、類似スラッグで直すのを見送った判断、件数を増やさない基準線の置き方をまとめました。
⟐ Claude Code2026-08-19
一度キャッシュに載った500ページは、直しても消えません
修正をデプロイしたのに壊れたページが出続けたことがあります。原因はコードではなくエッジキャッシュでした。ステータスコードだけを見る保存判定が、200で返る壊れたHTMLを通していたのです。本文の完全性で保存可否を決めるガードの実装と、運用で調整した誤検知の線引きを、実際に踏んだ経緯とともに書きました。
⟐ Claude Code2026-05-03
Claude × Stripe Meter Events で従量課金 SaaS を構築する実装ガイド
Claude API のトークン消費量を Stripe Meter Events で従量課金として回収する、本番運用可能なアーキテクチャと実装コードを公開します。冪等性・上限制御・ダッシュボード可視化までカバーします。