typescript 必须使用导入来加载ES模块:...\node_modules\got\dist\source\index.js

brvekthn  于 2022-12-27  发布在  TypeScript
关注(0)|答案(2)|浏览(300)

还有几十个其他的问题,基本上是相同的标题,但没有一个答案似乎是相关的,只是增加了混乱。
这是我的tsconfig.json

{
  "compilerOptions": {
    "target": "es6",
    "module": "commonjs",
    "lib": ["es2017", "es7", "es6", "dom"],
    "declaration": true,
    "outDir": "dist",
    "strict": true,
    "esModuleInterop": true
  },
  "exclude": [
    "node_modules",
    "dist"
  ]
}

这是我打的:

import md5 from 'js-md5';
import got from 'got';
import { Design } from './Design';
...

这是我的错误:
错误[错误_请求_ESM]:必须使用导入来加载ES模块:不支持ES模块的C:\用户...\节点_模块\获得\分发\源\索引. js 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"
  ]
}

...并将"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"
}

但现在我只得到不同的错误:|
src/日志记录。ts:1:20-错误TS2792:找不到模块"moment"。您是要将"moduleResolution"选项设置为"node",还是要向"paths"选项添加别名?
从"时刻"导入1个时刻;
源代码/同步API. ts:2:17-错误TS2792:找不到模块"got"。您是要将"moduleResolution"选项设置为"node",还是要向"paths"选项添加别名?
2从"got"获取的导入;

vpfxa7rd

vpfxa7rd1#

您已将TypeScript配置为将模块编译为CommonJS格式(您的TSConfig选项compilerOptions.module设置为"commonjs")。您需要将该选项设置为ESM兼容设置(如"esnext"),以便TS编译器发出的已编译JavaScript为ESM格式。
package.json中,您可能还需要将"type"字段设置为"module"
编辑:要在import语句中按名称使用npm包作为裸说明符,还需要将TSConfig compilerOptions.moduleResolution更新为"node"。在当前配置中,您已将"dom"包含在compilerOptions.lib数组中。"dom"适用于具有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/**/*"
  ]
}
  • 并确保./package.json中的"type"字段设置为"module":
{
  // ...
  "type": "module"
  // ...
}

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

5vf7fwbs

5vf7fwbs2#

在我的例子中,这个错误是由ts-node-dev包引起的。
如果你使用相同的软件包(它通常位于package.json的开发依赖项中),你可以检查解决步骤I posted in a parallel thread。希望这能有所帮助。

相关问题