10 月 7 号,尤雨溪的 VoidZero 正式发布了 Vite+ 1.0。发布会当天全网都在转公告,一周过去了,我决定不聊发布会,直接把全流程跑一遍------从装 CLI 到建项目、dev、build、lint、test,一条龙。
先说结论:一个 vp 命令,把 Node 运行时、包管理器和整套前端工具链全管起来了。惊喜是真的,坑也是真的,其中一个还挺离谱。
它到底统一了什么
以前开一个前端项目,你要:装 Node、选包管理器、配 Vite、配 ESLint、配 Prettier、配 Vitest......每个都要单独装一遍、对一遍版本。Vite+ 的目标就是把这些全收进一个 CLI。
vp 的核心命令长这样:
| 命令 | 干什么 |
|---|---|
| vp create | 从模板建项目 |
| vp migrate | 把现有项目迁到 Vite+ |
| vp dev / build / preview | 开发、构建、预览 |
| vp lint / fmt / check | Oxlint 检查、Oxfmt 格式化、全家桶体检 |
| vp test | 跑 Vitest |
| vp install | 装依赖 |
| vp toolchain | 看整套工具链版本关系 |
模板除了内置的四类(application / library / monorepo / generator),还直接代理了 create-vite、create-next-app、create-nuxt、sv create、@tanstack/start 这些官方脚手架,甚至支持任意 npm 包或 git 仓库当模板。
我建项目时 vp toolchain 输出的实际版本:
- vite 8.3.4(注意,是 Vite 8)
- rolldown 1.2.13(Rust 写的打包器,Rollup 的替代)
- vitest 5.0.4
- oxlint 1.88.0 + oxfmt 0.73.0
- tsdown 0.23.1
ESLint、Prettier、Rollup 一个都没出现,全被 Rust 系的替代品接管了。
真实数字
我的环境:MacBook arm64,npm 走的国内镜像。全程计时:
| 步骤 | 结果 | 耗时 |
|---|---|---|
| npm install vite-plus | 84 个包 | 37.5s |
| vp create 建项目+装依赖 | 脚手架+依赖完成 | 22.5s |
| vp build(生产构建) | 9 个模块 | 229ms |
| vp fmt(格式化) | 8 个文件 / 10 线程 | 583ms |
| vp dev 启动 | 5174 端口就绪 | 4 秒内 |
build 229ms 是模板项目(9 个模块)的成绩,真实大项目没这个数,但这个量级还是能说明 Rolldown 的底子。
三个惊喜
1. Node 都不用自己装了。
vp create 跑到一半我注意到一行输出:Node 24.14.1 npm 11.14.1。我本机明明是 Node 24.18.0------vp 自己下载了一套运行时在用,跟本机的互不干扰。
生成的 package.json 里有一段:
json
"devEngines": {
"packageManager": {
"name": "npm",
"version": "11.14.1",
"onFail": "download"
}
}
onFail: "download"------运行时不对,自动下载对的。团队里「我这 Node 版本跟你不一样跑不起来」这个经典扯皮场景,被从工具层面干掉了。
2. AGENTS.md 默认生成。
建完项目,目录里直接躺着一个 AGENTS.md,内容是教 AI 编程工具怎么用这个项目:vp 的内置命令和 scripts 的区别、提交前要跑 vp check 和 vp test、出问题跑 vp env doctor。
现在大家用 Claude Code、Cursor 这类工具写码,第一件事就是喂项目说明书。Vite+ 把这一步做成了默认行为,这个嗅觉是真的准。
3. devDependencies 只剩 3 个。
json
"devDependencies": {
"typescript": "~6.0.2",
"vite": "npm:@voidzero-dev/vite-plus-core@1.2.0",
"vite-plus": "1.2.0"
}
没有 eslint、没有 prettier、没有 vitest------lint/format/test 全部内置在 vite-plus 里。项目依赖清单肉眼可见地瘦了。
四个坑
真上手就会发现,1.x 阶段的毛边还不少。
坑 1:npx vp 会装到别人的包。
npm 上有个跟它无关的包就叫 vp。你在项目外跑 npx vp,npm 装的是那个同名包,跑起来直接被拒:提示你 npx vp 不是正确用法,去看官方安装文档。名字撞了这事 vp 自己也知道,但第一次撞上还是懵的。
坑 2:局部安装跑不了 create。
我图干净没装全局,用 node_modules/.bin/vp create 建项目,直接报错 spawn vp ENOENT。原因是 create 过程内部会 spawn vp install,这个子进程默认去全局 PATH 里找 vp------局部安装找不到自己。
解法是把 node_modules/.bin 塞进 PATH 再跑。也理解了官方为什么主推 curl 脚本全局安装了。
坑 3:lint 直接翻车。
vp lint 报错,tsgolint 的二进制(@oxlint-tsgolint/darwin-arm64)一启动就被系统 SIGKILL,exit 137,vp lint 和 vp check 全军覆没。
我排查了一圈:不是 macOS 的 quarantine 拦截(xattr 里只有 provenance),单独跑二进制同样 137。也就是说 1.2.0 的 darwin-arm64 版 tsgolint 在我这台 Mac 上就是起不来。lint 这条腿目前是瘸的,只能等官方修。
坑 4:--directory 不认 ..。
想建到上级目录,--directory ../vp-app 直接报「contains ".." which is not allowed」。只能先 cd 到目标位置再建子目录,小但烦。
一个值得吵的点
回头看你会发现 package.json 里那行有点扎眼:
json
"vite": "npm:@voidzero-dev/vite-plus-core@1.2.0"
你项目里的 vite,已经不是社区版的 vite 了,是 VoidZero 定制核心的 alias,还配了 overrides 强制锁死。build 走的是 vp 内置的 Rolldown,不是你 package.json 里能直接看到的东西。
这就是全家桶的另一面:命令统一了,黑盒也变多了。出问题时你要去翻 vite-plus 的文档而不是 Vite 文档;想换掉其中一件(比如不想要 Oxlint 想用 ESLint),成本比以前高。
我的判断:side project 和新项目值得直接上,体验确实干净;生产项目和团队项目再等等,至少等 tsgolint 这类稳定性问题修掉。
迁移决策速查
| 你的情况 | 建议 |
|---|---|
| 新 side project | 直接上,成本低收益明显 |
| 新团队项目 | 等一等,盯 tsgolint 等 darwin 稳定性问题 |
| 老项目(Vite 7 及以下) | 用 vp migrate 先试跑,别急着切 |
| 重度 ESLint 插件依赖 | 暂缓,Oxlint 插件生态还在补课 |
装法一句话:官方脚本 curl -fsSL https://vite.plus | bash 装全局;不想要全局就 npm 装 vite-plus 然后把 node_modules/.bin 加进 PATH。
工具链统一这事,方向我认,Rust 化的性能也实打实。但「统一」和「锁定」之间那条线怎么画,Vite+ 还在 1.x 阶段用毛边提醒你它没到稳态。
你打算把手头的项目迁过去吗,还是觉得全家桶就是一种绑架?评论区聊聊。