
本文介绍如何解决 node.js 中因混合使用 commonjs(`require`)与 es 模块(`.mjs` 或 `"type": "module"`)导致的 `err_require_esm` 错误,并正确调用 `random` 库的整数生成方法。
当你在 Node.js 项目中使用 const random = require('random'); 却遇到 ERR_REQUIRE_ESM 报错,根本原因在于:random 包(即 random)自 v3.0.0 起已完全发布为纯 ES 模块(ESM),不再支持 require() 同步加载。即使你的主文件是 CommonJS(.js + package.json 无 "type": "module"),只要所依赖的模块是 ESM,Node.js 就会强制要求使用动态 import() —— 且该 import() 返回的是一个 Promise,无法直接得到同步函数如 random(0, 20)。
但请注意:仅改用 import() 并不能恢复 random(0, 20) 这种旧式调用方式。random 包的 ESM 版本导出的是命名函数对象(如 int, float, bool 等),不再默认导出一个可直接调用的函数。因此,正确的迁移路径分两步:
✅ 第一步:改为动态 import()(适用于 CommonJS 环境)
// ❌ 错误(CommonJS 中 require ESM 模块)
// const random = require('random');
// ✅ 正确:在 CommonJS 文件中使用顶层 await(需 Node.js ≥ 14.8 且启用 --experimental-top-level-await)
const { int } = await import('random');
// 然后使用:
const x = int(0, 20); // ✅ 生成 [0, 20) 区间内的整数(左闭右开)? 提示:若你使用的是较老 Node.js 版本( console.log(x));
✅ 第二步:使用正确的 API(关键!)
原写法 random(0, 20) 是 random@2.x 的默认导出行为,而 random@3.x+ 已移除该导出。你必须显式调用其子函数:
- int(min, max) → 生成 [min, max) 整数(推荐,最常用)
- float(min, max) → 生成 [min, max) 浮点数
- bool() → 随机布尔值
// ✅ 正确用法示例
const { int, float, bool } = await import('random');
console.log(int(0, 20)); // e.g., 7
console.log(float(1.5, 3.7)); // e.g., 2.934
console.log(bool()); // true or false⚠️ 注意事项
- 不要尝试 const random = (await import('random')).default —— random 包没有 default 导出,此举会报 undefined is not a function。
- 若你项目已设 "type": "module",则应统一使用静态 import(非动态):
// index.mjs 或 package.json 中 "type": "module" import { int } from 'random'; const x = int(0, 20); - 确保安装的是最新版:npm install random@latest(当前稳定版为 ^3.0.0)。
✅ 总结
修复本质是 API 升级 + 加载方式适配:
- 用 await import('random') 替代 require('random');
- 解构使用 { int } 等具名导出,而非调用 random(0,20);
- 根据需求选择 int() / float() / bool() 等明确语义的方法。
这样既符合 Node.js 模块规范,又确保代码简洁、类型清晰、可维护性强。










