Vercel は便利で簡単だ。個人開発にとって簡単さは大切である
しかし、
- Vercel の無料枠に依存したくない
- Vercel のオンデマンドによるリソース消費が怖い
- 月額費用を限りなく抑えたい
- Cloudflare Workers の高速性を活かしたい
ある日、Vercel からFunction 使用量増加に関するメールが届いた
xxxx has used 75% of the monthly included Function Invocations on the pro plan. Once you hit 1M Invocations, additional usage is $0.60 per 1M Invocations.(プロプランの月間関数呼び出し回数の75%を使用しました。100万回を超えると、 100万回ごとに0.60ドルの追加料金が発生します。)
うーん、面倒やな
こういう悩みを持つ人向けに解決方法を書いた
SSR に対応したいときのインフラ選定の基準
選択肢 | 特徴 | 向いているケース | 備考 |
---|---|---|---|
Vercel | 公式 Next.js 開発元。自動デプロイ・ISR/SSR 対応も簡単 | 最小構成で始めたい/迷いたくない/とにかく楽したい | 無料枠あり。商用だと料金がやや高くなる |
Cloudflare Workers + OpenNext | 超高速・グローバルエッジ・低コスト。OpenNext が SSR 対応化 | とにかく速く・安くしたい/エッジ重視/個人開発での運用 | Node.js API 非対応(V8ベース)だが Next.js が問題なく動く |
Cloud Run / ECS / Lambda | Docker コンテナや関数単位の構成。自由度が高く重処理も可 | 複雑構成/外部API連携/重い処理やストリーミングがある場合 | 学習コストはやや高め。料金設計に注意 |
注意点(SSRの場合)
- Node.jsが使えるか?(Cloudflare Workersでは制限あり)
- コールドスタート問題(ECS, Lambdaなどは初回遅い)
- 料金体系のわかりやすさ(CloudflareやVercelは無料枠がわかりやすい)
構成概要
Next.js + OpenNext + Cloudflare Workers で動的アプリを公開することができる
SSR / API / Middleware 全部使える。つまり、Vercel と近い開発体験を維持しつつ、Cloudflareの超高速エッジ実行と低コストを享受できる構成が実現可能
Next.js と OpenNext は両方必要
Next.js はあくまで「アプリケーションの開発フレームワーク」
OpenNext はその Next.js アプリを Cloudflare Workers の仕様に合わせて「変換・ビルド」する役割
- Next.js(SSR)アプリケーション
- OpenNext(Next.js を Cloudflare Workers(など)に対応させるビルドシステム)
- Cloudflare Workers(軽量で高速な実行環境)
Next.js で SSR を使いたい場合、Cloudflare Workers 上で動かすには OpenNext が必要
Next.js はもともと Vercel に最適化された構造をしているから、そのままでは Cloudflare Workers 向けの SSR ビルドが出力できない。
OpenNext はそれを解決してくれる非Vercel環境向けのNext.js変換ツール
Cloudflare スタック構築手順
個人開発向け、Cloudflare スタック構築の手順はこれ
- Next.js(SSR)+ OpenNext + Cloudflare Workers セットアップ
- JS サイズを最小化するため、wrangler.toml に minify = true 追加
- GitHub に push すると、自動でビルド&デプロイされるように設定
以下の手順で、Cloudflare 環境へのデプロイが可能
1. プロジェクト初期化
OpenNext に対応した Cloudflare Workers プロジェクトを初期化する
このコマンドで、Next.js + OpenNext + Wrangler の構成が生成される
2. ビルド
これにより .open-next/
ディレクトリが生成され、Cloudflare Workers 用のバンドルが含まれます。
3. デプロイ
wrangler 経由で、Workers に SSR アプリが自動でデプロイされます。
4. 動的レンダリング確認
ブラウザや curl でヘッダーを確認し、x-nextjs-cache
ヘッダーが MISS
なら SSR が有効です。
補足設定
wrangler.jsonc
に以下を追加すると JS サイズが最小化される
wrangler.toml における minify = true は、アップロード前に Worker スクリプト(JSなど)を最小化(空白・改行・コメント除去)する
この最小化がないと、gzip してもサイズが膨らみがちになり、無料枠(だいたい 1〜3MB圧縮後)を超えやすくなる
参考
画像最適化
あとは 画像最適化(Cloudflare Images) と R2キャッシュ(任意) を組み合わせれば、フルスタックNext.jsをCloudflareで完全に無料運用する構成が完成
終わりに
このスタックは、
- インフラコストを抑えたい
- Vercel のロックインを避けたい
- Cloudflare のエッジ機能を活用したい
という個人開発者やスタートアップに非常におすすめ