はじめに
Next.js
とClerk
を使用したアプリをCloudflare Pages
にデプロイした際に発生したエラーについてまとめます。
こちらは前回の記事の続きになります。
この記事は個人的なアウトプットを目的として作成したものです。そのため、誤った情報や不足している内容が含まれている可能性があります。もし間違いや気になる点がございましたら、ぜひご指摘いただけますと幸いです。
現象
前回の対応でSSR
のディレクトリにEdge Runtime
を設定しました。
export const runtime = "edge";
するとビルド時に以下のエラーが発生しました。
今回は認証に Clerk を使用していますが、その内部で path が参照されてしまい失敗しています。
Failed to compile.
▲ ./node_modules/@clerk/nextjs/dist/esm/server/keyless-telemetry.js:2:1
▲ Module not found: Can't resolve 'path'
▲ 1 | import "../chunk-BUSYA2B4.js";
▲ > 2 | import { dirname, join } from "path";
▲ | ^
▲ 3 | import { canUseKeyless } from "../utils/feature-flags";
▲ 4 | import { createClerkClientWithOptions } from "./createClerkClient";
▲ 5 | import { nodeFsOrThrow } from "./fs/utils";
▲
▲ > Build failed because of webpack errors
▲ Error: Command "npm run build" exited with 1
原因
Edge Runtime
ではNode.js
固有のモジュール(fs
やpath
など)が利用できません。
Clerk
の内部処理でpath
が使われているため、そのままでは動作しないのが原因でした。
解決方法
今回のページは「常に最新の情報を返す必要がない」ためSSR
ではなくSSG (Static Site Generation)
に切り替えることにしました。
Next.js
ではgenerateStaticParams
を使って静的にページを生成できます。
export async function generateStaticParams() {
//省略
}
終わりに
Cloudflare Pages
では基本的にEdge Runtime
を使う必要がありますが、内部でNode.js
モジュールを利用しているライブラリ(今回の例だとClerk
)を組み合わせると制約に引っかかることがあります。
今回のように 必ずしもSSR
が不要なケースでは、SSG
に切り替えるのも解決策の一つだと学びました。
別のケースではまた違う対応が必要になると思うので、そのときも記録を残していきたいです。
参考