HQY

×

Node.js中解决`ERR_REQUIRE_ESM`错误的完整方案

hqy hqy 发表于2026-06-11 10:11:22 浏览5 评论0

抢沙发发表评论

Node.js中解决`ERR_REQUIRE_ESM`错误的完整方案

在Node.js开发中,当尝试用require()加载ES模块(ESM)时,会触发ERR_REQUIRE_ESM错误。本文将系统梳理该问题的成因、解决方案及验证方法,帮助开发者快速定位并修复问题。

错误成因分析

模块系统冲突

Node.js支持两种模块系统:

  • CommonJS (CJS):使用require()module.exports,同步加载

  • ES Modules (ESM):使用importexport,异步加载

ESM模块不能通过require()加载,否则会抛出ERR_REQUIRE_ESM错误。

常见触发场景

场景具体表现
项目配置package.json中包含"type": "module"但代码使用require()
第三方依赖依赖已升级为纯ESM格式(如chalk@5+inquirer@9+
文件扩展名文件使用.mjs扩展名但尝试用require()引入

解决方案矩阵

方案1:改用ESM语法(推荐)

require()替换为import语法,需满足以下条件之一:

  1. 文件扩展名为.mjs

  2. package.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:修改项目配置

  1. 移除"type": "module"
    package.json中删除该字段或改为"type": "commonjs"

  2. 重命名文件扩展名

    • .mjs改为.cjs(强制CJS)

    • .js改为.cjs(如果显式配置了"type": "commonjs"

方案5:Babel转译(复杂项目)

通过Babel将ESM代码转译为CJS:

  1. 安装依赖:

bash复制npm install --save-dev @babel/core @babel/preset-env
  1. 创建.babelrc配置文件:

json复制{  "presets": [["@babel/preset-env", { "modules": "commonjs" }]]}
  1. 运行Babel转译代码

验证修复效果

基础验证

  1. 检查模块版本兼容性:

bash复制npm list <problem-package>  # 确认版本是否兼容CJS
  1. 测试基础功能:

JavaScript复制// test.jsconst chalk = require('chalk'); // 或import chalk from 'chalk'console.log(chalk.red('Works!'));

运行命令:

bash复制node test.js

高级验证

对于复杂项目,建议:

  1. 编写单元测试覆盖模块加载场景

  2. 使用ESLint规则import/no-commonjs强制ESM语法

  3. 在CI/CD流程中加入模块系统兼容性检查


打赏

本文链接:https://www.kinber.cn/post/6623.html 转载需授权!

分享到:


推荐本站淘宝优惠价购买喜欢的宝贝:

image.png

 您阅读本篇文章共花了: 

群贤毕至

访客