必须使用 import 加载 ES 模块: ...\node_modules\got\dist\source\index.js

Clo*_*kex 12 node.js typescript node.js-got

还有几十个其他问题的标题基本相同,但没有一个答案似乎是相关的,只会增加混乱。

这是我的tsconfig.json

{
  "compilerOptions": {
    "target": "es6",
    "module": "commonjs",
    "lib": ["es2017", "es7", "es6", "dom"],
    "declaration": true,
    "outDir": "dist",
    "strict": true,
    "esModuleInterop": true
  },
  "exclude": [
    "node_modules",
    "dist"
  ]
}
Run Code Online (Sandbox Code Playgroud)

这是我输入的内容:

import md5 from 'js-md5';
import got from 'got';
import { Design } from './Design';
...
Run Code Online (Sandbox Code Playgroud)

这是我的错误:

错误 [ERR_REQUIRE_ESM]:必须使用 import 加载 ES 模块:C:\Users\...\node_modules\got\dist\source\index.js 不支持 ES 模块的 require() 。

什么。我不是require,我是在用import。我在任何其他模块上都没有遇到此错误,那么为什么 Got 有所不同(并且为什么没有什么是简单的)?

为什么会发生这种情况以及如何解决它?


根据@jsejcksn 的回答,我尝试将其更改tsconfig.json为以下内容:

{
  "compilerOptions": {
    "target": "es6",
    "module": "esnext",
    "lib": ["es2017", "es7", "es6", "dom"],
    "declaration": true,
    "outDir": "dist",
    "strict": true,
    "esModuleInterop": true
  },
  "exclude": [
    "node_modules",
    "dist"
  ]
}
Run Code Online (Sandbox Code Playgroud)

...并添加"type": "module"到我的package.json

{
    "dependencies": {
        "body-parser": "^1.19.0",
        "express": "^4.17.1",
        "fs-extra": "^10.0.0",
        "got": "^12.0.1",
        "js-md5": "^0.7.3",
        "moment": "^2.29.1",
        "semver": "^7.3.5",
        "typescript": "^4.4.3",
        "uuid": "^8.3.2",
        "@types/node": "^16.9.2",
        "@types/express": "^4.17.13",
        "@types/fs-extra": "^9.0.13",
        "@types/semver": "^7.3.9",
        "@types/uuid": "^8.3.1",
        "@types/js-md5": "^0.4.3"
    },
    "type": "module"
}
Run Code Online (Sandbox Code Playgroud)

但现在我得到了不同的错误:|

src/Logging.ts:1:20 - 错误 TS2792:找不到模块“时刻”。您的意思是将“moduleResolution”选项设置为“node”,还是将别名添加到“paths”选项?

1 个来自“时刻”的导入时刻;

src/SyncAPI.ts:2:17 - 错误 TS2792:找不到模块“got”。您的意思是将“moduleResolution”选项设置为“node”,还是将别名添加到“paths”选项?

2 从“got”导入;

Den*_*s P 11

就我而言,这个错误是由ts-node-devpackage.json 引起的。

如果您使用相同的包(它通常位于开发依赖项中),您可以检查我在并行线程中发布的package.json解决步骤。希望这可以帮助。


jse*_*ksn 8

您已配置 TypeScript 将模块编译为 CommonJS 格式(您的 TSConfig 选项compilerOptions.module设置为"commonjs")。您需要将该选项设置为与 ESM 兼容的设置(例如"esnext"),以便 TS 编译器发出的已编译 JavaScript 为 ESM 格式。

在您的 中package.json,您可能还需要将该字段"type"设置"module"


编辑:要在导入语句中按名称使用 npm 包作为裸说明符,您还需要将 TSConfig 更新compilerOptions.moduleResolution"node". 在您当前的配置中,您已包含"dom"compilerOptions.lib数组中。"dom"适用于具有 DOM 的环境(Node 本身没有 DOM),因此不应该存在。相反,将该数组设置为["es2017"]将包含您指定的其他数组。


编辑:试图提供更直接的指导:

  • 确保您没有使用过时的 Node 版本(当前的 LTS 是^16.x.x
  • 确保您没有使用过时版本的 TypeScript(当前位于^4.5.x
  • 将所有源文件移至./src(如果它们尚未位于该目录中),然后
  • 使用它作为您的./tsconfig.json
{
  "compilerOptions": {
    "allowSyntheticDefaultImports": true,
    "declaration": true,
    "esModuleInterop": true,
    "lib": [
      "es2021"
    ],
    "module": "esnext",
    "moduleResolution": "node",
    "outDir": "dist",
    "strict": true,
    "target": "es2021"
  },
  "include": [
    "src/**/*"
  ]
}
Run Code Online (Sandbox Code Playgroud)
  • 并确保您的“类型”字段./package.json设置为“模块”:
{
  // ...
  "type": "module"
  // ...
}
Run Code Online (Sandbox Code Playgroud)

import此后,您应该不会在语句模块系统兼容性方面遇到任何问题。

  • _“你会想花一些时间学习......”_叹息。我的问题是我不应该这样做。它应该可以工作。Typescript、NodeJS,甚至 Got...这些都已经存在了很长时间并且非常流行。我没有理由必须了解编译器如何工作才能使用它。我应该能够按照说明进行操作,并且它应该可以正常工作。我真的厌倦了人们说“不,你必须了解 13 年的历史才能了解如何使用它”。那太疯狂了。`import got from 'got'` 的工作方式应该与 `import moment from 'moment'` 完全相同。 (22认同)