Vite(法语"快"的意思)是一个现代化的前端构建工具,由 Vue.js 作者尤雨溪开发。本文基于 Vite 5(2023年11月发布),用大白话讲解 Vite 为什么这么快、核心原理、实战配置,以及与 Webpack 的对比。

1. Vite 是什么:用外卖点餐理解构建工具

想象你在点外卖,有两种送餐模式:

1.1 Webpack 的"打包模式"

大白话:厨师把所有菜都做好、打包成一个大餐盒,然后一起送到你家。

技术术语:Bundle-based Dev Server(基于打包的开发服务器)

  • 优点:一次性送到,齐活
  • 缺点:等待时间长,所有菜都要做完才能发货

1.2 Vite 的"按需模式"

大白话:你点什么菜,厨师现做什么,做好一个送一个。

技术术语:Native ESM + On-demand Compilation(原生 ES 模块 + 按需编译)

  • 优点:第一道菜很快就到,边吃边送
  • 缺点:几乎没有(生产环境还是会打包)
graph LR subgraph Webpack模式 A1[所有文件] --> B1[ 打包] B1 --> C1[等待3分钟] C1 --> D1[启动完成] end subgraph Vite模式 A2[启动服务器] --> B2[ 1秒启动] B2 --> C2[浏览器请求什么] C2 --> D2[编译什么] end

2. 为什么 Vite 这么快:三大核心原理

2.1 原生 ESM(Native ES Modules)

大白话:浏览器现在会说"模块语言"了,不用翻译官了。

技术解释

  • 现代浏览器支持 <script type="module">
  • 浏览器可以直接加载 ES 模块(import/export
  • Vite 直接把代码发给浏览器,浏览器自己处理
<!-- 浏览器原生支持这种写法 -->
<script type="module">
  import { createApp } from 'vue'
  import App from './App.vue'

  createApp(App).mount('#app')
</script>
为什么以前不用 ESM?

以前的浏览器不认识 import/export,必须用 Webpack 把代码翻译成浏览器能懂的语言。现在浏览器进化了,可以直接理解模块化代码了。

2.2 依赖预构建(Dependency Pre-bundling)

大白话:第三方库(比如 Vue、React)提前"翻译"好,放在缓存里,下次直接用。

技术实现:使用 esbuild(用 Go 语言写的超快构建工具)

sequenceDiagram participant 开发者 participant Vite participant esbuild participant 缓存 开发者->>Vite: 首次启动项目 Vite->>Vite: 扫描 node_modules Vite->>esbuild: 预构建依赖 Note over esbuild: esbuild 超快
(Go语言) esbuild->>缓存: 写入缓存 esbuild->>开发者: 启动完成 Note over 开发者,缓存: 再次启动时 开发者->>Vite: 再次启动 Vite->>缓存: 读取缓存 缓存->>开发者: 秒启动

为什么需要预构建?

问题 说明 解决方案
CommonJS 转 ESM 很多第三方库是 CommonJS 格式 esbuild 转成 ESM
文件数量太多 lodash-es 有几百个文件 预构建合并成一个文件
请求次数太多 每个文件一个 HTTP 请求 减少请求数量

2.3 按需编译(On-demand Compilation)

大白话:浏览器请求哪个页面,Vite 就编译哪个页面,不用的代码不管。

技术术语:Lazy compilation(懒编译)

graph TD A[浏览器请求 /home] --> B{Vite 检查} B -->|需要编译| C[编译 Home 页面] B -->|已缓存| D[直接返回] C --> E[返回给浏览器] D --> E F[浏览器请求 /about] --> G{Vite 检查} G -->|需要编译| H[编译 About 页面] G -->|已缓存| I[直接返回] H --> J[返回给浏览器] I --> J

3. Vite 5 的新特性(2023年11月发布)

3.1 升级到 Rollup 4

大白话:打包引擎升级了,打包速度更快,生成的文件更小。

技术细节

  • Rollup 4 性能优化
  • 更好的 Tree Shaking(摇树优化)
  • 打包速度提升

3.2 性能改进

  • 开发服务器启动更快:优化了依赖扫描算法
  • HMR 更快:热更新响应速度提升
  • 内存占用更低:优化了内存使用

3.3 环境 API(Environment API)⚠️ 实验性

大白话:可以为不同环境(浏览器、Node.js、SSR)配置不同的构建策略。

用途:服务端渲染(SSR)项目更容易配置

实验性特性

环境 API 目前是实验性的,API 可能会变化,生产项目需谨慎使用。

4. Vite 工作原理详解

4.1 开发环境工作流程

graph LR A[ 浏览器请求] --> B[Vite Dev Server] B --> C{检查文件类型} C -->|.vue| D[Vue 编译器] C -->|.jsx| E[esbuild 编译] C -->|.ts| F[esbuild 编译] C -->|.css| G[CSS 处理] D --> H[返回 ESM 代码] E --> H F --> H G --> H H --> A

4.2 生产环境构建流程

大白话:开发用"按需模式",上线用"打包模式"。

为什么生产环境要打包?

  • 减少 HTTP 请求数量(几千个文件合并成几十个)
  • 压缩代码体积(移除空格、注释、混淆变量名)
  • Tree Shaking(移除没用的代码)
  • 兼容老浏览器(不是所有浏览器都支持 ESM)
graph TD A[ 源代码] --> B[Rollup 打包] B --> C[代码分割] C --> D[压缩优化] D --> E[生成 Hash 文件名] E --> F[ dist 目录]

5. 实战配置:vite.config.js 完整解析

5.1 基础配置

// vite.config.js
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'  // Vue 插件
import path from 'path'

export default defineConfig({
  // ==================== 插件配置 ====================
  plugins: [
    vue(),  // 支持 .vue 文件
  ],

  // ==================== 路径别名 ====================
  resolve: {
    alias: {
      '@': path.resolve(__dirname, 'src'),  // @ 指向 src 目录
    },
  },

  // ==================== 开发服务器配置 ====================
  server: {
    port: 3000,        // 端口号
    open: true,        // 自动打开浏览器
    cors: true,        // 允许跨域

    // 代理配置(解决开发环境跨域问题)
    proxy: {
      '/api': {
        target: 'http://localhost:8080',  // 后端接口地址
        changeOrigin: true,
        rewrite: (path) => path.replace(/^\/api/, ''),
      },
    },
  },

  // ==================== 生产构建配置 ====================
  build: {
    outDir: 'dist',           // 输出目录
    assetsDir: 'assets',      // 静态资源目录
    minify: 'terser',         // 压缩方式(terser 或 esbuild)

    // 代码分割配置
    rollupOptions: {
      output: {
        // 手动分割代码
        manualChunks: {
          'vue-vendor': ['vue', 'vue-router'],  // Vue 相关库单独打包
          'ui-vendor': ['element-plus'],        // UI 库单独打包
        },
      },
    },

    // 小于此大小的文件会被内联为 base64
    assetsInlineLimit: 4096,  // 4KB

    // 生成 Source Map
    sourcemap: false,  // 生产环境不生成(加快构建)
  },
});

5.2 依赖预构建配置

export default defineConfig({
  optimizeDeps: {
    // 强制预构建这些依赖(即使它们是 ESM)
    include: [
      'vue',
      'vue-router',
      'axios',
      'lodash-es',  // lodash-es 有很多小文件,必须预构建
    ],

    // 排除某些依赖(不进行预构建)
    exclude: [
      'your-local-package',  // 本地包不需要预构建
    ],
  },
});
什么时候需要配置 include?
  • 依赖有很多小文件(如 lodash-es)
  • 依赖是 CommonJS 格式
  • 启动时报错找不到模块

5.3 环境变量配置

// .env.development(开发环境)
VITE_API_URL=http://localhost:8080
VITE_APP_TITLE=开发环境

// .env.production(生产环境)
VITE_API_URL=https://api.example.com
VITE_APP_TITLE=生产环境
// 在代码中使用
const apiUrl = import.meta.env.VITE_API_URL  // 读取环境变量
const title = import.meta.env.VITE_APP_TITLE

console.log(apiUrl)  // 开发:http://localhost:8080
                     // 生产:https://api.example.com
环境变量命名规则

环境变量必须以 VITE_ 开头,否则不会暴露给客户端代码(安全考虑)。

6. Vite vs Webpack:全面对比

6.1 启动速度对比

graph LR subgraph Webpack启动 A1[读取所有文件] --> B1[构建依赖图] B1 --> C1[编译所有模块] C1 --> D1[打包] D1 --> E1[等待数分钟] E1 --> F1[启动完成] end subgraph Vite启动 A2[启动 HTTP 服务器] --> B2[预构建依赖] B2 --> C2[ 1秒启动] end

6.2 热更新(HMR)对比

大白话

  • Webpack:换轮胎要停车,重新打包受影响的模块
  • Vite:换轮胎不停车,只更新这一个模块

技术术语

  • Webpack:HMR Boundary 较大,更新多个模块
  • Vite:Precise HMR(精确热更新),只更新变化的模块
sequenceDiagram participant 开发者 participant Vite participant 浏览器 开发者->>开发者: 修改 Button.vue 开发者->>Vite: 文件变化通知 Vite->>Vite: 编译 Button.vue Vite->>浏览器: WebSocket 推送更新 Note over 浏览器: 仅更新 Button 组件
不刷新页面 浏览器->>开发者: 实时看到变化

6.3 综合对比表格

对比项 Webpack 5 Vite 5
冷启动速度 慢(大项目可能数分钟) 快(通常1-2秒)
热更新速度 较慢(秒级) 极快(毫秒级)
开发环境 Bundle(打包模式) Native ESM(按需模式)
生产构建 Webpack 打包 Rollup 打包
配置复杂度 复杂 简单
生态成熟度 非常成熟 快速成长中
浏览器兼容性 支持老浏览器 需要现代浏览器
适用场景 大型企业项目、老项目 新项目、现代浏览器项目

7. Vite 插件系统

7.1 插件机制

大白话:Vite 的插件就像手机应用,给 Vite 装上不同的功能。

技术实现:Vite 插件兼容 Rollup 插件,同时提供 Vite 专属钩子。

7.2 常用官方插件

import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'        // Vue 3 支持
import react from '@vitejs/plugin-react'    // React 支持
import legacy from '@vitejs/plugin-legacy'  // 老浏览器支持

export default defineConfig({
  plugins: [
    vue(),

    // 支持老浏览器(IE11)
    legacy({
      targets: ['defaults', 'not IE 11'],
    }),
  ],
});

7.3 社区插件推荐

  • vite-plugin-compression:Gzip 压缩
  • vite-plugin-svg-icons:SVG 雪碧图
  • vite-plugin-mock:Mock 数据
  • unplugin-auto-import:自动导入 API
  • unplugin-vue-components:自动导入组件

8. 性能优化最佳实践

8.1 开发环境优化

mindmap root((Vite 性能优化)) 开发环境 依赖预构建 配置 include 使用缓存 减少编译 合理拆分组件 避免循环依赖 生产环境 代码分割 动态导入 手动 chunks 资源优化 图片压缩 CDN 加载 Tree Shaking ESM 格式 sideEffects

8.2 生产构建优化

export default defineConfig({
  build: {
    // 启用代码分割
    rollupOptions: {
      output: {
        manualChunks(id) {
          // 第三方库单独打包
          if (id.includes('node_modules')) {
            return 'vendor'
          }
        },
      },
    },

    // 大文件警告阈值(KB)
    chunkSizeWarningLimit: 1000,

    // Terser 压缩配置
    terserOptions: {
      compress: {
        drop_console: true,   // 移除 console
        drop_debugger: true,  // 移除 debugger
      },
    },
  },
});

8.3 静态资源处理

// 小图片内联为 base64
export default defineConfig({
  build: {
    assetsInlineLimit: 4096,  // 小于 4KB 的图片内联
  },
});

// 在代码中引入静态资源
import logo from './assets/logo.png'  // Vite 自动处理

// 动态引入(使用 URL 构造器)
const imageUrl = new URL('./assets/image.png', import.meta.url).href

9. 常见问题与解决方案

9.1 依赖预构建问题

报错:xxx is not defined

原因:某些库需要手动加入预构建

解决:在 optimizeDeps.include 中添加该依赖

9.2 环境变量不生效

环境变量读取为 undefined

原因:环境变量名没有 VITE_ 前缀

解决:所有暴露给客户端的环境变量必须以 VITE_ 开头

9.3 HMR 不生效

热更新失效,页面全量刷新

可能原因

  • 组件存在循环依赖
  • 使用了不支持 HMR 的代码
  • Vite 无法确定更新边界

解决:检查组件依赖关系,避免循环引用

10. 何时选择 Vite,何时选择 Webpack

10.1 选择 Vite 的场景

  • 新项目:从零开始的项目
  • 现代浏览器:不需要兼容 IE
  • Vue 3 / React:框架原生支持
  • 快速迭代:需要极致的开发体验

10.2 选择 Webpack 的场景

  • 老项目迁移:已有大量 Webpack 配置
  • 需要兼容 IE:必须支持老浏览器
  • 复杂定制:需要高度自定义构建流程
  • 企业项目:生态成熟度要求高

11. 总结

Vite 5 是下一代前端构建工具的代表,核心优势在于:

  1. 极致的开发体验:秒级启动 + 毫秒级热更新
  2. 简单的配置:开箱即用,配置量远少于 Webpack
  3. 现代化架构:原生 ESM + esbuild + Rollup 的完美组合
  4. 持续进化:Vite 5 升级到 Rollup 4,性能进一步提升
核心理念

Vite 的设计哲学是"开发环境要快,生产环境要小",通过区分开发和生产环境的构建策略,实现了两全其美。

延伸阅读
  • Vite 官方文档: https://vitejs.dev/
  • Vite 5 发布说明: https://vitejs.dev/blog/announcing-vite5
  • esbuild 官方文档: https://esbuild.github.io/
  • Rollup 官方文档: https://rollupjs.org/
  • Awesome Vite 插件集合: https://github.com/vitejs/awesome-vite