如何在打字稿项目中导入节点模块。 ERR_REQUIRE_ESM

Posted

技术标签:

【中文标题】如何在打字稿项目中导入节点模块。 ERR_REQUIRE_ESM【英文标题】:How to import node module in typescript project. ERR_REQUIRE_ESM 【发布时间】:2021-12-25 14:21:59 【问题描述】:

我正在尝试将包 p-limit 导入到我的打字稿项目中。在尝试使用tsc && node serve.js 运行项目时,我遇到了以下错误。

我被困在这几个小时了......

Error [ERR_REQUIRE_ESM]: Must use import to load ES Module: /project/node_modules/p-limit/index.js
require() of ES modules is not supported.
require() of /project/node_modules/p-limit/index.js from /project/dist/services/file.ts is an ES module file as it is a .js file whose nearest parent package.json contains "type": "module" which defines all .js files in that package scope as ES modules.
Instead rename index.js to end in .cjs, change the requiring code to use import(), or remove "type": "module" from /project/node_modules/p-limit/package.json.

file.ts 中的这段代码导致了问题:

import pLimit from 'p-limit';
const limit = pLimit(1);

tsconfig.json


  "compilerOptions": 
    "target": "ES2017",
    "module": "commonjs",
    "resolveJsonModule": true,
    "esModuleInterop": true,
    "rootDir": "src",
    "outDir": "dist",
    "sourceMap": true,
    "experimentalDecorators": true,
    "types": [
      "node",
      "express"
    ],
    "strictNullChecks": true
  ,
  "files": [
    "./node_modules/@types/node/index.d.ts",
    "./node_modules/p-limit/index.d.ts"
  ],
  "include": [
    "src/**/*.ts"
  ],
  "exclude": [
    "node_modules"
  ]

节点版本:v14.18.0

【问题讨论】:

在您的 tsconfig 中,您的模块为 commonjs。试试"module": "es2017", 当我这样做时,我还必须删除"resolveJsonModule": true,因为这些是冲突的。之后,在构建时,我收到如下错误:node_modules/@types/mongodb/index.d.ts:46:78 - error TS2792: Cannot find module 'bson'. Did you mean to set the 'moduleResolution' option to 'node', or to add aliases to the 'paths' option? 请添加重现错误的minimal reproducible example 【参考方案1】:

添加

"lib": [
    "es2017"
]

致您的tsconfig.json

【讨论】:

不幸的是仍然与我最初的帖子完全相同的错误【参考方案2】:

p-limit 4.0.0 及更高版本现在仅适用于 ESM。您可以将 p-limit 降级为 commonjs 的 3.1.0,它应该可以正常工作。

这个包现在是纯 ESM。请阅读本文。

https://github.com/sindresorhus/p-limit/releases/tag/v4.0.0

或者,您可以将项目从 CJS 切换到 ESM,但这是一个更大的问题。

https://nodejs.org/api/esm.html

【讨论】:

这不是一个有效的答案,也没有回答问题。

以上是关于如何在打字稿项目中导入节点模块。 ERR_REQUIRE_ESM的主要内容,如果未能解决你的问题,请参考以下文章

json 尝试在打字稿中导入外部模块

如何在打字稿monorepo中导入本地包

在打字稿Angular 5中导入json文件

为啥 vscode 从打字稿缓存中导入包

如何在打字稿中导入 react-cookie

在 Web Worker 中导入 tensorflow 时出现 Angular 打字稿类型检查问题