Next.js App Router + microCMSなサイトをCloudflare Pagesへ
microCMSのコンテンツをNext.jsで表示させるアプリをCloudflare Pagesにデプロイした際にエラーが発生しました。cacheの設定はCloudflare Pagesでは利用できないため、環境変数を分岐させることで対応しました。さらに、NODE_ENVを使ってAPIキーの切り替えも可能です。このように、NEXT_RUNTIMEとNODE_ENVを使い分けることでCloudflare Pagesと開発環境での挙動を変えることができます。なお、next-on-cloudflareは便利なツールです。
目次
microCMSのコンテンツをNext.js (App Router)で表示させたアプリを、Cloudflare Pagesにデプロイした時に遭遇したエラーへの対処方法覚書です。
customRequestInit
(もといキャッシュ)の設定を環境によって変更する
2023/08時点では、cacheの設定がCloudflare Pagesにデプロイした場合は利用できない様子です。
14 Error: Network Error.
Details: Error: The 'cache' field on 'RequestInitializerDict' is not implemented.
とはいえ「開発環境(next dev
)ではno-cache
にしたい」と思うと、この設定は残したいところです。
対応: NEXT_RUNTIME
環境変数を参照する
とりあえずの対応として、環境変数を使って分岐させてみました。
const customRequestInit: CustomRequestInit | undefined = (() => {
if (process.env?.NEXT_RUNTIME === 'edge') return undefined
return {
cache: 'default'
}
})();
process.env.NODE=ENV
も使えますが、将来的に別SaaSに載せ替える時などを考えると、追加作業を少なくできる方に振りたいなと思います。
ちなみに、customRequestInit
の値はno-cache
やdefault
でもエラーになりました。Cloudflare Pagesにデプロイする際は、undefined
にしましょう。
APIキーの「本番・テスト切り替え」などは、NODE_ENV
でも可能
next dev
とビルド後アプリでAPIキーを差し替えたい場合などには、NODE_ENV
も利用できます。
const customRequestInit: CustomRequestInit | undefined = (() => {
if (process.env.NODE_ENV === 'development') {
return {
cache: 'no-cache'
}
}
if (process.env?.NEXT_RUNTIME === 'edge') return undefined
return {
cache: 'default'
}
})();
next-on-cloudflare
がよしなにしてくれているのは、かなり助かります。
- Cloudflare Pagesだけで挙動を変えたい場合は、
NEXT_RUNTIME
next dev
とnext build
後のアプリで挙動を変えたい場合は、NODE_ENV
という使い分けが、今のところしっくりきています。