# package.json 里锁版本
'dependencies': { 'chalk': '4.1.2' }
# 或
const { default: chalk } = await import('chalk');

老项目里用 require 引入一个刚升级的依赖包,安装完启动直接抛出 Error [ERR_REQUIRE_ESM]: require() of ES Module not supported,把版本退回上一版就一切正常,代码一行没改。先别急着动参数,把报错原文和时间点记下来,顺序反了容易白折腾。

原因不复杂,这个包的清单里声明了模块类型,或者入口文件只剩 ESM 版本,运行时不允许用 require 去同步加载 ESM,版本升级换了导出形式就踩上了。

「ERR_REQUIRE_ESM」确认了原因之后,改动尽量只碰那一处,顺手改的东西后面最容易出问题。改完隔一天再看一次,当场正常不代表能稳住。

测试环境和线上的差别,往往就在版本号和那几行被忽略的配置上。线上出问题先对时间点,跟发布、备份、任务执行的时刻排一排,能省掉一半功夫。

处理上按这个顺序:先确认依赖包里声明的模块类型以及入口后缀;退回仍然提供 CommonJS 入口的那个版本;或者改成动态导入 然后再在外面包一层异步加载。

改完只确认一件事:启动不再抛 ERR_REQUIRE_ESM,服务日志正常输出,依赖的功能跑一遍都没问题。

作者 9823189