你的需求是 在 monorepo 中通过 vue-demi
同时支持 Vue 2 和 Vue 3 的代码生成,但遇到了 vue-template-compiler
多版本安装问题。以下是终极解决方案:
问题根源
vue-template-compiler
是 Vue 2 专属工具,Vue 3 不需要它。- 当某个子包(或间接依赖)同时引用 Vue 2 和 Vue 3 时,pnpm 会为每个 Vue 主版本创建独立的
vue-template-compiler
实例,导致重复安装。
完整解决方案
1. 项目结构优化
monorepo/
├── packages/
│ ├── vue2-app/ # 纯 Vue 2 环境
│ │ └── package.json
│ ├── vue3-app/ # 纯 Vue 3 环境
│ │ └── package.json
│ └── shared-lib/ # 使用 vue-demi 的跨版本库
│ └── package.json
├── package.json
└── pnpm-workspace.yaml
2. 关键配置
(1) 根目录 package.json
{
"pnpm": {
"overrides": {
// 强制所有包使用固定版本的 vue 和 vue-template-compiler
"vue@2": "2.7.16",
"vue@3": "3.3.4",
"vue-template-compiler": "2.7.16",
"vue-demi": "0.14.6"
},
// 加这个就可以
"peerDependencyRules": {
// 忽略 Vue 3 对 vue-template-compiler 的缺失警告
"ignoreMissing": ["vue-template-compiler"]
},
// 下面这俩没有生效
"packageExtensions": {
"vue-template-compiler": {
"peerDependencies": {
"vue": "^2.7.16"
}
},
"@vue/composition-api": {
"peerDependencies": {
"vue": "^2.7.16"
}
}
}
}
}
(2) Vue 2 子包 (vue2-app/package.json
)
{
"dependencies": {
"vue": "^2.7.16",
"vue-template-compiler": "2.7.16",
"vue-demi": "0.14.6"
}
}
(3) Vue 3 子包 (vue3-app/package.json
)
{
"dependencies": {
"vue": "^3.3.4",
"vue-demi": "0.14.6"
}
}
(4) 共享库 (shared-lib/package.json
)
{
"dependencies": {
"vue-demi": "0.14.6"
},
"scripts": {
"switch:vue2": "vue-demi-switch 2",
"switch:vue3": "vue-demi-switch 3"
}
}
rm -rf node_modules pnpm-lock.yaml
pnpm install
技术原理
- 依赖锁定:通过
pnpm.overrides
强制所有子包使用指定版本,避免版本漂移。 - 环境隔离:Vue 3 子包中彻底移除
vue-template-compiler
依赖。 - 构建工具适配:使用
vue-demi-switch
时,它会自动修改node_modules/vue-demi
的指向,不会影响依赖树结构。
通过以上配置,可实现:
- ✅ Vue 2 子包正常使用
vue-template-compiler@2.7.16
- ✅ Vue 3 子包完全无
vue-template-compiler
- ✅
vue-demi
在不同子包中自动切换 Vue 版本