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模块:
- 在项目根目录的
package.json中添加:"type": "module" - 修改
tsconfig.json的编译选项:{ "compilerOptions": { "module": "ESNext", "moduleResolution": "node16", // 其他原有配置保持不变 } } - 之后就可以正常使用静态导入:
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
相关产品推荐
相关产品推荐

