跳到主要内容

Vite 介绍

什么是 Vite?

Vite(法语意为"快速的",发音 /viːt/,类似"veet")是新一代前端构建工具,专注于为现代 Web 项目提供极速的开发体验。它的名字恰如其分地体现了核心理念:让前端开发更快、更简洁。

Vite 由两个核心部分组成:

  • 开发服务器:基于原生 ES 模块,提供即时启动和极快的热模块替换(HMR)
  • 构建命令:使用 Rolldown 进行生产打包,输出高度优化的静态资源

传统构建工具的困境

在理解 Vite 的创新之处前,我们需要了解传统打包工具面临的问题。以 Webpack 为代表的打包器采用"先打包后服务"的模式:启动时,它们需要遍历整个应用的依赖图,将所有模块打包成 bundle,然后才能启动开发服务器。

为什么需要打包?

你可能会问,为什么传统工具要先打包?这与浏览器的历史发展有关。在 ES 模块成为标准之前,浏览器没有原生的模块系统。JavaScript 只能通过 <script> 标签加载,而大量小文件会导致:

  • 每个 HTTP 请求都有开销(建立连接、发送请求、等待响应)
  • 浏览器对同一域名的并发请求数有限制(通常是 6 个)
  • 代码之间的依赖关系需要手动管理(比如使用 RequireJS 或 Browserify)

打包工具的出现解决了这些问题:它将所有模块合并为少数几个文件,减少了网络请求,同时自动处理依赖关系。

打包模式的代价

这种模式在小型项目中问题不大,但随着项目规模增长:

  • 冷启动慢:大型项目的启动可能需要几十秒甚至数分钟,开发者只能盯着进度条等待。这是因为打包器需要完整遍历整个依赖图,即使你只修改了一个文件,启动时也要处理所有文件。
  • 热更新慢:每次修改代码,打包器需要重新分析依赖关系、重新打包受影响的模块,即使在 HMR 模式下也可能需要数秒。更新的粒度是 chunk 级别,而不是模块级别。
  • 构建速度慢:生产环境的打包过程耗时漫长,严重影响持续集成的效率。大型项目可能需要 5-10 分钟甚至更长。

这些问题的根源在于:打包器在启动时做了太多不必要的工作。当你只修改了一个组件时,为什么要重新处理整个应用的依赖?这就像你只想读一本书的一页,但图书馆要求你必须先把整个书架的书都翻一遍。

Vite 的解决方案

Vite 采用完全不同的策略:开发时不打包,按需编译

利用浏览器原生 ESM

现代浏览器已经原生支持 ES 模块(ESM),这意味着浏览器可以自己处理模块之间的依赖关系。Vite 充分利用了这一特性:

  1. 即时启动:Vite 启动时只需要加载一个 HTML 文件和入口模块,其他模块按需加载,冷启动几乎是瞬时的
  2. 按需编译:只有当浏览器请求某个模块时,Vite 才会编译它。你修改了哪个文件,就只重新编译那个文件
  3. 精确 HMR:模块更新是精确到文件级别的,更新速度不受项目大小影响
传统打包工具:
启动 → 扫描所有文件 → 构建依赖图 → 打包所有模块 → 启动服务器
(可能需要数分钟)

Vite:
启动 → 直接启动服务器 → 浏览器请求模块 → 按需编译返回
(几乎即时)

依赖预构建

虽然 Vite 不打包你的源代码,但它会对第三方依赖进行预构建。这是必要的优化步骤:

兼容性需求:npm 生态中有大量包仍然以 CommonJS 或 UMD 格式发布,而 Vite 的开发服务器只服务 ESM。预构建会将这些依赖转换为 ESM 格式,让你可以无缝使用 npm 生态。

性能优化:某些包(如 lodash-es)包含数百个内部模块。如果不预构建,浏览器会发起数百个 HTTP 请求。Vite 将它们合并为单个模块,大幅减少请求数量。

预构建使用 esbuild,这是一个用 Go 编写的高性能打包器,比传统 JavaScript 打包器快 10-100 倍。预构建结果会被缓存,只在依赖变化时重新执行。

生产环境打包

虽然开发时不打包,但生产环境仍然需要打包。原因如下:

  • 代码分割:将代码拆分为多个 chunk,实现按需加载
  • Tree-shaking:移除未使用的代码,减小包体积
  • 压缩优化:压缩代码、优化资源,提升加载性能

Vite 使用 Rolldown 进行生产构建。Rolldown 是用 Rust 编写的高性能打包器,是 Rollup 的 Rust 移植版本,继承了 Rollup 的优秀设计和灵活的插件 API,同时提供了更好的性能。

Vite 8 统一打包器架构

Vite 8 采用 Rolldown 作为单一统一的打包器,这是自 Vite 2 以来最重要的架构变化。在此之前,Vite 采用双打包器架构:esbuild 负责开发环境的快速编译,Rollup 负责生产环境的打包优化。

双打包器架构虽然服务了 Vite 多年,但也带来了一些问题:两套转换管道意味着两套插件系统,需要大量胶水代码保持同步,模块处理的不一致问题随时间积累。

Rolldown 的设计目标是解决这些问题:

极致性能:Rolldown 用 Rust 编写,运行速度接近原生。在基准测试中,它的速度比 Rollup 快 10-30 倍,与 esbuild 的性能水平相当。

完全兼容:Rolldown 支持与 Rollup 和 Vite 相同的插件 API。大多数现有的 Vite 插件在 Vite 8 中开箱即用。

高级特性:统一的打包器解锁了双打包器架构难以实现的功能,包括完整的打包模式、更灵活的代码分割、模块级持久缓存和 Module Federation 支持。

Vite 8 工具链

Vite 8 构建了一个端到端的工具链,各组件紧密协作:

  • Rolldown:统一的打包器,负责依赖预构建和生产打包
  • Oxc:编译器工具链,用于 JavaScript 解析、转换和压缩
  • Lightning CSS:CSS 处理和压缩

这套工具链带来了显著的性能提升。实际案例显示:

  • Linear:生产构建时间从 46 秒降至 6 秒
  • Ramp:构建时间减少 57%
  • Mercedes-Benz.io:构建时间减少最多 38%
  • Beehiiv:构建时间减少 64%

Vite 背后的团队

Vite 由 VoidZero 团队主导开发,与 Bolt 和 NuxtLabs 合作。VoidZero 是一家专注于 JavaScript 工具链的公司,致力于打造更快、更统一的开发体验。

Vite 的成功离不开开源社区的贡献。截至目前,Vite Core 已有超过 1200 位贡献者,每周下载量达到 6500 万次。Vite 的生态系统也在持续增长,插件和框架的支持日益丰富。

为了帮助开发者更好地导航日益增长的插件生态,Vite 团队推出了 registry.vite.dev,这是一个可搜索的插件目录,每日从 npm 收集 Vite、Rolldown 和 Rollup 的插件数据。

感谢 Rollup 和 esbuild

在 Vite 迁移到 Rolldown 之际,我们需要向这两个项目表达深深的感谢,正是它们让 Vite 成为可能。

Rollup 从一开始就是 Vite 的生产环境打包器。它优雅的插件 API 设计如此完善,以至于 Rolldown 直接采用了它作为自己的 API 标准。Vite 整个插件生态的存在都建立在 Rollup 奠定的基础之上。感谢 Rich Harris 创建了 Rollup,感谢 Lukas Taegert-Atkinson 和 Rollup 团队的维护和演进。

esbuild 从早期就为 Vite 提供了极快的开发体验:依赖预构建、TypeScript 和 JSX 转换在毫秒内完成,而不是数百毫秒。esbuild 证明了构建工具可以快上几个数量级,它的速度树立了标准,启发了整整一代 Rust 和 Go 语言工具的出现。感谢 Evan Wallace 向我们展示了什么是可能的。

没有这两个项目,Vite 不会是今天的样子。即使我们向前迈进,Rollup 和 esbuild 的影响已深深嵌入 Vite 的 DNA 中。

Vite 8 的新特性

除了 Rolldown 统一打包器外,Vite 8 还包含以下重要特性:

统一打包器架构

Vite 8 采用 Rolldown 作为单一统一的打包器,这是自 Vite 2 以来最重要的架构变化。在此之前,Vite 采用双打包器架构:esbuild 负责开发环境的快速编译,Rollup 负责生产环境的打包优化。

双打包器架构虽然服务了 Vite 多年,但也带来了一些问题:两套转换管道意味着两套插件系统,需要大量胶水代码保持同步,模块处理的不一致问题随时间积累。

Rolldown 的设计目标是解决这些问题:

极致性能:Rolldown 用 Rust 编写,运行速度接近原生。在基准测试中,它的速度比 Rollup 快 10-30 倍,与 esbuild 的性能水平相当。

完全兼容:Rolldown 支持与 Rollup 和 Vite 相同的插件 API。大多数现有的 Vite 插件在 Vite 8 中开箱即用。

高级特性:统一的打包器解锁了双打包器架构难以实现的功能,包括完整的打包模式、更灵活的代码分割、模块级持久缓存和 Module Federation 支持。

集成 Devtools

Vite 8 内置了开发者工具选项,可通过配置启用:

export default defineConfig({
devtools: true,
})

Devtools 提供了调试和分析 Vite 项目的深度洞察,直接在开发服务器中访问,包括:

  • 模块依赖关系可视化
  • 构建性能分析
  • 配置检查
  • 插件执行追踪

浏览器控制台转发

Vite 8 可以将浏览器控制台日志和错误转发到开发服务器终端。这在处理编码代理时特别有用,因为运行时客户端错误在 CLI 输出中可见:

export default defineConfig({
server: {
forwardConsole: true,
},
})

当检测到编码代理时,此功能会自动激活。

Wasm SSR 支持

.wasm?init 导入现在在 SSR 环境中原生可用,扩展了 Vite 的 WebAssembly 功能到服务端渲染场景。之前需要手动处理 URL 和文件读取,现在可以直接使用:

// Vite 8: SSR 环境中直接使用
import init from './example.wasm?init'

export async function render() {
const instance = await init()
return instance.exports.main()
}

@vitejs/plugin-react v6

随 Vite 8 一起发布,React 插件 v6 使用 Oxc 进行 React Refresh 转换。Babel 不再是依赖项,安装体积更小。对于需要 React Compiler 的项目,v6 提供了 reactCompilerPreset 辅助函数。

TypeScript paths 自动解析

Vite 8 提供内置的 TypeScript 路径别名解析支持:

export default defineConfig({
resolve: {
tsconfigPaths: true,
},
})

启用后,Vite 会自动读取 tsconfig.json 中的 paths 配置,无需手动在 resolve.alias 中重复配置。

Vite 的核心特性

极速的开发体验

Vite 的性能优势体现在整个开发流程中:

操作Vite传统打包器
冷启动秒级(几乎即时)分钟级(需要打包整个应用)
热更新毫秒级(精确到模块)秒级(需要重新打包)
构建时间快速(Rolldown + 并行处理)较慢(JavaScript 工具链)

这种性能差异的根源在于架构设计的根本不同。传统打包器采用"全量预处理"模式,而 Vite 采用"按需处理"模式。想象一下餐厅的点餐流程:

  • 传统打包器:顾客进门后,餐厅先把菜单上所有菜品都做一遍,然后再问顾客想吃什么。这就是为什么大型项目启动需要等待很久——即使你只需要修改一个组件,打包器也要处理整个应用的所有文件。
  • Vite:顾客点一道菜,厨房才做一道菜。按需处理,即时响应。这就是 Vite 的核心理念——只在需要时才处理文件。

Vite 在开发环境使用 Oxc 处理 TypeScript 和 JSX。Oxc 是用 Rust 编写的高性能工具链,其速度比 Babel 快 20-100 倍,比 esbuild 也更快。

开箱即用的配置

Vite 采用"约定优于配置"的理念,减少配置负担:

  • TypeScript:原生支持,无需配置即可使用 .ts 文件
  • JSX:支持 .jsx.tsx 文件,自动检测 React、Vue、Preact 等框架
  • CSS 预处理器:内置 Sass、Less、Stylus 支持,安装对应依赖即可使用
  • CSS Modules:以 .module.css 结尾的文件自动启用 CSS Modules
  • JSON 导入:支持导入 JSON 文件,并支持具名导入实现 tree-shaking

智能依赖处理

Vite 的依赖处理机制经过精心设计:

  1. 自动发现:扫描源代码,自动发现需要预构建的依赖
  2. 智能缓存:缓存预构建结果,只在 package-lock.json 变化时重新构建
  3. 按需优化:小型的 ESM 依赖可以跳过预构建,直接使用浏览器加载

丰富的插件生态

Vite 的插件系统兼容 Rollup 插件,这意味着:

  • 可以使用大量现有的 Rollup 插件
  • 官方维护的框架插件质量有保证
  • 社区活跃,新功能不断涌现

常用插件包括:

  • @vitejs/plugin-vue:Vue 3 单文件组件支持
  • @vitejs/plugin-react:React Fast Refresh
  • @vitejs/plugin-legacy:支持旧版浏览器
  • vite-plugin-pwa:PWA 支持

浏览器支持

开发环境

Vite 假设使用现代浏览器进行开发,目标是 esnext,让代码尽可能接近源码。Vite 会注入一些运行时代码来支持开发服务器的功能,这些代码使用了当前主版本发布时 Baseline Newly Available 的特性(Vite 6 对应 2026-01-01)。

生产环境

默认针对 Baseline Widely Available 浏览器(至少 2.5 年前发布的浏览器):

浏览器最低版本
Chrome111+
Edge111+
Firefox114+
Safari16.4+

这些浏览器版本对应 Baseline Widely Available 特性集。可以通过 build.target 配置调整目标版本,最低支持 es2015。如需支持更老的浏览器,可以使用 @vitejs/plugin-legacy 插件。

重要提示:即使设置了更低的目标,Vite 仍需要以下最低浏览器支持,因为它依赖于原生 ESM 动态导入和 import.meta

浏览器最低版本
Chrome64+
Firefox67+
Safari11.1+
Edge79+

注意:Vite 默认只处理语法转换,不包含 polyfill。如果需要 polyfill,可以参考 cdnjs.cloudflare.com/polyfill,它会根据用户的浏览器 UserAgent 自动生成 polyfill 包。

旧浏览器支持

使用官方的 @vitejs/plugin-legacy 插件可以支持旧浏览器。该插件会自动生成兼容旧浏览器的代码块和相应的 ES 语言特性 polyfill,这些兼容代码只在不支持原生 ESM 的浏览器中加载。

Vite 与其他工具对比

理解 Vite 与其他构建工具的区别,有助于你做出正确的技术选型。

Vite vs Webpack

Webpack 是最成熟的打包工具,拥有丰富的功能和插件生态。

特性ViteWebpack
开发启动极快(不打包)较慢(需要打包)
HMR 速度极快(模块级)较慢(chunk 级)
配置复杂度简单(开箱即用)复杂(需要大量配置)
生态成熟度快速发展中非常成熟
定制能力良好极强

选择 Vite:新项目、追求开发体验、使用现代技术栈 选择 Webpack:需要特定的 Webpack 插件、复杂的企业级需求

Vite vs Turbopack

Turbopack 是 Vercel 开发的新一代打包工具,使用 Rust 编写,专为 Next.js 优化。

特性ViteTurbopack
框架支持框架无关,支持 Vue/React/Svelte 等主要支持 Next.js
开发模式原生 ESM + 预构建增量打包
成熟度稳定,广泛使用发展中,逐步稳定
社区生态丰富,插件众多较小,Next.js 生态
生产构建Rolldown(Rollup 兼容)Turbopack

选择 Vite:非 Next.js 项目、需要框架灵活性、稳定可靠的工具 选择 Turbopack:使用 Next.js 且需要极致开发性能

Vite vs Parcel

Parcel 以零配置著称,与 Vite 有相似的"开箱即用"理念。

特性ViteParcel
开发模式原生 ESM开发时打包
启动速度更快
社区规模更大较小

选择 Vite:需要更好的生态支持、插件丰富度 选择 Parcel:追求极致的零配置体验

何时选择 Vite?

Vite 适合以下场景:

新项目:Vite 的零配置特性让你可以快速启动项目,无需花费时间在构建配置上。官方模板支持 Vue、React、Svelte、Preact、Lit、Solid、Qwik 等主流框架。

大型项目:当项目规模增长时,传统打包器的启动和热更新会越来越慢。Vite 的性能不受项目大小影响,适合长期维护的大型项目。

现代浏览器环境:如果不需要支持 IE 等旧版浏览器,Vite 是理想的选择。它充分利用现代浏览器的能力,提供最佳的开发体验。

框架开发:Vue、React、Svelte 等框架的官方模板都基于 Vite,框架作者也在积极支持 Vite。

需要谨慎考虑的场景

  • 必须支持 IE11:虽然可以使用 @vitejs/plugin-legacy,但会增加复杂性
  • 深度依赖 Webpack 特定插件:某些 Webpack 插件可能没有 Vite 替代品
  • CommonJS 依赖较多:虽然预构建可以处理,但可能会有边缘情况

学习路径

本教程按照由浅入深的顺序组织,帮助你全面掌握 Vite:

基础阶段

  • 环境配置与项目创建
  • 配置文件详解
  • 依赖预构建原理

核心功能

  • 模块热替换(HMR)
  • TypeScript 支持
  • CSS 处理
  • 静态资源管理
  • WebAssembly 支持
  • Web Workers

进阶配置

  • 环境变量与模式
  • 生产构建优化
  • 插件系统

高级特性

  • 服务端渲染(SSR)
  • 库模式开发
  • 插件开发
  • CSP 安全配置

迁移与速查

  • Vite 8 迁移指南
  • 知识速查表

写在最后

Vite 通过利用浏览器原生 ES 模块能力,在开发环境实现了极速体验,同时通过 Rolldown 保证了生产构建的质量。它的出现改变了前端构建工具的格局。

选择 Vite 你将获得:更快的开发迭代、更少的配置负担、更好的开发体验,以及活跃的社区支持。

接下来让我们从环境配置开始,正式进入 Vite 的世界。