You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

升级部分依赖包后,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-width v4.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 13:19:59