CommonJS模式TypeScript项目导入ESM模块出现ERR_REQUIRE_ESM错误如何解决
问题根源
p-limit 从 v4.0.0 版本开始转为纯 ESM 模块,仅支持 import 语法导入。你当前的 TypeScript 配置中 compilerOptions.module 设为 commonjs,编译时会把所有 import 语句转换为 require() 调用,而 Node.js 不允许在 CommonJS 模块中用 require() 加载 ESM 模块,因此触发该报错。
可行解决方案
方案1:降级p-limit到支持CommonJS的版本(改动手最小,推荐优先尝试)
p-limit 最后一个兼容 CommonJS 的版本是 3.1.0,直接安装对应版本即可:
npm install p-limit@3.1.0
安装完成后无需修改其他代码和配置,直接重新运行项目即可。
方案2:使用动态import()加载p-limit
如果需要使用新版p-limit的特性,可以把同步导入改为异步动态导入,Node 14原生支持该语法:
修改file.ts中的代码如下:
// 把原有p-limit相关逻辑包裹在异步函数中 async function yourLogic() { const { default: pLimit } = await import('p-limit'); const limit = pLimit(1); // 后续原有逻辑 }
该方案无需修改TS配置,仅需要调整调用p-limit的代码结构。
方案3:将整个项目切换为ESM模式
如果项目可以适配ESM规范,可以做如下修改:
- 修改
tsconfig.json的compilerOptions配置:{ "compilerOptions": { "target": "ES2020", "module": "NodeNext", "moduleResolution": "NodeNext", // 其余原有配置保持不变 } } - 在项目根目录的
package.json中新增配置项:"type": "module" - 修改项目启动命令,Node 14运行ESM需要加实验性参数:
tsc && node --experimental-specifier-resolution=node serve.js - 项目中所有本地文件的导入路径需要补全
.js后缀(例如import utils from './utils.ts'要改为import utils from './utils.js')。
内容的提问来源于stack exchange,提问作者Joel'-'
相关产品推荐
相关产品推荐

