如何将require('random')改为动态import以解决ERR_REQUIRE_ESM错误?
解决ES模块require报错并保持原有调用方式
你遇到的问题是因为random包现在是ES模块(ESM),而你的代码是CommonJS格式,Node.js禁止用require()直接导入ESM模块,必须改用动态import()。下面提供两种修改方式,都能保持你原来random(0,20)的调用习惯:
方式一:用async/await(推荐,代码更直观)
把业务代码包裹在异步函数里,通过await完成动态导入,再把模块里的对应方法封装成你习惯的调用形式:
async function run() { // 动态导入random模块,解构获取默认导出 const { default: randomLib } = await import('random'); // 封装成你习惯的调用方式(生成整数用int,浮点数用float,按需调整) const random = (min, max) => randomLib.int(min, max); // 现在可以像之前一样调用 const x = random(0, 20); console.log(x); // 其他依赖random的业务代码都放在这里 } // 执行异步函数并捕获错误 run().catch(err => console.error('出错了:', err));
方式二:用Promise的then方法
如果不想用async函数,也可以通过Promise链式调用处理导入:
import('random') .then(({ default: randomLib }) => { const random = (min, max) => randomLib.int(min, max); const x = random(0, 20); console.log(x); // 其他依赖random的业务代码放在这里 }) .catch(err => console.error('出错了:', err));
注意点
- 如果你原来的
random(0,20)是生成浮点数,把randomLib.int改成randomLib.float即可; - 动态导入是异步操作,所有依赖
random的代码必须放在异步上下文里(async函数内部或then回调中),不能在全局同步调用。
内容的提问来源于stack exchange,提问作者Paul Ged
相关产品推荐
相关产品推荐

