当Vite+将 vite别名为 @voidzero-dev/vite-plus-core时,pnpm会提示对等依赖版本不正确的警告

前端开发 2026-07-11

我创建了一个测试用的Vite+项目。
然后我尝试使用 vp install 命令安装 @tailwindcss/vite 插件,该命令支持多种Vite版本,但我仍然遇到了一个警告。(尽管可以看到pnpm默认也会对 vite-plus 包报告问题。)

❯ vp install @tailwindcss/vite
VITE+ - The Unified Toolchain for the Web

Already up to date
Progress: resolved 130, reused 62, downloaded 0, added 0, done
 WARN  Issues with peer dependencies found
.
├─┬ @tailwindcss/vite 4.2.2
│ └── ✕ unmet peer vite@"^5.2.0 || ^6 || ^7 || ^8": found 0.1.12
└─┬ vite-plus 0.1.12
  └─┬ @voidzero-dev/vite-plus-test 0.1.12
    └── ✕ unmet peer vite@"^6.0.0 || ^7.0.0 || ^8.0.0-0": found 0.1.12
Done in 595ms using pnpm v10.32.1

tip: Available short aliases: i = install, rm = remove, un = uninstall, up = update, ls = list, ln = link

据我所知,后台的Vite+会在遇到“vite”这个词时安装一个不同的新包,只把“vite”用作一个符号链接来使用。这个新包的最新版本是0.1.12。

{
  "name": "test",
  "version": "0.0.0",
  "private": true,
  "type": "module",
  "scripts": {
    "dev": "vp dev",
    "build": "tsc && vp build",
    "preview": "vp preview",
    "prepare": "vp config"
  },
  "devDependencies": {
    "typescript": "~5.9.3",
    "vite": "npm:@voidzero-dev/vite-plus-core@latest",
    "vite-plus": "latest"
  },
  "packageManager": "[email protected]",
  "pnpm": {
    "overrides": {
      "vite": "npm:@voidzero-dev/vite-plus-core@latest",
      "vitest": "npm:@voidzero-dev/vite-plus-test@latest"
    }
  },
  "dependencies": {
    "@tailwindcss/vite": "^4.2.2"
  }
}

虽然安装已完成,但这个警告相当具有误导性。该如何消除它?

解决方案

在尚无合适解决方案时,pnpm仍然可以通过自动化的方式进行处理。

通过脚本实现的解决方案

只需创建 .pnpmfile.cjs,并用 bundledVersions.vite 动态覆盖 @voidzero-dev/vite-plus-core 的版本。

这使得可以从 bundledVersions.vite 获取实际的Vite版本,然后据此仅向真正支持该版本的包添加VitePlus的支持。因此如果 bundledVersions.vite 是v8,但你安装的依赖只支持Vite 5-7,仍然会收到警告。

.pnpmfile.cjs(在你的项目根目录)

let vitePlusCoreVersion = null;
let bundledVite = null;
const logs = [];

// pnpm alias resolves vite instead of @voidzero-dev/vite-plus-core, try both paths
const candidates = [
  "./node_modules/vite/package.json",
  "./node_modules/@voidzero-dev/vite-plus-core/package.json",
];

for (const candidate of candidates) {
  try {
    const viteCore = require(candidate);
    if (viteCore.name === "@voidzero-dev/vite-plus-core") {
      vitePlusCoreVersion = viteCore.version;
      bundledVite = viteCore.bundledVersions?.vite;
      logs.push(`Loaded from ${candidate}: ${vitePlusCoreVersion} (bundled vite: ${bundledVite})`);
      break;
    }
  } catch {}
}

if (!bundledVite) {
  logs.push("vite-plus-core not found, peer dependency ranges will not be extended");
}

function satisfiesRange(version, range) {
  const bundledMajor = parseInt(version.split(".")[0], 10);
  const majorsInRange = [...range.matchAll(/\^?(\d+)/g)].map(m => parseInt(m[1], 10));
  return majorsInRange.includes(bundledMajor);
}

function extendViteRange(pkg, field) {
  const deps = pkg[field];
  if (!deps?.vite || !bundledVite || !vitePlusCoreVersion) return;

  if (satisfiesRange(bundledVite, deps.vite)) {
    logs.push(`${pkg.name}[${field}]: ${deps.vite} || ${vitePlusCoreVersion}`);
    deps.vite = `${deps.vite} || ${vitePlusCoreVersion}`;
  }
  // If the range does not match, the package does not support the vite version specified
  // in bundledVersions - this is more precise than blindly allowing all vite-plus-core
  // versions via ^0 or adding them manually one by one.
}

function readPackage(pkg) {
  extendViteRange(pkg, "dependencies");
  extendViteRange(pkg, "devDependencies");
  extendViteRange(pkg, "peerDependencies");
  return pkg;
}

function afterAllResolved(lockfile) {
  if (logs.length) {
    console.log("\n[Fix Vite version]\n" + logs.join("\n") + "\n\n");
  }
  return lockfile;
}

module.exports = { hooks: { readPackage, afterAllResolved } };

测试#01

❯ vp install @tailwindcss/vite
VITE+ - The Unified Toolchain for the Web

Progress: resolved 128, reused 60, downloaded 0, added 0

[Fix Vite version]
Loaded from ./node_modules/vite/package.json: 0.1.13 (bundled vite: 8.0.1)
@tailwindcss/vite[devDependencies]: ^8.0.0 || 0.1.13
@tailwindcss/vite[peerDependencies]: ^5.2.0 || ^6 || ^7 || ^8 || 0.1.13
@voidzero-dev/vite-plus-test[peerDependencies]: ^6.0.0 || ^7.0.0 || ^8.0.0-0 || 0.1.13

Packages: +14
++++++++++++++
Progress: resolved 130, reused 62, downloaded 0, added 0, done

dependencies:
+ @tailwindcss/vite 4.2.2

Done in 1.2s using pnpm v10.32.1

tip: Available short aliases: i = install, rm = remove, un = uninstall, up = update, ls = list, ln = link

测试#02

❯ vp install @tailwindcss/[email protected]
VITE+ - The Unified Toolchain for the Web

Progress: resolved 136, reused 57, downloaded 1, added 0

[Fix Vite version]
Loaded from ./node_modules/vite/package.json: 0.1.13 (bundled vite: 8.0.1)
@voidzero-dev/vite-plus-test[peerDependencies]: ^6.0.0 || ^7.0.0 || ^8.0.0-0 || 0.1.13

Packages: +7 -5
+++++++-----
Progress: resolved 142, reused 63, downloaded 1, added 7, done
 WARN  Issues with peer dependencies found
.
└─┬ @tailwindcss/vite 4.1.18
  └── ✕ unmet peer vite@"^5.2.0 || ^6 || ^7": found 0.1.13

dependencies:
- @tailwindcss/vite 4.2.2
+ @tailwindcss/vite 4.1.18 (4.2.2 is available)

Done in 1.4s using pnpm v10.32.1

tip: Available short aliases: i = install, rm = remove, un = uninstall, up = update, ls = list, ln = link

从测试1(使用 @tailwindcss/[email protected] 支持Vite 8的情况)可以看出,在一切正常时不会出现警告。

从测试2(使用不支持Vite 8的 @tailwindcss/[email protected] 的情况)可以看出,如果Vite版本确实不兼容,警告也只会在相关情况下保留。

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章