如何在Lerna管理的Monorepo中为Vue2、Vue3包配置不同版本依赖
Lerna 多包不同版本Vue依赖解决方案
Lerna 完全支持为不同子包配置不同版本的Vue及相关依赖,你之前的配置有误导致方案未生效,正确操作如下:
方案1:配置nohoist禁止指定依赖提升(推荐)
该方案是多包管理工具处理同包名不同版本依赖的标准实现,无需修改代码里的导入路径,也不会触发peer依赖缺失报错。
第一步:配置nohoist规则
根据你使用的Lerna版本,添加对应配置:
如果是Lerna v6及以上版本,在lerna.json中添加如下配置:
{ "hoist": true, "nohoist": [ "**/vue", "**/vue/**", "**/vue-router", "**/vue-router/**", "**/@vue/test-utils", "**/@vue/test-utils/**" ] }
如果你的Lerna对接了npm/yarn workspaces,还需要在根目录package.json中补充workspaces的nohoist配置:
{ "workspaces": { "packages": ["packages/*"], "nohoist": [ "**/vue", "**/vue/**", "**/vue-router", "**/vue-router/**", "**/@vue/test-utils", "**/@vue/test-utils/**" ] } }
**是通配符,代表所有子包下的对应依赖,同时匹配依赖本身和依赖的子依赖,避免部分嵌套依赖被意外提升。
第二步:子包单独声明对应版本依赖
不要在根目录的package.json中声明Vue、vue-router、@vue/test-utils相关依赖,仅在两个support包中分别声明对应版本:packages/support-vue/package.json 配置:
{ "dependencies": { "vue": "^2.6.14", "vue-router": "^3.5.4", "@vue/test-utils": "^1.3.6" } }
packages/support-vue3/package.json 配置:
{ "dependencies": { "vue": "^3.3.4", "vue-router": "^4.2.5", "@vue/test-utils": "^2.4.1" } }
第三步:清空缓存重装依赖
配置修改完成后必须清空历史安装缓存,否则配置不会生效:
- 删除根目录
node_modules、所有子包的node_modules、根目录的锁文件(package-lock.json/yarn.lock/pnpm-lock.yaml) - 执行
lerna clean确认所有子包冗余依赖已清除 - 执行
lerna bootstrap重新安装所有依赖
安装完成后,两个子包的node_modules下都会存在独立的对应版本Vue及相关依赖,peer依赖检测会直接读取当前子包下的依赖,不会再报缺失错误。
之前方案失效原因说明
- 别名安装方案:将vue重命名为vue2/vue3后,@vue/test-utils等包的peer依赖声明查找的是
vue包名,自然会报缺失错误,该方案不适合存在peer依赖的场景。 - 未生效的nohoist配置:大概率是通配符配置错误,或者未清空历史缓存导致旧的提升依赖仍然存在,按照上述步骤重新配置即可生效。
内容的提问来源于stack exchange,提问作者Jan Dlouhý
相关产品推荐
相关产品推荐

