2025年1月16日現在での方法です。
はじめに
いつもはNext.jsのプロジェクトをVercelにデプロイしていたのですが、将来的に広告を入れる可能性を考え、Cloudflare Pagesにデプロイしてみました。
エラーなどが出て大変だったので手順をメモしておきます。
内容や言葉遣いが誤っている可能性があります。
環境
- Next.js v15.1.4
- @cloudflare/next-on-pages v1.13.7
- yarn v4.6.0
- node.js v20.11.1
Node.jsやNPM、Yarnの環境や、基本的なNext.jsの知識についてはある前提で進めます。
手順
1. Next.jsプロジェクトを作成する
npx create-next-app@latest cloudflare-sample-app
2. ランタイムをEdgeに変更
Cloudflare PagesではランタイムはNode.jsではなくEdgeが使用されます。
サーバーサイドのファイル(page.tsxやroute.ts)に以下のコードを追加します。
export const runtime = "edge";
3. @cloudflare/next-on-pagesをインストール
yarn add -D @cloudflare/next-on-pages
4. wrangler.tomlファイルを作成
name = "my-app"
compatibility_date = "2024-07-29"
compatibility_flags = ["nodejs_compat"]
pages_build_output_dir = ".vercel/output/static"
ドキュメントには上記のようになっていますが、私はエラーが起きたため、compatibility_date
を"2024-09-23"
に変更しました。
また、name
は適宜変更してください。(後ほど作るCloudflareのプロジェクト名と同じにしておくと便利です。)
5. GithubとNext.jsプロジェクトを連携する
作成したNext.jsプロジェクトをGithubのリポジトリのmain
ブランチにプッシュしてください。
6. Cloudflareのプロジェクトを作成する
Cloudflareのダッシュボードで、左のメニューから、Compute(Workers)
->Workers & Pages'を開き、
作成`ボタンを押します。
Pages
のタブを開き、Gitに接続
ボタンを押します。
Githubと接続するとリポジトリを選べるので、先ほど作成したリポジトリを選択します。
フレームワークプリセット
をNext.js
にし、環境変数に以下のものを追加します
Name | Value |
---|---|
NODE_VERSION | 22.12.0 |
YARN_VERSION | 4.6.0 |
NODE_VERSION
は、ビルドに使用するNode.jsのバージョンです。
デフォルトは18.17.1
ですが、これはエラーが起こるので20以上にしておきます。
YARN_VERSION
はローカル環境のyarn
のバージョンに合わせてください。
yarn.lock
ファイルの書き方がバージョンによって異なることによるデプロイ時のエラーが発生します。
環境変数はプロジェクト作成後も、設定のタブから編集できます。
production
とpreview
の2つがあるので、両方とも設定するようにしてください。
preview
に設定していなくて原因がわからず2時間溶かしました。
これでデプロイが成功するはずです。
(しなかった場合は再デプロイしてみてください。)
エラー達
✘ [ERROR] Could not resolve "async_hooks"
✘ [ERROR] Could not resolve "async_hooks"
<stdin>:596:680:
596 │ ...umerable:!0})),e);_(exports,{default:()=>N});var R=A(require("async_hooks")),S="@next/request-context",f=Symbol.for(S),C=Symbol.for("i...
╵ ~~~~~~~~~~~~~
The package "async_hooks" wasn't found on the file system but is built into node. Are you trying
to bundle for node? You can use "platform: 'node'" to do that, which will remove this error.
このサイトを参考にした。
次の2つで解決した。
- 上に書いた通り、
wrangler.toml
のcompatibility_date
を"2024-09-23"
にする -
package.json
にとかく{ // existing code "overrides": { "vercel": "$vercel" }, // existing code }
終わりに
かなり遠回りをしてしまい、デプロイだけで5時間くらいかかってしまいました。
もし上記の方法でうまくいかない場合はコメントで教えていただきたいです。
参考にしたサイト等