如何在打字稿项目中导入节点模块。 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的主要内容,如果未能解决你的问题,请参考以下文章