Node.js中解决`ERR_REQUIRE_ESM`错误的完整方案
在Node.js开发中,当尝试用require()加载ES模块(ESM)时,会触发ERR_REQUIRE_ESM错误。本文将系统梳理该问题的成因、解决方案及验证方法,帮助开发者快速定位并修复问题。
错误成因分析
模块系统冲突
Node.js支持两种模块系统:
CommonJS (CJS):使用
require()和module.exports,同步加载ES Modules (ESM):使用
import和export,异步加载
ESM模块不能通过require()加载,否则会抛出ERR_REQUIRE_ESM错误。
常见触发场景
| 场景 | 具体表现 |
|---|---|
| 项目配置 | package.json中包含"type": "module"但代码使用require() |
| 第三方依赖 | 依赖已升级为纯ESM格式(如chalk@5+、inquirer@9+) |
| 文件扩展名 | 文件使用.mjs扩展名但尝试用require()引入 |
解决方案矩阵
方案1:改用ESM语法(推荐)
将require()替换为import语法,需满足以下条件之一:
文件扩展名为
.mjspackage.json中包含"type": "module"
JavaScript复制// 原CJS代码const chalk = require('chalk');// 修改为ESMimport chalk from 'chalk';方案2:动态导入(异步场景)
对于动态路径或需要异步加载的模块,使用import()(返回Promise):
JavaScript复制async function loadModule() { const chalk = await import('chalk'); console.log(chalk.default.red('Error!')); // 注意访问.default属性}loadModule();方案3:降级依赖版本
如果问题由第三方包的ESM版本引起,可降级到兼容CJS的旧版:
bash复制# 示例:降级chalk到v4(CJS格式)npm uninstall chalknpm install chalk@4
方案4:修改项目配置
移除
"type": "module"
在package.json中删除该字段或改为"type": "commonjs"重命名文件扩展名
将
.mjs改为.cjs(强制CJS)将
.js改为.cjs(如果显式配置了"type": "commonjs")
方案5:Babel转译(复杂项目)
通过Babel将ESM代码转译为CJS:
安装依赖:
bash复制npm install --save-dev @babel/core @babel/preset-env
创建
.babelrc配置文件:
json复制{ "presets": [["@babel/preset-env", { "modules": "commonjs" }]]}运行Babel转译代码
验证修复效果
基础验证
检查模块版本兼容性:
bash复制npm list <problem-package> # 确认版本是否兼容CJS
测试基础功能:
JavaScript复制// test.jsconst chalk = require('chalk'); // 或import chalk from 'chalk'console.log(chalk.red('Works!'));运行命令:
bash复制node test.js
高级验证
对于复杂项目,建议:
编写单元测试覆盖模块加载场景
使用ESLint规则
import/no-commonjs强制ESM语法在CI/CD流程中加入模块系统兼容性检查
本文链接:https://www.kinber.cn/post/6623.html 转载需授权!
推荐本站淘宝优惠价购买喜欢的宝贝:

支付宝微信扫一扫,打赏作者吧~
