当Vite+将 vite别名为 @voidzero-dev/vite-plus-core时,pnpm会提示对等依赖版本不正确的警告
我创建了一个测试用的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导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。