🦁

Cloudflare環境ではNode.jsに依存したモジュールは使えない

2024/10/14に公開

まあその通りっちゃその通りなのですが、先日特に何も確認せずにbcryptをimportした状態でビルドし、wrangler pages devを行うと下記のエラーが発生しました。


 ⛅️ wrangler 3.80.0 (update available 3.80.4)
-------------------------------------------------------

✘ [ERROR] Could not resolve "fs"

    ../node_modules/.pnpm/@mapbox+node-pre-gyp@1.0.11/node_modules/@mapbox/node-pre-gyp/lib/node-pre-gyp.js:20:19:
      20 │ const fs = require('fs');
         ╵                    ~~~~

  The package "fs" 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.


✘ [ERROR] Could not resolve "path"

    ../node_modules/.pnpm/@mapbox+node-pre-gyp@1.0.11/node_modules/@mapbox/node-pre-gyp/lib/node-pre-gyp.js:21:21:
      21 │ const path = require('path');
         ╵                      ~~~~~~

  The package "path" 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.


✘ [ERROR] Could not resolve "events"

    ../node_modules/.pnpm/@mapbox+node-pre-gyp@1.0.11/node_modules/@mapbox/node-pre-gyp/lib/node-pre-gyp.js:27:19:
      27 │ const EE = require('events').EventEmitter;
         ╵                    ~~~~~~~~

  The package "events" 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.

エラーを見ると、「nodeの環境でバンドルしているか?」的なことを聞かれています。
ただ、この環境はNode.jsではなくCloudflareの環境なので、Node.jsが提供しているメソッド、またはそれを使っているモジュールを使用しているライブラリを使うとこのようなエラーが発生します。
bcryptはまさにその一つであり、npmの依存関係をみてみると、エラー文にある@mapbox+node-pre-gypを使用しており、これが原因でエラーが発生した模様です。

bcryptの場合は、代わりにbcryptjsを使えば解決できます。

npm i bcrypt
npm i --save-dev @types/bcryptjs

もしこういったエラーが出た際にご参考になれれば幸いです。
また、他に解決方法等がありましたらご指摘いただけますと幸いです。

Discussion