EC2部署NuxtJS 2报Error [ERR_REQUIRE_ESM]错误排查
问题根因
这个ERR_REQUIRE_ESM报错属于CommonJS与ES Module的规范兼容问题,和Nuxt业务代码、EC2 AMI2系统本身无关:
string-width、wrap-ansi这类终端字符串处理工具从5.x版本开始不再提供CommonJS导出,仅支持纯ESM规范- NuxtJS 2、5.0版本以下的PM2全链路基于CommonJS规范开发,Node.js 16.x默认禁止CommonJS模块通过
require()加载纯ESM包,直接触发报错 - 报错提示里建议手动修改
node_modules下文件的方案属于一次性临时方案,只要重新执行依赖安装、CI/CD重新构建就会失效,不建议使用。
解决方案(按推荐优先级排序)
方案1:通过npm overrides强制锁定兼容版本(最稳定,无侵入)
你当前用的npm 8.11.0原生支持overrides配置,可以直接强制所有层级的依赖安装兼容CommonJS的版本,不需要改动业务代码、不需要更换运行时版本。
- 打开项目根目录的
package.json,添加如下配置:
{ "overrides": { "string-width": "4.2.3", "wrap-ansi": "7.0.0", "strip-ansi": "6.0.1", "ansi-styles": "4.3.0", "chalk": "4.1.2" } }
- 删除项目下的
node_modules目录和package-lock.json锁文件 - 重新执行
npm install安装全量依赖 - 依次执行
npm run build、npm run start即可正常启动,报错会完全消失。
方案2:升级本地PM2到兼容版本
你当前start脚本调用的是项目内安装的PM2,老版本PM2对依赖的版本范围约束太松,会自动拉取不兼容的ESM高版本依赖。直接将项目内PM2升级到最新稳定版即可解决:
npm install pm2@latest -D
升级完成后重新构建启动即可,不需要修改其他配置。注意不要依赖全局安装的PM2,保持和你现有脚本的调用路径一致,用项目内的PM2版本避免环境差异。
方案3:临时降级Node.js版本(仅应急使用)
如果需要紧急上线来不及调整依赖,可以将EC2实例上的Node.js版本降级到14.x,Node14对CommonJS加载ESM的检测逻辑更宽松,不会直接抛出阻断错误。但Node14已经结束官方维护,存在安全风险,仅适合临时救急,长期部署必须切换到前两个方案。
注意:任何情况下都不要直接修改
node_modules目录下的源码做适配,只要部署流程触发依赖重装,所有手动修改的内容都会被覆盖,稳定性完全无法保障。
内容的提问来源于stack exchange,提问作者ks221197
相关产品推荐
相关产品推荐

