You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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规范,可以做如下修改:

  1. 修改tsconfig.json的compilerOptions配置:
    {
      "compilerOptions": {
        "target": "ES2020",
        "module": "NodeNext",
        "moduleResolution": "NodeNext",
        // 其余原有配置保持不变
      }
    }
    
  2. 在项目根目录的package.json中新增配置项:
    "type": "module"
    
  3. 修改项目启动命令,Node 14运行ESM需要加实验性参数:
    tsc && node --experimental-specifier-resolution=node serve.js
    
  4. 项目中所有本地文件的导入路径需要补全.js后缀(例如import utils from './utils.ts'要改为import utils from './utils.js')。

内容的提问来源于stack exchange,提问作者Joel'-'

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 23:36:03