Cloudflare PagesからCloudflare Workers+open-nextへ移行した話

2025-07-25

はじめに

これまでポートフォリオサイトはCloudflare Pagesで運用していましたが、最近Cloudflare Workers+open-next構成へ移行しました。 本記事では、移行の背景・手順・ポイントをまとめます。

Cloudflare公式: Next.js with OpenNext

Cloudflare公式: Next.js with OpenNext

developers.cloudflare.com

なぜCloudflare Workers+open-nextへ

Cloudflare Workers+open-nextへ移行したのは、まずSSR(サーバーサイドレンダリング)や動的ルーティングといった機能を試したかったからです。従来のCloudflare PagesはSSGが中心で、柔軟性に欠ける場面がありました。

しかし、open-nextがCloudflare公式で事実上の標準となり、Workersへのデプロイが簡単になり、移行を決断しました。

open-nextとは?

open-next (GitHub)

open-next (GitHub)

github.com

open-nextは、Next.jsアプリをCloudflare WorkersやPages、その他のエッジ環境向けに最適化してデプロイできるOSSです。

App RouterやPages Router、Route Handlers、SSR、ISR、SSG、Server Actions、Middlewareなど、主要なNext.jsの機能がサポートされています。また、Composable Cachingなど実験的にサポートされているものもあるようです。

セットアップ・移行手順

1. 新規プロジェクト作成(推奨)

Cloudflare公式CLIでNext.js+Workers+open-next構成を下記の通り、一発作成可能です。

npm create cloudflare@latest -- my-next-app --framework=next

ですが、今回は既存のNext.jsプロジェクトをCloudflare Workers+open-nextに移行しました。

2. 既存プロジェクトをCloudflare Workers+open-next化

npm i @opennextjs/cloudflare@latest
npm i -D wrangler@latest

プロジェクトルートに wrangler.toml または wrangler.jsonc を作成

main = ".open-next/worker.js"
name = "my-app"
compatibility_date = "2025-03-25"
compatibility_flags = ["nodejs_compat"]
[assets]
directory = ".open-next/assets"
binding = "ASSETS"

open-next.config.ts を作成(キャッシュ等の詳細設定もここで可能)

import { defineCloudflareConfig } from "@opennextjs/cloudflare";

export default defineCloudflareConfig();

package.json にスクリプト追加

"preview": "opennextjs-cloudflare build && opennextjs-cloudflare preview",
"deploy": "opennextjs-cloudflare build && opennextjs-cloudflare deploy"

3. ローカル開発

npm run dev でNode.js上のNext.js開発サーバ、npm run preview でCloudflare Workersランタイムによる本番同等の挙動を確認できます。

npm run dev
npm run preview

4. デプロイ

npm run deploy でCloudflare Workersへデプロイできます。

npm run deploy

ハマりどころ・注意点

そもそも、動作環境がNode.jsとエッジ環境で異なるため、Node.jsのAPIが使えない点に注意が必要です。特に、ファイルシステムや一部のグローバルオブジェクトは利用できません。

また私の場合、Next.jsのParallel Routes / Intercept Routes を使ってダイアログ表示しようと思ったのですが、正常動作しない問題に遭遇しました。

結局解決はできてないのですが、同様の症状が発生している例はあるようです。

Fix: react resolution for interception, parallel and group routes (PR #155)

それ以外にもopen-nextのバージョンやNext.jsのバージョン互換性には注意が必要です。環境変数も、Cloudflare Workers用に見直す必要があります。

まとめ

Cloudflare Workers+open-next構成により、Next.jsの最新機能を活かしつつ、エッジでの高速配信・柔軟な運用が可能になりました。今後も運用しながら改善していきます。

ではまた。