给到夯!前端工具链新标杆 Vite Plus 初探
一、介绍和安装
1.1 什么是 Vite Plus?
Vite Plus(简称 Vite+) 是由 VoidZero (Vite / Vitest / Rolldown / Oxc 团队,隶属尤雨溪在 2024 年创办的公司) 在 3 月 13 日发布的一款面向 Web 的统一工具链,其具备如下几个核心特性:
-
出色的开发者体验(DX)
从项目创建、脚手架和包管理器的选择,到项目的开发构建、代码的检测与格式化,甚至包括对环境与依赖的管理等,Vite Plus 都提供了可视化的交互和简化的 CLI 指令,让开发者能轻松地搭建和操作自己的项目。我们会在后文(第二节)体验这块流程。
-
告别配置地狱
告别
vitest.config.ts、tsdown.config.ts、.eslintrc、lint-staged.config.js、.oxlintrc.json、.prettierrc等配置文件,所有配置统一归纳到vite.config.ts进行维护即可,可大幅降低开发的心智成本。💡 像
tsconfig.json需要被 IDE 解析、package.json需要被包管理器解析,故这些配置文件依旧需要独立存在。 -
工具链覆盖完整,性能卓越
内置了丰富的、可扩展的工具,包括
Vite、Rolldown、tsdown、Oxlint、Oxfmt、tsgolint、Vitest、ViteTask、VitePress等,涵盖前端工程化的各种功能需求:功能需求 内置工具 开发和构建 web 应用 Vite+Rolldown构建库 tsdown代码检查 (Lint) Oxlint代码格式化 OxfmtTypeScript 类型检查 tsgolint测试 Vitest任务调度 ViteTask文档生成 VitePress其中
Rolldown(内置Oxc)、Oxlint、Oxfmt等都是基于 Rust 开发的,具备极高的性能。以
Rolldown为例,其构建速度可以比Rollup快 10~100 倍。
Vite Plus 目前仍处于 Alpha 阶段,并以 MIT 协议托管在 github.com/voidzero-de… 全量开源。
💡 Vue 3.6 的源码构建也将接入 Vite Plus,参考 PR#14556。
1.2 和 Vite 的区别?
Vite 属于前端构建工具,其服务仅覆盖了「开发 + 构建」,而 Vite Plus 属于前端工具链,其服务完整覆盖了「开发构建 + 检查 + 格式化 + 环境管理 + 任务调度」等前端工作流环节。
Vite Plus 的底层依旧使用了 Vite 来作为面向用户的上层构建工具,因此也可以简单地把 Vite Plus 当做 Vite 的「强化版」。
它们虽然出于同个开发团队,但二者之间并非替代关系。如果你只是想给一个小项目找个打包工具,特别当你已经有一套非常习惯的 ESLint / Prettier 配置,用 Vite 就足够了。
1.3 安装 Vite Plus
macOS 或 Linux 系统可以在终端通过指令来安装 Vite Plus:
curl -fsSL https://vite.plus | bash
Windows 系统的(PowerShell 面板)安装指令则为:
irm https://vite.plus/ps1 | iex
💡 安装过程若出现
SSL_ERROR_SYSCALL的报错,可能需要尝试科学上网或更换节点。
若安装成功,你的系统会新增一个全局的 CLI vp,执行 vp help 会打印出 vp 可用指令列表:
💡 macOS 下若出现
zsh: command not found: vp的报错,可先执行source ~/.zshrc指令来刷新环境变量。
二、核心 vp 指令
完整的 vp 指令请查阅官方指引文档。
2.1 vp create —— 创建项目
执行 vp create 指令可以创建一个新的 Web 项目脚手架,Vite Plus 会逐步让你输入项目名称,并选择项目类型 (Web 应用 / 库 / Monorepo)、包管理器、使用的 Agent 等信息,并自动安装该项目所需的全部依赖:
选择 Agent 的一项会生成对应的「上下文指南(Instructions)」,例如针对
ChatGPT (Codex)会生成AGENTS.md,针对Claude Code会生成CLAUDE.md,针对Cursor会生成.cursor/rules/viteplus.mdc....该文件可以辅助 Agent 学习「如何使用 Vite Plus 来操作这个项目」,你可以点击这里查阅它的完整内容。
以上图创建一个 Web Application 项目为例,Vite Plus 最终会生成如下资源文件:
其树状图为:
/** Web Application 项目文件夹 **/
.
├── .gitignore
├── .vite-hooks
│ └── pre-commit
├── .vscode
│ ├── extensions.json
│ └── settings.json
├── AGENTS.md
├── index.html
├── list.txt
├── package.json
├── pnpm-lock.yaml
├── public
│ ├── favicon.svg
│ └── icons.svg
├── src
│ ├── assets
│ │ ├── hero.png
│ │ ├── typescript.svg
│ │ └── vite.svg
│ ├── counter.ts
│ ├── main.ts
│ └── style.css
├── tsconfig.json
└── vite.config.ts
其中多个工具链的配置都被整合到了 vite.config.ts 中,脱离了 vitest.config.ts、tsdown.config.ts、.eslintrc 等配置文件后的项目资源变得非常「干净整洁」。
我们会在后文(第三节)了解 vite.config.ts 的配置项。
💡 参考 —— 通过 vp create 创建的「库」和「Monorepo」项目的初始化结构
「库」类型项目结构
.
├── .gitignore
├── .vite-hooks
│ └── pre-commit
├── .vscode
│ ├── extensions.json
│ └── settings.json
├── AGENTS.md
├── list.txt
├── package.json
├── pnpm-lock.yaml
├── README.md
├── src
│ └── index.ts
├── tests
│ └── index.test.ts
├── tsconfig.json
└── vite.config.ts
「Monorepo」类型项目结构
.
├── .git
│ ├── config
│ ├── description
│ ├── 略...
│ └── refs
│ ├── heads
│ └── tags
├── .gitignore
├── .vite-hooks
│ ├── _
│ │ ├── commit-msg
│ │ ├── 略...
│ │ ├── pre-rebase
│ │ └── prepare-commit-msg
│ └── pre-commit
├── .vscode
│ ├── extensions.json
│ └── settings.json
├── AGENTS.md
├── apps
│ └── website
│ ├── .gitignore
│ ├── index.html
│ ├── package.json
│ ├── public
│ │ ├── favicon.svg
│ │ └── icons.svg
│ ├── src
│ │ ├── assets
│ │ │ ├── hero.png
│ │ │ ├── typescript.svg
│ │ │ └── vite.svg
│ │ ├── counter.ts
│ │ ├── main.ts
│ │ └── style.css
│ └── tsconfig.json
├── list.txt
├── package.json
├── packages
│ └── utils
│ ├── .gitignore
│ ├── package.json
│ ├── README.md
│ ├── src
│ │ └── index.ts
│ ├── tests
│ │ └── index.test.ts
│ ├── tsconfig.json
│ └── vite.config.ts
├── pnpm-lock.yaml
├── pnpm-workspace.yaml
├── README.md
├── tsconfig.json
└── vite.config.ts
vp create 还支持创建指定技术栈的脚手架,例如执行 vp create react-router,Vite Plus 会自动调用 npx create-react-router 下载 react-router 的项目脚手架:
目前 vp create 所支持创建指定脚手架的指令包括:
vp create 指令 |
实际执行 |
|---|---|
vp create vite |
npx create-vite |
vp create react-router |
npx create-react-router |
vp create vue |
npx create-vue |
vp create nuxt |
npx create-nuxt |
vp create next-app |
npx create-next-app |
vp create svelte |
npx sv |
vp create @tanstack/start |
npx @tanstack/create-start |
vp create nitro |
npx create-nitro-app |
vp create <local-template-path> |
根据指定路径下的本地模板创建脚手架 |
vp create https://github.com/user/template-repo |
下载远程仓库模板创建脚手架 |
2.2 vp dev —— 启动开发环境服务(面向 Web 应用)
Web Application 项目执行 vp dev 指令可以启动开发环境服务(支持热更新):
访问默认的服务地址 localhost:5173 便能访问开发环境页面:
💡
vp dev的底层使用的是 Vite 8 + Rolldown,其中Rolldown内置了 Oxc 这一高效的解析工具 —— 在开发或构建流程中,Rolldown只负责依赖扫描和打包的能力,.ts、.tsx、.jsx等文件的解析编译能力是交由Oxc去实现的。旧版 Vite 所使用的
Rollup缺乏面向长期运行进程的增量构建能力,因此在开发环境需要依赖esbuild来辅助,这是 Vite 8 / Vite Plus 彻底抛弃Rollup和esbuild的原因之一。
2.3 vp build —— 构建应用产物(面向 Web 应用)
Web Application 项目执行 vp build 指令会构建生产环境产物到 dist 文件夹下:
vp build 支持携带 watch 和 sourcemap 参数:
// 构建完成后进程不退出,当项目文件被修改时会触发构建
vp build --watch
// 构建时为 JavaScript、CSS 等资源文件生成 sourcemap
vp build --sourcemap
💡 如 2.2 小节结尾所述,
vp build底层同样使用的是 Vite 8 + Rolldown。
在执行完 vp build 之后,还可以继续执行 vp preview 指令来为构建产物生成可访问的 Web 服务,方便查看构建出来的页面效果:
2.4 vp pack —— 库 / Monorepo 项目的包构建指令
库类型的前端项目执行 vp pack --watch 指令可以启动包构建(产物默认为 .mjs 文件和类型文件 .d.mts),并监听源文件变更:
若无需监听源文件变动(实时触发打包),去掉 --watch 参数即可。
Monorepo 类型的项目本质上也是使用同样的指令来启动构建,不过需要到各模块的目录下(例如 ./packages/utils)去执行。
💡
vp pack底层使用的是专为打包 npm 包设计的 tsdown,它也是一款基于Rolldown的打包工具。
2.5 vp run —— 任务编排与缓存运行器
vp run 是基于 ViteTask 的任务编排与缓存运行器,具备如下能力:
-
执行
package.json中指定的脚本任务:// 执行 package.json 中的 build 脚本。 //(等同于 pnpm run build) vp run build // 遍历项目 pnpm-workspace.yaml 中 `packages` 字段所定义的所有工作区,并执行它们各自 package.json 里的 build 脚本。 //(等同于 pnpm run build -r) vp run build -r -
查找并执行具体包下的具体脚本
// 遍历工作区里所有的 package.json,找出 name 为 website 的包,并执行该包的 dev 脚本任务。 vp run website#dev -
启用任务缓存
Vite Task 具备任务缓存能力,可以大幅节省任务再次执行的耗时,但
vp run默认不会开启这个功能,需要手动带上--cache参数来启用:// 当执行过一次 build 任务后,再次执行该指令时, // 若输入的文件没发生过变化,会从上次的任务缓存中取出产物(来作为这次任务的产物),绕过任务执行的过程。 vp run --cache build
💡 Monorepo 项目中的 vp run 示例
当我们使用 vp create 创建一个 Monorepo 类型的前端项目后,其初始化的 pnpm-workspace.yaml 内容如下:
/** pnpm-workspace.yaml **/
packages: // 工作区声明
- apps/*
- packages/*
// 略...
项目根目录的 package.json 所定义的构建任务如下:
/** package.json **/
{
"scripts": {
"ready": "vp fmt && vp lint && vp run test -r && vp run build -r",
"dev": "vp run website#dev",
// ...
},
// ...
}
因此 ready 最终执行的 vp run build -r 会遍历项目 apps/* 和 packages/* 下的模块,并执行这些模块下各自 package.json 中定义的 build 脚本指令(vp pack)。
而 dev 执行的 vp run website#dev 会遍历项目 apps/* 和 packages/* 下的模块,找到名为 website 的模块(apps/website),并执行该模块 package.json 中定义的 dev 脚本指令(vp dev)。
2.6 vp check —— 代码质量检查
在项目中执行 vp check 会一次性、并行地触发三项代码质量检查任务:
-
基于
Oxlint的代码 Lint 检查Oxlint是由 Rust 开发的,会比ESLint快几十倍甚至上百倍的速度扫描你的代码,找出潜在的逻辑错误、未使用的变量、不安全的语法等。 -
基于
Oxfmt的代码格式化检查Oxfmt同样是基于 Rust 的格式化工具,它会检查你的代码缩进、引号、逗号等是否符合规范。留意
vp check并不会主动修改发现的格式化错误,除非执行vp check --fix,即带上fix参数。 -
基于
tsgolint的 TypeScript 类型检测tsgolint 是基于 Go 语言开发的类型检测工具,它会和
Oxlint互相通讯、一并执行 TypeScript 类型检测任务,整体效率远超缓慢的tsc(Node.js)。
示例
在项目中执行 vp check --fix 效果如下:
2.7 vp staged —— Git 暂存区文件检测
vp staged 是 Vite Plus 内置的 lint-staged 替代品,它会根据 vite.config.ts 中的配置去处理放入了 Git 暂存区(Staged)的文件:
/** vite.config.ts **/
import { defineConfig } from "vite-plus";
export default defineConfig({
staged: {
"*": "vp check --fix", // 检查并修复暂存区文件的代码问题
},
// 略...
});
vp staged 指令的意义主要有两个:
- 当你接手了一个文件众多的老项目时,只需针对提交的文件进行
vp check; - 无需额外配置
.lintstagedrc文件,纳入vite.config.ts里进行统一维护。
留意 vp staged 一般是搭配 Vite Plus 项目自带的 .vite-hooks/pre-commit 钩子来使用的:
Vite Plus 会在用户执行 Git commit 之前自动触发该钩子,因此常规无需手动来执行 vp staged 指令。
2.8 vp test —— 通过 Vitest 执行测试
Vitest 是一款兼容 Jest 的高性能测试框架,而 vp test 是执行 vitest run 的语法糖,它会通过正则(**/*.{test,spec}.?(c|m)[jt]s?(x))自行匹配项目中的测试文件,执行并打印出测试结果:
2.9 vp env —— NodeJS 版本管理
Vite Plus 作为一个全链路工具,其愿景是实现「零配置开箱即用」和「绝对的环境一致性」,因此内置一个类似 nvm 的 NodeJS 管理器会非常必要。
假设团队里的某个项目是基于 NodeJS 22 开发的,假设某位新同学的电脑安装的是 NodeJS 20,那他可能跑不起来这个项目。
理论上传统的前端项目需要在 package.json 中维护一个 engines.node,开发该项目的同学需根据此字段(通过 nvm 之类的管理器)手动切换到对应版本的 NodeJS。但这一步很容易被遗漏,也增添了开发者的心智负担。
针对该问题,Vite Plus 内置了自己的、基于 Rust 开发的高性能 NodeJS 管理器 vp env,任何人在使用 vp 指令(例如 vp dev)操作项目时,vp env 都会自动去读取 .node-version 或 package.json 里的 engines.node —— 如果你的电脑上没有这个版本,它会自动下载这个版本的 NodeJS,并在隔离的环境中启动它,全程不需要手动干预!
💡 留意在安装 Vite Plus 时若拒绝 Vite Plus 接管 NodeJS 版本,后续希望使用此功能,需执行
vp env setup指令安装垫片(Shims)并重启命令行终端。
以下是 vp env 的常用指令:
/** setup **/
vp env on // 启用 Vite Plus 的 NodeJS 管理器来管理 NodeJS 版本
vp env off // 禁用 Vite Plus 的 NodeJS 管理器,恢复使用系统默认的 NodeJS
/** Manage **/
vp env pin // 锁定当前项目 NodeJS 版本号(会生成一份 .node-version 文件)
vp env unpin // 移除项目的 .node-version 文件
vp env default // 设置或打印全局默认的 NodeJS 版本号
vp env use // 使用指定版本的 NodeJS,例如「vp env use 22」
vp env install // 下载指定版本的 NodeJS
vp env uninstall // 卸载指定版本的 NodeJS
vp env exec // 使用指定版本的 NodeJS 运行命令,例如「vp env exec --node 22.0.0 node my-script.js」
/** Inspect **/
vp env list // 打印本地已安装的全部 NodeJS 版本
vp env list-remote // 获取并打印远程仓库上可安装的所有 NodeJS 版本
vp env doctor // 诊断当前环境配置并打印诊断结果,若 vp env 执行的结果有误,建议执行该指令进行检测
示例
在 IDE 的终端执行 vp env doctor 后提示了 ⚠ GUI applications may not see shell PATH changes 错误:
这是由于在 macOS 中通过应用图标打开 IDE 的话,IDE 便属于 GUI 应用程序 —— GUI 应用程序启动时只会读取 ~/.zshenv 配置(而非 ~/.zshrc)。
然而 ~/.zshenv 中默认不携带 Vite Plus 的环境变量,因此我们需要手动将这块信息添加进去:
echo '. "$HOME/.vite-plus/env"' >> ~/.zshenv
处理后再执行 vp env doctor 会发现该配置问题已被解决:
2.10 vp migrate —— 迁移现有项目到 Vite Plus
如果想将现有的前端项目迁移至 Vite Plus,可以在项目下执行 vp migrate 指令:
留意在迁移成功后,Vite Plus 会移除所有可并入 vite.config.ts 的工具配置文件(如 eslint.config.js)。
💡 目前
vp migrate仅支持迁移版本号大于等于7.0.0的 Vite 项目,非 Vite 或者非 NodeJS 运行时(例如 Bun)的项目在迁移过程可能会出错。
三、vite.config.ts 配置
我们在前文有提到,通过 Vite Plus 创建的项目不再需要 vitest.config.ts、.eslintrc、.oxlintrc.json、.prettierrc 等配置文件,而是统一在 vite.config.ts 文件中维护所有工具的配置,这种化繁为简的能力是 Vite Plus 的一大优势。
vite.config.ts 文件的可配置项参考如下:
import { defineConfig } from 'vite-plus';
import legacy from '@vitejs/plugin-legacy';
export default defineConfig({
// dev 场景的服务配置
server: {
origin: 'http://127.0.0.1:8080', // 修改静态资源(assets)的域名
},
// build 场景的服务配置
build: {
emitAssets: false, // 构建时不要生成静态资源(assets)
},
// preview 场景的服务配置
preview: {
port: 8080, // preview 服务端口号定为 8080
},
// 插件
plugins: [
legacy({
targets: ['defaults', 'not IE 11'],
}),
],
// Vitest 配置
test: {
include: ['src/**/*.test.ts'],
},
// Oxlint 配置
lint: {
ignorePatterns: ['dist/**'],
},
// Oxfmt 配置
fmt: {
semi: true,
singleQuote: true,
},
// ViteTask 配置
run: {
tasks: { // 定义一个 generate:icons 任务,后续可以通过「vp run generate:icons」来执行
'generate:icons': {
command: 'node scripts/generate-icons.js',
envs: ['ICON_THEME'], // 声明这个任务依赖这个环境变量,如果环境变量变了,缓存失效
},
},
},
// `vp staged` 配置
staged: {
'*': 'vp check --fix', // 匹配所有的文件,执行代码检查并自动修复格式
// '*.css': 'stylelint --fix' // 针对特定后缀执行特定命令
},
});
各项的详细配置可参考官方文档:
| 配置项 | 说明 | 文档地址 |
|---|---|---|
| server |
vp dev 场景的服务配置(与 Vite 的配置一致) |
vite.dev/config/serv… |
| build |
vp build 场景的服务配置(与 Vite 的配置一致) |
vite.dev/config/buil… |
| preview |
vp preview 场景的服务配置(与 Vite 的配置一致) |
vite.dev/config/prev… |
| plugins | 插件(与 Vite 的配置一致) | vite.dev/guide/using… |
| test |
Vitest 配置 |
viteplus.dev/config/test |
| lint |
Oxlint 配置 |
viteplus.dev/config/lint |
| fmt |
Oxfmt 配置 |
viteplus.dev/config/fmt |
| run |
ViteTask 配置 |
viteplus.dev/config/run |
| staged |
vp staged 配置 |
viteplus.dev/config/stag… |
四、小结
Vite Plus 有效地解决了前端工程化中严重的「决策疲劳」和「工具碎片化」问题、大幅简化了日常开发,并提供了舒适的开发者体验和基于 Rust 的卓越性能。
对于笔者而言,Vite Plus 无疑定义了未来前端工具链的标杆形象。
目前 Vite Plus 仍处于 Alpha 阶段,会存在一些待优化的问题,因此暂时不建议将其接入到重要的项目中去(特别是需要通过 vp migrate 迁移的项目)。
如果你也对 Vite Plus 产生兴趣,可以点击下方的 FYI 链接获取更多资讯。