この構成を選んだ理由
YATA-NODE サイトは Next.js App Router × Cloudflare Pages で構築している。この組み合わせを選んだ理由は3つだ。
- 固定費ゼロ — Cloudflare Pages の無料枠でトラフィックをほぼカバーできる
- CDN性能 — Cloudflareのグローバルネットワークで高速配信
- Edge Runtime対応 — Contact フォームのServer Actionsが Edge で動作する
セットアップの全体像
# Cloudflare対応ビルド
npx @cloudflare/next-on-pages
# ローカルプレビュー
npx wrangler pages dev .vercel/output/static
@cloudflare/next-on-pages が Next.js のビルド出力を Cloudflare Workers 互換の形式に変換する。
ハマりポイント1: next/image
Cloudflare Pages 上では next/image のデフォルト最適化が動作しない。
// next.config.ts
const nextConfig = {
images: {
unoptimized: true,
},
}
unoptimized: true を設定するか、事前に最適化済みの画像を配置する運用にする。
ハマりポイント2: Edge Runtime
Server Actions を使う場合、該当ページに runtime = 'edge' を明示する必要がある。
// src/app/contact/page.tsx
export const runtime = 'edge'
nodejs_compat フラグを wrangler.toml に追加することで、Node.js APIの一部も利用可能になる。
# wrangler.toml
compatibility_flags = ["nodejs_compat"]
デプロイフロー
GitHub連携でCI/CDを自動化している。
devブランチへのプッシュ → プレビューデプロイmainブランチへのマージ → 本番デプロイ
環境変数(RESEND_API_KEY等)は Cloudflare Pages のダッシュボードから設定する。
まとめ
この構成の最大のメリットはインフラ管理コストのほぼゼロ化だ。ソロ運用でも十分にスケールし、将来的に Cloudflare Workers や R2 に機能を追加しやすい。