如何在 ES 模块环境中正确导入并使用 random 库

17次阅读

如何在 ES 模块环境中正确导入并使用 random 库

本文介绍如何解决 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 升级 + 加载方式适配

  1. 用 await import(‘random’) 替代 require(‘random’);
  2. 解构使用 { int } 等具名导出,而非调用 random(0,20);
  3. 根据需求选择 int() / float() / bool() 等明确语义的方法。

这样既符合 Node.js 模块规范,又确保代码简洁、类型清晰、可维护性强。

text=ZqhQzanResources