ERR_REQUIRE_ESM是Node.js加载器硬性禁止CommonJS的require()加载ESM文件(如.mjs或type:"module"下的.js)所致。解决方法包括:在CommonJS中用await import()动态加载,或用createRequire构造专用加载器;避免一刀切设"type":"module",应通过后缀(.mjs/.cjs)明确区分模块类型。

ERR_REQUIRE_ESM:require() 加载 .mjs 或 ESM 包时直接崩溃
这是 Node.js 模块加载器的硬性限制,不是语法错误。只要你在 CommonJS 文件(比如 index.js)里写了 require('./utils.mjs'),Node 就会在解析阶段立刻抛出 Error [ERR_REQUIRE_ESM]。
常见触发点:
- 第三方包升级到 ESM 默认发布(如
execa@8+、glob@10+),但你的入口仍是require() - 自己写了
.mjs工具脚本,被旧代码require()直接引入 - VSCode 的 Code Runner 插件默认用
node xxx.js执行,不区分模块类型
别改后缀或一刀切加 "type": "module"——那会让所有 .js 变成 ESM,导致原有 require('./config.js') 全部失效。
可行解法:
- 在 CommonJS 文件中改用动态
import():const mod = await import('./utils.mjs');(注意返回的是 Promise,需async函数或顶层await) - 若必须同步加载(如 CLI 参数解析),用
createRequire构造专用加载器:import { createRequire } from 'module';<br>const require = createRequire(import.meta.url);<br>const config = require('./config.cjs');注意:createRequire创建的require仍不能加载.mjs,只用于加载.cjs或未设type: "module"的.js
SyntaxError: Cannot use import statement outside a module
这是典型的执行环境错配:你写了 import,但 Node 把文件当 CommonJS 解析了。根本原因不是 Node 版本低,而是没声明模块类型或执行方式不对。
两种互斥路径:
- 加
"type": "module"到package.json:所有.js按 ESM 处理,但所有require()必须重写为import,且不能再用__dirname、__filename - 不加
type,改后缀:把 ESM 文件存为.mjs,CommonJS 文件保持.js或改用.cjs(.cjs总是被识别为 CommonJS,不受package.json影响)
VSCode 的 Code Runner 插件默认按后缀判断运行方式,.mjs 会自动用 node --experimental-modules(旧版)或直接 node(v14+),但 .js 一定走 CommonJS。所以混用时,文件后缀必须明确区分。
使用一条命令部署ProbeChain Rydberg测试网代理节点。自动注册为Agent(NodeType=1),免gas,支持macOS/Linux/Windows。触发词:/r
require is not defined 错误出现在 VSCode 终端里?
这个报错只该出现在浏览器控制台。如果它真出现在 VSCode 内置终端,说明你没用 node 执行,而是误用了其他命令(比如直接 node -e "require('./x.js')" 但当前目录没装 Node,或用了错误 shell)。
先验证基础环境:
- 终端里运行
which node和node -v,确认 Node 可用且版本 ≥ v14.18(ESM 基础支持) - 检查
package.json是否有"type": "module";如果有,require()就真的不能用,不是插件问题 - Code Runner 插件默认配置可能把
.js当浏览器脚本跑(尤其 Windows 上),需进插件设置搜code-runner.executorMap,把javascript对应值改成"node"
更稳妥的做法:统一在终端里手动执行 node index.js,而不是依赖右键“Run Code”。
调试时 F5 报错 Cannot find module 'bootloader.bundle.js'
这几乎 100% 是 Node 安装路径含中文或空格导致的。VSCode 的 js-debug 调试器对路径编码极敏感,哪怕只是 C:Program Files
odejs 这种带空格路径,也可能让 require() 在内部解析失败。
检查步骤:
- 运行
which node(macOS/Linux)或where node(Windows),看输出路径是否含中文、空格、emoji - 如果是官网 pkg 安装,默认路径
/usr/local/bin/node(macOS)或C: odejs(Windows)是安全的;手动解压的版本务必移到纯英文路径 - 打开
.vscode/launch.json,删掉runtimeExecutable字段(让调试器从 PATH 查找),或填绝对路径如"C:\nodejs\node.exe"
注意:launch.json 里的路径要用双反斜杠 \ 或正斜杠 /,不能用单反斜杠。
混用 import 和 require 最容易被忽略的点:模块边界必须物理隔离。不是靠注释或命名约定,而是靠文件后缀(.cjs/.mjs)和 package.json 的 type 字段共同锁定行为。一旦跨边界调用,就得用 import() 或 createRequire 显式桥接,没有中间态。

















