什么是 Vite

Vite(法语意为"快速")是由 Vue.js 作者尤雨溪开发的新一代前端构建工具。它诞生于 2020 年,旨在解决传统构建工具(如 Webpack)在大型项目中启动慢、热更新慢的痛点。

从前端工程化视角理解 Vite

在现代前端工程化体系中,Vite 扮演着开发服务器 + 生产构建工具的双重角色:

  • 开发阶段:利用浏览器原生 ES Module 支持,实现无需打包的极速冷启动
  • 生产阶段:基于 Rollup 进行高效打包,输出优化后的生产代码

Vite 的技术创新

传统构建工具(Webpack):
源代码 → 完整打包 → Bundle → 开发服务器 → 浏览器
(启动慢,项目越大越慢)

Vite 方案:
开发环境:源代码 → ESM 按需加载 → 浏览器(即时启动)
生产环境:源代码 → Rollup 打包 → 优化的 Bundle

核心优势

  • 极速的服务器启动:无需等待打包,秒级启动
  • 🔥 轻量快速的热更新:基于 ESM 的 HMR,更新速度不受项目规模影响
  • 🛠️ 丰富的功能:开箱即用的 TypeScript、JSX、CSS 预处理器支持
  • 📦 优化的构建:预配置的 Rollup 打包,自动代码分割、CSS 处理
  • 🔌 强大的插件系统:兼容 Rollup 插件,生态丰富

Vite 的核心作用

在前端工程化流程中,Vite 解决了以下关键问题:

1. 开发体验优化

问题:传统工具需要打包整个应用才能启动,大型项目启动时间可达几分钟。

Vite 方案

  • 使用 esbuild(Go 编写)进行依赖预构建,速度比 JavaScript 编写的打包器快 10-100 倍
  • 源代码采用原生 ESM,浏览器按需请求模块
  • 实现毫秒级的服务器启动

2. 模块热替换(HMR)

问题:传统 HMR 性能随项目规模线性下降。

Vite 方案

  • 基于 ESM 的 HMR,只需精确替换修改的模块
  • 无论应用多大,HMR 更新速度始终保持快速
  • 支持 Vue、React、Svelte 等框架的原生 HMR

3. 生产构建优化

虽然开发环境使用 ESM,但生产环境仍需打包以获得最佳性能:

  • 使用 Rollup:更好的 Tree-shaking、懒加载、公共块分割
  • 自动 CSS 代码分割:每个异步 chunk 自动提取 CSS
  • 预加载指令生成:自动生成 <link rel="modulepreload"> 指令
  • 异步 Chunk 加载优化:自动重写代码,分割动态导入

4. 开箱即用的功能

  • ✅ TypeScript、JSX、TSX 直接支持(无需配置)
  • ✅ CSS 预处理器(Sass、Less、Stylus)
  • ✅ CSS Modules、PostCSS
  • ✅ 静态资源处理(图片、字体、JSON 等)
  • ✅ 环境变量和模式(.env 文件)

基础配置详解

Vite 的配置文件是 vite.config.js(或 .ts),它导出一个配置对象:

基础配置结构

import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import path from 'path'

export default defineConfig({
  // 项目根目录
  root: process.cwd(),
  
  // 开发服务器配置
  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',  // 静态资源目录
    sourcemap: false,     // 是否生成 sourcemap
    minify: 'terser',     // 压缩方式:'terser' | 'esbuild'
    chunkSizeWarningLimit: 500, // chunk 大小警告阈值(kb)
    rollupOptions: {      // Rollup 配置
      output: {
        manualChunks: {   // 手动分包
          'vue-vendor': ['vue', 'vue-router', 'pinia'],
          'ui-vendor': ['element-plus']
        }
      }
    }
  },
  
  // 路径别名
  resolve: {
    alias: {
      '@': path.resolve(__dirname, 'src'),
      '@components': path.resolve(__dirname, 'src/components'),
      '@utils': path.resolve(__dirname, 'src/utils')
    },
    extensions: ['.js', '.ts', '.jsx', '.tsx', '.json', '.vue']
  },
  
  // CSS 配置
  css: {
    preprocessorOptions: {
      scss: {
        additionalData: `@import "@/styles/variables.scss";`
      }
    },
    modules: {
      localsConvention: 'camelCase' // CSS Modules 命名转换
    }
  },
  
  // 插件
  plugins: [
    vue()
  ],
  
  // 依赖优化
  optimizeDeps: {
    include: ['vue', 'axios'],  // 强制预构建的依赖
    exclude: ['your-local-pkg'] // 排除预构建
  },
  
  // 环境变量前缀
  envPrefix: 'VITE_',
  
  // 基础路径
  base: './', // 生产环境的公共基础路径
})

关键配置项说明

配置项 作用 典型场景
server.proxy API 代理 解决开发环境跨域问题
build.rollupOptions Rollup 配置 自定义打包策略、分包优化
resolve.alias 路径别名 简化导入路径,避免 ../../
css.preprocessorOptions CSS 预处理器配置 全局注入变量、mixins
optimizeDeps 依赖预构建 优化第三方包的加载速度

核心插件生态

Vite 的插件系统是其强大功能的关键,下面详细介绍 10 个核心插件及其在前端工程化中的作用。


1. @vitejs/plugin-vue

核心作用:Vue 3 单文件组件(SFC)支持

功能

  • 解析和编译 .vue 文件
  • 支持 Vue 3 的 <script setup> 语法
  • 自动处理 Vue SFC 的 HMR
  • 支持自定义块(custom blocks)

配置示例

import vue from '@vitejs/plugin-vue'

export default defineConfig({
  plugins: [
    vue({
      include: [/\.vue$/],
      // 自定义块处理
      customElement: true,
      // 模板编译选项
      template: {
        compilerOptions: {
          isCustomElement: (tag) => tag.startsWith('custom-')
        }
      }
    })
  ]
})

使用场景

  • ✅ 所有 Vue 3 项目必备
  • ✅ 需要使用 Vue SFC 的项目
  • ✅ 使用 Composition API 和 <script setup> 的项目

2. @vitejs/plugin-vue-jsx

核心作用:在 Vue 项目中支持 JSX/TSX 语法

功能

  • 支持在 Vue 组件中使用 JSX 语法
  • 完整的 TypeScript 支持
  • 与 Vue 3 Composition API 完美集成

配置示例

import vueJsx from '@vitejs/plugin-vue-jsx'

export default defineConfig({
  plugins: [
    vue(),
    vueJsx({
      // 自定义 JSX 转换选项
      optimize: true,
      transformOn: true,
      mergeProps: true
    })
  ]
})

使用场景

  • ✅ 需要更灵活的组件编写方式
  • ✅ 复杂的条件渲染逻辑
  • ✅ 从 React 迁移的团队
  • ✅ 需要编写通用组件库

代码示例

// MyComponent.tsx
import { defineComponent, ref } from 'vue'

export default defineComponent({
  setup() {
    const count = ref(0)
    
    return () => (
      <div class="container">
        <h1>Count: {count.value}</h1>
        <button onClick={() => count.value++}>Increment</button>
      </div>
    )
  }
})

3. @vitejs/plugin-legacy

核心作用:为旧版浏览器提供兼容性支持

功能

  • 自动生成传统浏览器兼容的 bundle
  • 使用 @babel/preset-env 转译现代 JS 语法
  • 自动注入 polyfills
  • 使用 <script type="module"><script nomodule> 实现差异化加载

配置示例

import legacy from '@vitejs/plugin-legacy'

export default defineConfig({
  plugins: [
    vue(),
    legacy({
      targets: ['defaults', 'not IE 11'],  // 浏览器目标
      additionalLegacyPolyfills: ['regenerator-runtime/runtime'],
      renderLegacyChunks: true,
      polyfills: [
        'es.promise.finally',
        'es/map',
        'es/set'
      ],
      modernPolyfills: [
        'es.promise.finally'
      ]
    })
  ]
})

使用场景

  • ✅ 需要支持 IE11 或旧版 Chrome/Safari
  • ✅ 企业级应用(用户浏览器多样)
  • ✅ 政府、金融等对兼容性要求高的项目

工作原理

现代浏览器:加载 ES2015+ 代码(更小、更快)
旧版浏览器:加载经过 Babel 转译和 polyfill 的代码

4. unplugin-auto-import

核心作用:自动导入 API,无需手动 import

功能

  • 自动导入 Vue、React 等框架的 API
  • 自动导入自定义工具函数
  • 支持 TypeScript 类型提示
  • 生成 .d.ts 类型声明文件

配置示例

import AutoImport from 'unplugin-auto-import/vite'

export default defineConfig({
  plugins: [
    AutoImport({
      // 自动导入的库
      imports: [
        'vue',
        'vue-router',
        'pinia',
        {
          'axios': [
            ['default', 'axios'] // import axios from 'axios'
          ]
        }
      ],
      // 自动导入的目录
      dirs: [
        './src/composables',
        './src/utils'
      ],
      // 生成类型声明文件
      dts: 'src/auto-imports.d.ts',
      // ESLint 配置
      eslintrc: {
        enabled: true,
        filepath: './.eslintrc-auto-import.json'
      }
    })
  ]
})

使用场景

  • ✅ 减少重复的 import 语句
  • ✅ 提升开发效率
  • ✅ 统一团队代码风格

效果对比

// 传统写法
import { ref, computed, onMounted } from 'vue'
import { useRouter } from 'vue-router'
import { useUserStore } from '@/stores/user'

// 使用 auto-import 后
// 直接使用,无需导入
const count = ref(0)
const router = useRouter()
const userStore = useUserStore()

5. unplugin-vue-components

核心作用:自动导入组件,无需手动注册

功能

  • 按需自动导入组件
  • 支持组件库(Element Plus、Ant Design Vue 等)
  • 自动生成类型声明
  • 支持自定义组件目录

配置示例

import Components from 'unplugin-vue-components/vite'
import { ElementPlusResolver } from 'unplugin-vue-components/resolvers'

export default defineConfig({
  plugins: [
    Components({
      // 组件所在目录
      dirs: ['src/components'],
      
      // 组件的有效文件扩展名
      extensions: ['vue', 'tsx'],
      
      // 自动导入组件库
      resolvers: [
        ElementPlusResolver()
      ],
      
      // 生成类型声明
      dts: 'src/components.d.ts',
      
      // 指定组件位置
      include: [/\.vue$/, /\.vue\?vue/, /\.tsx$/],
      
      // 排除路径
      exclude: [/[\\/]node_modules[\\/]/]
    })
  ]
})

使用场景

  • ✅ 大型项目,组件数量多
  • ✅ 使用 UI 组件库(Element Plus、Ant Design Vue)
  • ✅ 减少 bundle 体积(按需加载)

效果对比

<!-- 传统写法 -->
<script setup>
import { ElButton, ElInput } from 'element-plus'
import MyComponent from '@/components/MyComponent.vue'
</script>

<!-- 使用 unplugin-vue-components 后 -->
<script setup>
// 无需导入,直接使用
</script>

<template>
  <ElButton>按钮</ElButton>
  <MyComponent />
</template>

6. rollup-plugin-visualizer

核心作用:可视化分析打包产物,优化 bundle 体积

功能

  • 生成交互式的 bundle 分析报告
  • 显示每个模块的大小和占比
  • 帮助识别冗余依赖和大文件
  • 支持多种可视化格式(treemap、sunburst、network)

配置示例

import { visualizer } from 'rollup-plugin-visualizer'

export default defineConfig({
  plugins: [
    vue(),
    visualizer({
      // 输出文件路径
      filename: './dist/stats.html',
      // 打开分析报告
      open: true,
      // 收集 gzip 大小
      gzipSize: true,
      // 收集 brotli 大小
      brotliSize: true,
      // 生成的图表类型
      template: 'treemap' // treemap | sunburst | network
    })
  ]
})

使用场景

  • ✅ 分析 bundle 体积,找出优化点
  • ✅ 识别重复打包的依赖
  • ✅ 评估第三方库的体积影响
  • ✅ 生产构建优化前的必备分析

分析报告示例

生成的 stats.html 会显示:
├── vue (120KB)
├── element-plus (450KB) ← 体积大,考虑按需引入
├── lodash (70KB) ← 可以用 lodash-es 替代
├── moment (230KB) ← 可以用 dayjs 替代
└── ...

7. vite-plugin-compression

核心作用:生成压缩文件(gzip/brotli),提升传输速度

功能

  • 自动生成 .gz.br 压缩文件
  • 支持 gzip 和 brotli 算法
  • 可配置压缩阈值
  • 减少网络传输体积

配置示例

import viteCompression from 'vite-plugin-compression'

export default defineConfig({
  plugins: [
    vue(),
    // gzip 压缩
    viteCompression({
      verbose: true,          // 输出压缩成功信息
      disable: false,         // 是否禁用
      threshold: 10240,       // 文件大小阈值(10KB)
      algorithm:'gzip',      // 压缩算法
      ext: '.gz',             // 文件扩展名
      deleteOriginFile: false // 是否删除原文件
    }),
    // brotli 压缩(更高压缩率)
    viteCompression({
      algorithm: 'brotliCompress',
      ext: '.br',
      threshold: 10240
    })
  ]
})

使用场景

  • ✅ 生产环境优化
  • ✅ 减少首屏加载时间
  • ✅ 节省带宽成本
  • ✅ CDN 配合使用

效果对比

原始文件:bundle.js (500KB)
gzip 压缩:bundle.js.gz (150KB) ← 70% 压缩率
brotli 压缩:bundle.js.br (120KB) ← 76% 压缩率

Nginx 配置示例

# 启用 gzip
gzip on;
gzip_static on;
gzip_types text/plain text/css application/json application/javascript;

# 启用 brotli
brotli on;
brotli_static on;
brotli_types text/plain text/css application/json application/javascript;

8. vite-plugin-html

核心作用:HTML 模板增强,支持 EJS 语法和多页面配置

功能

  • 支持 EJS 模板语法
  • 动态注入环境变量到 HTML
  • 多页面应用配置
  • HTML 压缩和优化

配置示例

import { createHtmlPlugin } from 'vite-plugin-html'

export default defineConfig({
  plugins: [
    vue(),
    createHtmlPlugin({
      // 压缩 HTML
      minify: true,
      
      // 注入数据
      inject: {
        data: {
          title: 'My App',
          injectScript: `<script src="https://cdn.example.com/analytics.js"></script>`
        }
      },
      
      // 多页面配置
      pages: [
        {
          entry: 'src/main.ts',
          filename: 'index.html',
          template: 'public/index.html',
          injectOptions: {
            data: {
              title: '首页',
              description: '这是首页'
            }
          }
        },
        {
          entry: 'src/admin.ts',
          filename: 'admin.html',
          template: 'public/admin.html',
          injectOptions: {
            data: {
              title: '管理后台'
            }
          }
        }
      ]
    })
  ]
})

HTML 模板示例

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title><%- title %></title>
  <meta name="description" content="<%- description %>">
  
  <% if (process.env.NODE_ENV === 'production') { %>
    <%- injectScript %>
  <% } %>
</head>
<body>
  <div id="app"></div>
</body>
</html>

使用场景

  • ✅ 多页面应用(MPA)
  • ✅ 动态配置 SEO 信息
  • ✅ 条件注入第三方脚本(统计、监控)
  • ✅ 环境变量注入到 HTML

9. vite-plugin-pwa

核心作用:PWA(渐进式 Web 应用)支持,实现离线访问

功能

  • 自动生成 Service Worker
  • 生成 Web App Manifest
  • 支持离线缓存策略
  • 自动更新提示
  • 预缓存静态资源

配置示例

import { VitePWA } from 'vite-plugin-pwa'

export default defineConfig({
  plugins: [
    vue(),
    VitePWA({
      // 注册类型
      registerType: 'autoUpdate',
      
      // 开发环境启用
      devOptions: {
        enabled: true
      },
      
      // Manifest 配置
      manifest: {
        name: 'My Awesome App',
        short_name: 'MyApp',
        description: 'My Awesome App description',
        theme_color: '#ffffff',
        icons: [
          {
            src: 'pwa-192x192.png',
            sizes: '192x192',
            type: 'image/png'
          },
          {
            src: 'pwa-512x512.png',
            sizes: '512x512',
            type: 'image/png'
          }
        ]
      },
      
      // Workbox 配置
      workbox: {
        // 缓存的资源
        globPatterns: ['**/*.{js,css,html,ico,png,svg,woff2}'],
        
        // 运行时缓存
        runtimeCaching: [
          {
            urlPattern: /^https:\/\/api\.example\.com\/.*/i,
            handler: 'NetworkFirst',
            options: {
              cacheName: 'api-cache',
              expiration: {
                maxEntries: 10,
                maxAgeSeconds: 60 * 60 * 24 // 24 小时
              },
              cacheableResponse: {
                statuses: [0, 200]
              }
            }
          },
          {
            urlPattern: /^https:\/\/cdn\.example\.com\/.*/i,
            handler: 'CacheFirst',
            options: {
              cacheName: 'cdn-cache',
              expiration: {
                maxEntries: 50,
                maxAgeSeconds: 60 * 60 * 24 * 30 // 30 天
              }
            }
          }
        ]
      }
    })
  ]
})

使用场景

  • ✅ 需要离线访问的应用
  • ✅ 移动端 Web 应用
  • ✅ 类原生应用体验
  • ✅ 弱网环境优化

缓存策略说明

// NetworkFirst:网络优先,失败后使用缓存(适合 API)
// CacheFirst:缓存优先,失败后请求网络(适合静态资源)
// StaleWhileRevalidate:使用缓存同时更新(适合频繁更新的资源)
// NetworkOnly:仅网络
// CacheOnly:仅缓存

10. vite-plugin-electron

核心作用:Electron 应用开发支持

功能

  • 集成 Electron 开发环境
  • 主进程和渲染进程同步构建
  • 支持 Electron 热重载
  • 简化 Electron + Vite 配置

配置示例

import electron from 'vite-plugin-electron'

export default defineConfig({
  plugins: [
    vue(),
    electron({
      // 主进程配置
      entry: 'electron/main.ts',
      
      // 预加载脚本
      preload: {
        input: 'electron/preload.ts'
      },
      
      // Electron 启动配置
      onstart(options) {
        options.startup()
      },
      
      // 构建配置
      vite: {
        build: {
          outDir: 'dist-electron',
          rollupOptions: {
            external: ['electron']
          }
        }
      }
    })
  ]
})

项目结构

project/
├── electron/
│   ├── main.ts         # 主进程
│   └── preload.ts      # 预加载脚本
├── src/
│   ├── main.ts         # 渲染进程入口
│   └── App.vue
├── package.json
└── vite.config.ts

主进程示例

// electron/main.ts
import { app, BrowserWindow } from 'electron'
import path from 'path'

let mainWindow: BrowserWindow | null = null

app.whenReady().then(() => {
  mainWindow = new BrowserWindow({
    width: 1200,
    height: 800,
    webPreferences: {
      preload: path.join(__dirname, 'preload.js'),
      nodeIntegration: false,
      contextIsolation: true
    }
  })

  // 开发环境加载 Vite 开发服务器
  if (process.env.VITE_DEV_SERVER_URL) {
    mainWindow.loadURL(process.env.VITE_DEV_SERVER_URL)
  } else {
    // 生产环境加载构建后的文件
    mainWindow.loadFile(path.join(__dirname, '../dist/index.html'))
  }
})

使用场景

  • ✅ 桌面应用开发
  • ✅ 需要访问系统 API 的应用
  • ✅ 跨平台应用(Windows、Mac、Linux)
  • ✅ 企业内部工具

优势

  • 🚀 结合 Vite 的快速开发体验
  • 🔄 主进程和渲染进程热重载
  • 📦 统一的构建流程
  • 🛠️ TypeScript 原生支持

总结

Vite 在前端工程化中的核心价值

通过本文的详细介绍,我们可以清晰地看到 Vite 在现代前端工程化体系中的关键地位

1️⃣ 开发效率革命
  • 极速启动:利用 ESM 和 esbuild,实现秒级项目启动
  • 即时反馈:HMR 热更新速度不受项目规模影响
  • 开箱即用:零配置支持 TypeScript、JSX、CSS 预处理器
2️⃣ 生产构建优化
  • 基于 Rollup:更优秀的 Tree-shaking 和代码分割
  • 自动优化:CSS 代码分割、预加载指令、异步 chunk 优化
  • 灵活配置:完善的构建配置选项,满足各种场景需求
3️⃣ 强大的插件生态
插件类别 代表插件 解决的问题
框架支持 @vitejs/plugin-vue
@vitejs/plugin-vue-jsx
Vue SFC、JSX 语法支持
兼容性 @vitejs/plugin-legacy 旧版浏览器兼容
开发效率 unplugin-auto-import
unplugin-vue-components
自动导入 API 和组件
性能优化 rollup-plugin-visualizer
vite-plugin-compression
Bundle 分析、资源压缩
功能增强 vite-plugin-html
vite-plugin-pwa
HTML 模板、PWA 支持
跨平台 vite-plugin-electron 桌面应用开发

实际应用场景总结

🌐 中小型 Web 应用
// 基础配置即可
plugins: [
  vue(),
  AutoImport({ imports: ['vue', 'vue-router'] }),
  Components()
]
🏢 企业级大型应用
// 需要全面配置
plugins: [
  vue(),
  vueJsx(),
  legacy({ targets: ['defaults'] }),
  AutoImport({ /* ... */ }),
  Components({ /* ... */ }),
  visualizer(),
  viteCompression()
]
📱 PWA / 移动端应用
plugins: [
  vue(),
  VitePWA({
    registerType: 'autoUpdate',
    workbox: { /* 缓存策略 */ }
  })
]
💻 桌面应用(Electron)
plugins: [
  vue(),
  electron({
    entry: 'electron/main.ts',
    preload: { input: 'electron/preload.ts' }
  })
]

最佳实践建议

  1. 开发阶段

    • 使用 unplugin-auto-importunplugin-vue-components 提升开发效率
    • 配置合理的 server.proxy 解决跨域问题
    • 利用 resolve.alias 简化模块导入
  2. 构建优化

    • 使用 rollup-plugin-visualizer 分析 bundle,找出优化点
    • 配置 build.rollupOptions.manualChunks 进行代码分割
    • 使用 vite-plugin-compression 生成压缩文件
  3. 兼容性处理

    • 根据目标用户选择是否使用 @vitejs/plugin-legacy
    • 合理配置 targets 避免过度 polyfill
  4. 性能监控

    • 定期使用 visualizer 检查 bundle 体积
    • 关注首屏加载时间和资源加载性能

Vite vs Webpack:何时选择 Vite?

✅ 推荐使用 Vite

  • 新项目启动
  • 中小型项目
  • 对开发体验要求高的团队
  • Vue 3 / React / Svelte 项目

⚠️ 谨慎评估

  • 需要复杂 Webpack 配置迁移的老项目
  • 依赖大量 Webpack 特有生态的项目
  • 需要 Module Federation 等特定功能

结语

Vite 不仅是一个构建工具,更是前端工程化思维的进化。它通过以下方式重新定义了前端开发流程:

  • 🚀 极致的开发体验:让开发者专注于业务逻辑而非构建配置
  • 🔧 渐进式增强:从零配置到复杂场景都有良好支持
  • 🌍 面向未来:拥抱 ESM 标准,紧跟 Web 技术发展趋势
  • 🎯 生态完善:丰富的插件系统覆盖各种应用场景

无论是构建现代化的 Web 应用、PWA、还是跨平台桌面应用,Vite 都能提供卓越的开发体验和生产性能。希望本文能帮助你全面理解 Vite 在前端工程化中的价值,并在实际项目中充分发挥其优势!


📚 扩展阅读

💡 提示:本文基于 Vite 4.x/5.x 版本编写,部分 API 可能随版本更新而变化,请以官方文档为准。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐