`vue-demi` 在不同工作区生成兼容 Vue 2 和 Vue 3 的代码,同时使用 `pnpm workspace` 管理多包,但出现了 `vue-template-compiler` 多版本

你的需求是 在 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

技术原理

  1. 依赖锁定:通过 pnpm.overrides 强制所有子包使用指定版本,避免版本漂移。
  2. 环境隔离:Vue 3 子包中彻底移除 vue-template-compiler 依赖。
  3. 构建工具适配:使用 vue-demi-switch 时,它会自动修改 node_modules/vue-demi 的指向,不会影响依赖树结构。

通过以上配置,可实现:

  • ✅ Vue 2 子包正常使用 vue-template-compiler@2.7.16
  • ✅ Vue 3 子包完全无 vue-template-compiler
  • vue-demi 在不同子包中自动切换 Vue 版本
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

给钱,谢谢!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值