Vite 快速上手指南:从脚手架、开发服务器到 CLI 的完整实践
本文基于 Vite 官方入门文档(docs/guide/index.md)编写,系统讲解 Vite 的核心构成、浏览器支持策略、项目创建方式(create-vite 脚手架与手动安装)、index.html 作为入口的根目录模型,以及 dev / build / preview 三大 CLI 命令的使用细节。读完本文,你将能够独立创建、运行并定制一个 Vite 项目,理解开发服务器为何以 index.html 为应用入口,并知道如何验证 CLI 参数与安装脚本行为(仓库内配套有针对 create-vite 与 CLI 的自动化测试)。
一、Vite 是什么:开发服务器 + 构建命令
Vite(法语中"快"的意思,发音接近 "veet")是一个构建工具,目标是为现代 Web 项目提供更快速、更精简的开发体验。它由两个主要部分组成:
- 开发服务器(Dev Server):基于原生 ES 模块提供丰富的功能增强,例如极快的热模块替换(HMR,Hot Module Replacement)。更多特性见 Features Guide。
- 构建命令(Build Command):使用 Rolldown 对你的代码进行打包,并预先配置好以输出高度优化的生产环境静态资源。
Vite 是"有主见的"(opinionated),开箱即用地提供合理的默认值。对框架的支持、与工具的集成通过插件实现(参见 Using Plugins);当需要让 Vite 适配项目时,可通过配置章节进行定制。
此外,Vite 通过 Plugin API 和 JavaScript API 高度可扩展,并提供完整的 TypeScript 类型支持。关于项目背后的设计思路,可参阅 Why Vite。
从源码结构看,vite 包本身是一个 Native-ESM 的构建工具(packages/vite/package.json 中 description 为 "Native-ESM powered web dev build tool",当前版本 8.2.2),bin/vite.js 暴露了 vite 可执行入口,导出的子路径还包括 ./client、./module-runner、./internal 等。
二、浏览器支持策略
开发环境:Vite 假设使用现代浏览器,即浏览器支持绝大多数最新的 JavaScript 与 CSS 特性。为此 Vite 将语法转换目标设为 esnext,避免语法降级,让 Vite 以尽可能接近原始源码的形态提供模块。Vite 会注入一些运行时代码以使开发服务器工作,这些代码只使用各主版本发布时(当前主版本为 2026-01-01)处于 Baseline "Newly Available" 状态的浏览器特性。
生产构建:默认目标是各主版本发布时固定的 Baseline "Widely Available" 浏览器版本。当前主版本对应约 2023 年中发布的浏览器版本。该目标可以通过配置降低;如需支持更老的遗留浏览器,可以使用官方的 @vitejs/plugin-legacy 插件(源码就在本仓库 packages/plugin-legacy 中)。更多细节见 Building for Production。
三、在线试用 Vite
你可以在 StackBlitz(vite.new/)上在线试用 Vite:它直接在浏览器中运行基于 Vite 的构建环境,与本地环境几乎一致,且无需在机器上安装任何东西。访问 vite.new/{template} 可以选择要使用的框架。
支持的模板预设(JavaScript / TypeScript 双列):
| JavaScript | TypeScript |
|---|---|
| vanilla | vanilla-ts |
| vue | vue-ts |
| react | react-ts |
| preact | preact-ts |
| lit | lit-ts |
| svelte | svelte-ts |
| solid | solid-ts |
| qwik | qwik-ts |
这些模板在仓库中真实存在,例如 packages/create-vite/template-vanilla、packages/create-vite/template-react 等,可以逐一查看模板的完整文件构成。
四、使用 create-vite 脚手架创建第一个项目
按包管理器选择对应的脚手架命令:
# npm
npm create vite@latest
# Yarn
yarn create vite
# pnpm
pnpm create vite
# Bun
bun create vite
# Deno
deno init --npm vite
然后按提示操作即可。
Node.js 版本要求:Vite 要求 Node.js 20.19+ 或 22.12+。这一点在仓库中得到直接印证——packages/vite/package.json 与 packages/create-vite/package.json 中的 engines 字段均为:
{
"engines": {
"node": "^20.19.0 || >=22.12.0"
}
}
部分模板可能需要更高的 Node.js 版本才能工作,若包管理器给出警告请升级 Node.js。
4.1 通过命令行选项直接指定模板
也可以在脚手架命令中直接指定项目名与模板。例如创建一个 Vite + Vue 项目:
# npm(npm 7+ 需要额外的双连字符)
npm create vite@latest my-vue-app -- --template vue
# Yarn
yarn create vite my-vue-app --template vue
# pnpm
pnpm create vite my-vue-app --template vue
# Bun
bun create vite my-vue-app --template vue
# Deno
deno init --npm vite my-vue-app --template vue
关于各模板的更多细节见 create-vite。当前支持的模板包括:vanilla、vanilla-ts、vue、vue-ts、react、react-compiler、react-ts、react-compiler-ts、preact、preact-ts、lit、lit-ts、svelte、svelte-ts、solid、solid-ts、qwik、qwik-ts。
几个实用技巧(均可在 packages/create-vite/src/index.ts 的 helpMessage 与参数解析逻辑中得到验证):
- 项目名使用
.表示在当前目录创建; - 使用
--no-interactive标志跳过所有交互提示,适合脚本化场景(源码中非交互模式下默认模板为vanilla-ts); - 其他支持的选项包括:
-t, --template指定模板、-i, --immediate / --no-immediate创建后立即安装依赖并启动开发服务器、--overwrite在目标目录非空时删除已有文件、--eslint / --no-eslint在 React 模板中使用 ESLint 代替 Oxlint(仅对 React 模板有效)。
从源码结构看,init() 函数(packages/create-vite/src/index.ts)的执行流程为:解析项目名与目标目录 → 处理目标目录非空的情况(yes/no/ignore 三种选择)→ 校验包名 → 选择框架与变体(FRAMEWORKS 数组同时内置了 Vue/React/Svelte 等官方生态的"自定义命令"变体,如 Nuxt、SvelteKit 等,会以 customCommand 方式转交外部脚手架)→ 复制 template-${template} 目录下的文件并替换 index.html 的 <title> 与 package.json 的 name → 可选地执行立即安装(install() + start())。值得一提的是,源码还会通过 @vercel/detect-agent 检测 AI Agent 环境,并在 Agent 中提示使用 create-vite <DIRECTORY> --no-interactive --template <TEMPLATE> 一次性完成创建。
仓库内还有针对脚手架的端到端测试:packages/create-vite/tests,测试中通过 _VITE_TEST_CLI 环境变量跳过真实的依赖安装步骤,验证脚手架落盘行为。
4.2 社区模板
create-vite 是针对主流框架的官方基础模板工具。若需要其他工具或框架的模板,可以查阅 Awesome Vite 中社区维护的模板列表;也可以使用 tiged 等工具从任意仓库拉取模板:
npx tiged user/project my-project
cd my-project
npm install
npm run dev
(假定项目默认分支为 main。)
五、手动安装 Vite
如果不想用脚手架,可以在现有项目中手动安装 vite CLI:
# npm
npm install -D vite
# Yarn
yarn add -D vite
# pnpm
pnpm add -D vite
# Bun
bun add -D vite
# Deno
deno add -D npm:vite
然后在项目根目录创建一个 index.html:
<p>Hello Vite!</p>
在终端运行对应的 CLI 命令:
# npm
npx vite
# Yarn
yarn vite
# pnpm
pnpm vite
# Bun
bunx vite
# Deno
deno run -A npm:vite
index.html 将服务于 http://localhost:5173。
六、index.html 与项目根目录
你可能已经注意到,在 Vite 项目中 index.html 是"前台中心化"的,而不是藏在 public 目录里。这是有意为之:开发阶段 Vite 本质上是一个服务器,index.html 就是你的应用入口。
具体而言:
- Vite 把
index.html当作源码和模块图的一部分。它会解析其中引用你 JS 源码的<script type="module" src="...">;内联的<script type="module">以及通过<link href>引用的 CSS 同样享受 Vite 的特性; index.html中的 URL 会被自动重定基(rebased),因此不需要%PUBLIC_URL%之类的特殊占位符。
官方模板中的入口写法可以参见 packages/create-vite/template-vanilla/index.html:
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Vite + JS</title>
</head>
<body>
<div id="app"></div>
<script type="module" src="/src/main.js"></script>
</body>
</html>
与静态 HTTP 服务器类似,Vite 有"根目录(root directory)"的概念——你的文件都从该目录提供,后续文档中会写作 <root>。源码中的绝对 URL 以项目根为基准解析,因此你可以像操作普通静态文件服务器一样编写代码(而实际能力远强于静态服务器)。Vite 还能处理解析到根目录之外文件系统位置的依赖,这让它在 monorepo 场景下同样可用。
Vite 还支持多页面应用(MPA),允许多个 .html 作为入口,详见 Building for Production 的 Multi-Page App 小节。
指定替代根目录
运行 vite 时默认以当前工作目录为根。可以用 vite serve some/sub/dir 指定替代根目录。注意 Vite 还会在项目根中解析配置文件(即 vite.config.js),因此改变根目录时需要相应移动配置文件(见配置章节)。
从 CLI 源码看(packages/vite/src/node/cli.ts),默认命令正是带 [root] 位置参数的 vite [root](别名 serve),build [root] 与 preview [root] 也接受同样的位置参数,这与文档描述一一对应。
七、命令行接口(CLI)
在安装了 Vite 的项目中,你可以在 npm scripts 里使用 vite 二进制,或直接以 npx vite 运行。脚手架生成的项目默认 npm scripts 如下:
{
"scripts": {
"dev": "vite", // 启动开发服务器,别名:`vite dev`、`vite serve`
"build": "vite build", // 生产构建
"preview": "vite preview" // 本地预览生产构建
}
}
可以附加 --port、--open 等 CLI 选项;完整列表可在项目内运行 npx vite --help 查看。
从 packages/vite/src/node/cli.ts 中可以确认三大命令的完整选项集:
- 全局选项(对所有子命令生效):
-c, --config <file>指定配置文件、--base <path>公共基础路径(默认/)、-l, --logLevel <level>(info | warn | error | silent)、--clearScreen控制日志清屏、-d, --debug [feat]与-f, --filter <filter>调试日志、-m, --mode <mode>设置环境模式等; vite [root](serve):--host [host]指定主机名、--port <port>指定端口、--open [path]启动时打开浏览器、--cors启用 CORS、--strictPort端口被占用时退出;vite build [root]:--outDir <dir>输出目录(默认dist)、--manifest [name]输出构建清单 JSON、--ssrManifest [name]输出 SSR 清单、-w, --watch文件变化时重建等;vite preview [root]:本地预览生产构建产物。
完整 CLI 文档见 Command Line Interface。
八、使用未发布的 Vite 提交
如果等不及新发布而想测试最新功能,有两种方式:
方式一:按 commit 安装。将 SHA 替换为 Vite 主分支的任意 commit SHA(注意:仅最近一个月内产生的 commit 安装可用,更早的会被清理):
# npm
npm install -D https://pkg.pr.new/vite@SHA
# Yarn
yarn add -D https://pkg.pr.new/vite@SHA
# pnpm
pnpm add -D https://pkg.pr.new/vite@SHA
# Bun
bun add -D https://pkg.pr.new/vite@SHA
方式二:本地克隆构建并链接(需要 pnpm):
git clone https://github.com/vitejs/vite.git
cd vite
pnpm install
cd packages/vite
pnpm run build
pnpm link # 此步可用你偏好的包管理器
然后到你的 Vite 项目中运行 pnpm link vite(或你用于全局链接 vite 的包管理器对应命令),重启开发服务器即可。
关于 Vite 的发布节奏与流程,见 Releases 文档。
提示:若要替换依赖间接(transitively)使用的 Vite 版本,应使用 npm 的 overrides 或 pnpm 的 overrides 配置。
九、延伸阅读与社区资源
- 功能总览:Features Guide(含 HMR 原理);
- 插件用法:Using Plugins、Plugin API;
- 编程式调用:JavaScript API;
- 项目配置:Config 章节;
- 设计理念:Why Vite;
- 设计初衷追问:想了解"为什么需要 Vite",回到 docs/guide/why.md 阅读其论证。
如果你有疑问或需要帮助,可以通过 Discord 与 GitHub Discussions 联系 Vite 社区。仓库内的 CONTRIBUTING.md 则面向希望参与开发的贡献者。
十、小结
| 场景 | 命令 / 方式 |
|---|---|
| 交互式创建项目 | npm create vite@latest 后跟随提示 |
| 非交互式创建项目 | npm create vite@latest my-app -- --template vue(npm 7+ 需双连字符) |
| 手动安装并启动 | npm install -D vite && npx vite,index.html 位于 http://localhost:5173 |
| 指定根目录 | vite serve some/sub/dir |
| 生产构建 / 预览 | vite build / vite preview |
| 查看全部选项 | npx vite --help |
Vite 的核心心智模型可以浓缩为三句话:开发时它是模块服务器,index.html 是入口而非产物;生产时它是 Rolldown 打包管线,输出高度优化的静态资源;一切定制通过配置与插件完成。结合本文的命令与仓库中的源码路径,你可以快速完成从建项、开发到构建预览的完整闭环。
atomcodeClaude Code 的开源替代方案。连接任意大模型,编辑代码,运行命令,自动验证 — 全自动执行。用 Rust 构建,极致性能。 | An open-source alternative to Claude Code. Connect any LLM, edit code, run commands, and verify changes — autonomously. Built in Rust for speed. Get StartedRust0622
Hy4-previewHy4 preview 是由腾讯混元团队研发的新一代混合专家(MoE)旗舰模型。模型总参数量 770B,每个 token 激活 49B,主干共包含78层,第一层采用标准 FFN,其余 77 层均为 MoE 结构,每层包含 256 个路由专家与 1 个共享专家,每个 token 激活 top-8 路由专家及共享专家。主干之外原生内置 1 层 MTP(总参数量 10B,激活 0.7B)以支持投机解码。Python00
GLM-5.3GLM-5.3 与 GLM-5.2 使用相同的基座模型——所有提升均来自后训练。与 GLM-5.2 相比,它在复杂编程和长程任务上的表现显著提升。Jinja00
GLM-5.3-FlashGLM-5.3-Flash (320B-A18B),是GLM-5系列的首个原生多模态模型。320B总参数,能力超过GLM-5.2Jinja00
Spark-X2.5-4BSpark-X2.5-4B 旨在让强大的 AI 更实用、更高效、更易获得。在广泛日常任务中表现强劲,涵盖对话、写作、翻译、推理、编码、工具调用以及智能体工作流,并在同等规模的开源模型中取得领先成绩。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00
Spark-X2.5-1.7BSpark-X2.5-1.7B 旨在让强大的 AI 更加实用、高效且易于获取。这些模型在广泛的日常任务中表现出色,涵盖对话、写作、翻译、推理、编程、工具调用和智能体工作流,并在同等规模的开源模型中取得领先结果。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00