升级部分依赖包后,Yarn全新安装致Node应用失败,旧lock文件可正常运行
解决Yarn升级依赖后重新安装出现ESM/CommonJS兼容问题
你的问题核心是第三方依赖的ESM与CommonJS兼容性冲突:升级部分包后,新生成的yarn.lock拉取了纯ESM版本的string-width(v5+版本改为纯ESM规范),但依赖它的cliui是CommonJS模块,仍用require()加载ESM模块,触发Node的ERR_REQUIRE_ESM报错。而旧yarn.lock锁定的是string-width的CommonJS兼容版本(v4.x),因此能正常运行。
具体解决方法
1. 强制锁定string-width为CommonJS兼容版本
在项目的package.json中添加resolutions字段,强制指定string-width为支持CommonJS的稳定版本(比如^4.2.3):
{ "resolutions": { "string-width": "^4.2.3" } }
执行以下命令彻底清理后重新安装依赖:
rm -rf node_modules yarn.lock yarn install
Yarn会优先使用resolutions中指定的版本,确保cliui能通过require()正常加载它。
2. 调整cliui版本适配依赖
如果希望保留string-width的新版本,可以通过resolutions锁定cliui到兼容版本:
- 若要适配ESM版
string-width,锁定cliui@^7.0.4及以上版本(该版本已支持导入ESM模块); - 若不需要新版本特性,也可锁定
cliui@^6.0.0(依赖string-widthv4.x的CommonJS版本)。
示例配置:
{ "resolutions": { "cliui": "^7.0.4" } }
3. 清理Yarn缓存避免残留干扰
缓存中的旧包可能导致安装结果异常,执行以下命令彻底清理后重新安装:
yarn cache clean rm -rf node_modules yarn.lock yarn install
4. 验证项目模块类型配置
确认项目根目录package.json的type字段设置匹配项目规范:
- 若项目以CommonJS为主,保持
"type": "commonjs"(默认值,可不显式声明); - 若项目混合ESM与CJS,确保相关文件使用
.mjs/.cjs扩展名,或通过package.json的exports字段明确模块类型。不过此操作仅针对项目代码,你的问题核心是第三方依赖冲突,优先级低于前三种方法。
内容的提问来源于stack exchange,提问作者user3552178
相关产品推荐
相关产品推荐

