0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Cloudflare】Module not found: Can't resolve 'path'の解決方法

Posted at

はじめに

Next.jsClerkを使用したアプリを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固有のモジュール(fspathなど)が利用できません。
Clerkの内部処理でpathが使われているため、そのままでは動作しないのが原因でした。

解決方法

今回のページは「常に最新の情報を返す必要がない」ためSSRではなくSSG (Static Site Generation)に切り替えることにしました。

Next.jsではgenerateStaticParamsを使って静的にページを生成できます。

export async function generateStaticParams() {

//省略

}

終わりに

Cloudflare Pagesでは基本的にEdge Runtimeを使う必要がありますが、内部でNode.jsモジュールを利用しているライブラリ(今回の例だとClerk)を組み合わせると制約に引っかかることがあります。

今回のように 必ずしもSSRが不要なケースでは、SSGに切り替えるのも解決策の一つだと学びました。
別のケースではまた違う対応が必要になると思うので、そのときも記録を残していきたいです。

参考

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?