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

TypeScript项目导入p-limit模块出现require()不支持错误的解决方法

解决p-limit导入时的ERR_REQUIRE_ESM错误

问题根源

p-limit v4及以上版本是纯ES模块,而你的TypeScript配置将代码编译为CommonJS格式。静态import语句会被转译为Node.js的require(),但Node.js禁止用require()加载ES模块,因此触发报错。

解决方法

方法1:统一使用动态导入(适配当前CommonJS配置)

删除所有静态导入,仅保留类型导入,通过动态导入加载p-limit,确保运行时用ES模块方式加载:

// 仅导入类型,不会被编译为require()
import type { LimitFunction } from 'p-limit';

let limitConcurrency: LimitFunction | undefined;

// 初始化并发限制器,确保使用前完成加载
async function initConcurrencyLimit() {
  const pLimitModule = await import('p-limit');
  limitConcurrency = pLimitModule.default(20);
}

// 在项目启动时调用初始化(比如入口文件或控制器初始化逻辑中)
// await initConcurrencyLimit();

注意:如果模块顶层无法使用await,可以将初始化逻辑放在异步入口函数中,或用.then()处理,但必须保证在调用limitConcurrency前完成初始化。

方法2:将项目切换为ES模块

如果可以调整项目模块系统,推荐彻底转为ES模块:

  1. 在项目根目录的package.json中添加:
    "type": "module"
    
  2. 修改tsconfig.json的编译选项:
    {
      "compilerOptions": {
        "module": "ESNext",
        "moduleResolution": "node16",
        // 其他原有配置保持不变
      }
    }
    
  3. 之后就可以正常使用静态导入:
    import pLimit, { LimitFunction } from 'p-limit';
    const limit = pLimit(20);
    

方法3:降级p-limit到v3版本(不推荐)

v3版本同时支持CommonJS和ESM,安装后可直接用原有静态导入:

npm install p-limit@3

缺点:无法获取v4及以上版本的功能更新和修复。

为什么原有代码报错?

你同时使用了静态import和动态import,静态导入会被TypeScript编译为require(),直接触发Node.js的ES模块加载限制,因此必须二选一:要么全用动态导入,要么切换模块系统。

内容的提问来源于stack exchange,提问作者Daniel Corona

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 03:01:22