[Nestjs] ERR_REQUIRE_ESMのエラーで起動しない
問題
Nestjsで構築したバックエンドのAPIサーバー、起動するとこのエラーが発生
[4:48:55 AM] Starting compilation in watch mode...
backend-1 |
backend-1 | [4:49:10 AM] Found 0 errors. Watching for file changes.
backend-1 |
backend-1 | /app/dist/modules/auth/services/github.service.js:16
backend-1 | const rest_1 = require("@octokit/rest");
backend-1 | ^
backend-1 |
backend-1 | Error [ERR_REQUIRE_ESM]: require() of ES Module /app/node_modules/@octokit/rest/dist-src/index.js from /app/dist/modules/auth/services/github.service.js not supported.
backend-1 | Instead change the require of index.js in /app/dist/modules/auth/services/github.service.js to a dynamic import() which is available in all CommonJS modules.
backend-1 | at Object.<anonymous> (/app/dist/modules/auth/services/github.service.js:16:16) {
backend-1 | code: 'ERR_REQUIRE_ESM'
backend-1 | }
backend-1 |
backend-1 | Node.js v20.10.0
解決策
package-jsonのスクリプトにNODE_OPTIONS='--experimental-require-module'
をつけることで起動するようになたよ
以下の記事が参考になった
ただやっぱり実験的な機能だと思うので、使用するのはどうなのかな、、
このオプションは何ができるのか(By ChatGpt)
ESM の読み込みが可能になる
このオプションを付けて Node.js を起動すると、たとえば拡張子が .mjs または特定の設定が施されたファイルでも、require() を使って読み込むことができるようになります。内部的には、Node.js は動的な import() を使って ESM モジュールを読み込み、その結果(たとえば default エクスポート)を CommonJS 側に変換して返します。
既存の CommonJS コードとの互換性向上
すでに大量の CommonJS ベースのコードがあるプロジェクトで、今後 ESM 化されたライブラリを利用したい場合、--experimental-require-module を利用することで、コード全体を ESM へ書き換えなくても、require() 経由で ESM モジュールを扱えるようになります。
解消までにやったこと
まずはDockerの立てていたNodeサーバーのイメージのバージョンが20だったので、23までバージョンアップを実行。
すると以下のエラーが、、
どうもNodeのデフォルトのバージョンが3系ではなく1系になっているみたい。(この辺よくわかってない)
backend 6/9] RUN yarn install --production=false:
0.366 error This project's package.json defines "packageManager": "yarn@3.2.2". However the current global version of Yarn is 1.22.22.
0.366
0.366 Presence of the "packageManager" field indicates that the project is meant to be used with Corepack, a tool included by default with all official
どうにも解消できなかったので、package.jsonで指定していたYarnのバージョン指定を解除してデフォルトのバージョンを使わせるようにした。
-"packageManager": "yarn@3.2.2"
package.jsonにNODE_OPTIONS='--experimental-require-module'
を指定し起動するとエラーは消えた。
"scripts": {
"format": "prettier --write \"src/**/*.ts\" \"test/**/*.ts\"",
"start": "NODE_OPTIONS='--experimental-require-module' nest start",
"start:dev": "NODE_OPTIONS='--experimental-require-module' nest start --watch -r tsconfig-paths/register",
"start:debug": "NODE_OPTIONS='--experimental-require-module' nest start --debug --watch",
"start:prod": "node dist/main",
"lint": "eslint \"{src,apps,libs,test}/**/*.ts\" --fix",
"test": "jest",
"test:watch": "jest --watch",
"test:cov": "jest --coverage",
"test:debug": "node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand",
"test:e2e": "jest --config ./test/jest-e2e.json",
"clean": "rimraf dist/",
"prisma:generate": "prisma generate --schema=./prisma-postgres/schema.prisma && prisma generate --schema=./prisma-mongodb/schema.prisma",
"prisma:seed": "ts-node ./prisma-postgres/seed.ts && ts-node ./prisma-mongodb/seed.ts",
"build": "NODE_OPTIONS='--experimental-require-module' yarn clean && nest build"
},
Discussion