ES 模块的 require() ERR_REQUIRE_ESM错误

Error ERR_REQUIRE_ESM require() of ES Module

提问人:samala7800 提问时间:11/16/2023 更新时间:11/16/2023 访问量:47

问:

我知道这是一个流行的错误,但是,我不明白为什么我在这一点上得到它,或者如何解决它。我有一个 TS 项目,我将其编译为 JS 并运行。要构建项目,我只需运行

tsc -p tsconfig.json

然后运行我运行的项目

node ./build/index.js

我有很多现代软件包,比如

  "dependencies": {
    "@fastify/cookie": "^8.3.0",
    "@fastify/cors": "^8.1.0",
    "@fastify/multipart": "^8.0.0",
    "@fastify/websocket": "^7.0.1",
    "@prisma/client": "^5.5.2",
    "fastify": "^4.6.0",
    "file-type": "^18.7.0",
    "mime-types": "^2.1.35",
    "nodemailer": "^6.8.0",
    "openai": "^3.1.0",
    "pg-error-enum": "^0.6.0",
    "ts-loader": "^9.4.2",
    "useragent": "^2.3.0"
  },
  "devDependencies": {
    "@types/jest": "^29.5.8",
    "@types/mime-types": "^2.1.1",
    "@types/node": "^18.7.20",
    "@types/nodemailer": "^6.4.6",
    "@types/useragent": "^2.3.1",
    "@types/ws": "^8.5.3",
    "jest": "^29.7.0",
    "nodemon": "^2.0.20",
    "prisma": "^5.5.2",
    "ts-jest": "^29.1.1",
    "typescript": "^5.2.2"
  },

并且一直没有问题,直到有一天我添加了文件类型

这个包似乎和其他包一样现代。然而,我一导入它就收到这个错误。

Error [ERR_REQUIRE_ESM]: require() of ES Module C:\xx\node_modules\file-type\index.js from C:\xx\build\File.js not supported.
Instead change the require of index.js in C:\xx\build\File.js to a dynamic import() which is available in all CommonJS modules.

我的ts配置文件就是这样

{
  "compilerOptions": {
    "declaration": true
    "composite": true
    "declarationMap": true
    "target": "es2021"
    "module": "commonjs" 
    "rootDir": "./src" 
    "moduleResolution": "node" 
    "sourceMap": true,
    "outDir": "build",
    "esModuleInterop": true,
    "forceConsistentCasingInFileNames": true,
    "skipLibCheck": true
  },
  "ts-node": {
    "compilerOptions": {
      "module": "commonjs"
    }
  }
}

我真的尝试过改变这些领域中的许多,也增加了我的主要package.json,但我所做的一切都破坏了其他东西。type: module

在我看来,不知何故,是我添加的第一个原生使用导入/导出的包,而像 fastify 这样的东西似乎在其实际源代码或构建代码中使用了 require()。我可以不支持同时使用这两种类型的软件包吗?file-type

节点.js 打字稿

评论


答:

0赞 samala7800 12/3/2023 #1

为了解决这个问题,我不得不做一些事情

  1. 将我的tsConfig.json选项从 更改为modulecommonjses2022
  2. 将我的tsConfig.json更改为ts-node.compilerOptions.modulees2022
  3. 添加是因为 Typescript 或 Node 开发人员拒绝在没有扩展的情况下支持,例如 .tsc-aliasimport { thing } from './myfile'.jsimport { thing } from './myfile.js'

请注意,我不使用打包器,我只是使用打字稿构建,因此如果您使用 webpack,则不需要 #3。可能。