1. 为什么用 Vite?

  • 开发时启动和页面更新非常快,尤其是大型项目体验明显优于传统打包工具(如 Webpack)。

  • 利用了浏览器原生 ES 模块(ESM)在开发环境下按需加载文件,避免整包编译。

  • 生产构建使用 Rollup,产物优化好(code-splitting、tree-shaking)。

  • 插件生态丰富,支持 Vue / React / Svelte 等主流框架。


2. 工作原理(简单版)

  • 开发环境(vite dev)

    • 浏览器请求某个模块时,Vite 直接读取源码并返回 ESM 格式给浏览器。

    • 对第三方依赖(node_modules),Vite 在启动时用 esbuild 预构建为 ESM,提高解析速度。

    • HMR(热模块替换)基于 WebSocket,更新反应很快。

  • 生产构建(vite build)

    • 使用 Rollup 做打包、拆分和 tree-shaking,生成可部署的静态文件。


3. 快速开始(例子)

使用 npm 创建一个项目(官方推荐流程):

# 推荐方式(交互选择框架)
npm create vite@latest my-app
cd my-app
npm install
npm run dev

或者直接用模板(React 示例):

npm create vite@latest my-react-app -- --template react
cd my-react-app
npm install
npm run dev

常见脚本(package.json):

"scripts": {
  "dev": "vite",
  "build": "vite build",
  "preview": "vite preview"
}

打开 http://localhost:5173(默认端口)就能看到页面。


4. 示例配置(vite.config.ts)

下面是一个 React + TypeScript 项目的常见配置示例,带别名、代理与插件:

// vite.config.ts
import { defineConfig } from 'vite'
import react from '@vitejs/plugin-react'
import path from 'path'

export default defineConfig({
  plugins: [react()],
  resolve: {
    alias: {
      '@': path.resolve(__dirname, 'src') // 用 @ 表示 src 目录
    }
  },
  server: {
    port: 3000,
    open: true,
    proxy: {
      '/api': {
        target: 'http://localhost:4000',
        changeOrigin: true,
        rewrite: (path) => path.replace(/^\/api/, '')
      }
    }
  },
  build: {
    outDir: 'dist',
    assetsInlineLimit: 4096 // 小于 4KB 的资源会被内联为 base64
  }
})

说明:

  • alias:简化导入路径(import x from '@/utils')。

  • server.proxy:开发时把 /api 转发到后端,避免跨域。

  • assetsInlineLimit:控制小资源是否内联。


5. 环境变量与运行时配置

Vite 中只有以 VITE_ 开头的环境变量会被注入客户端代码。例如在 .env 文件:

VITE_API_BASE=/api

在代码中读取:

const base = import.meta.env.VITE_API_BASE
console.log('API base:', base)

注意:不要在客户端暴露敏感变量(如密钥)。


6. 插件示例

常用插件安装:

npm install -D @vitejs/plugin-react vite-plugin-checker

在 vite.config.ts 中使用:

import react from '@vitejs/plugin-react'
import checker from 'vite-plugin-checker'

plugins: [
  react(),
  checker({ typescript: true }) // 在开发时做 TS 类型检查
]

说明:

  • @vitejs/plugin-react:支持 JSX/快速刷新(Fast Refresh)。

  • vite-plugin-checker:在终端或浏览器 overlay 显示类型/lint 错误(Vite 默认不会做完整 TS 检查)。


7. 代码分割(懒加载)示例

路由级拆分示例(React):

// App.tsx
import { Suspense, lazy } from 'react'
const Home = lazy(() => import('./pages/Home'))
const About = lazy(() => import('./pages/About'))

function App() {
  return (
    <Suspense fallback={<div>Loading...</div>}>
      {/* 路由或条件渲染时会按需加载模块 */}
      <Home />
      <About />
    </Suspense>
  )
}

这样生产构建时会生成拆分包,提高首屏加载速度。


8. 从 Webpack 迁移要注意的点

  • loader 与 plugin:Webpack 的 loader 需要用 Vite 等价插件替代(例如处理 SVG、图片或样式)。

  • 环境变量:Vite 的客户端变量必须以 VITE_ 开头。

  • 全局样式 / CSS Modules 的配置位置与写法有所不同。

  • 如果需要兼容非常老的浏览器(如 IE11),需要使用 @vitejs/plugin-legacy,但会牺牲构建速度和体积。

  • Vite dev 不做完整的 TypeScript 类型检查:需额外运行 tsc --noEmit 或 vite-plugin-checker。


9. 常见问题与排查建议

  • HMR 不生效

    • 检查是否使用了非 ESM 的第三方库(可能需要预构建)。

    • 检查代理或反向代理是否阻断了 WebSocket(HMR 用到)。

  • 控制台报 require is not defined

    • 某个依赖仍以 CommonJS 提供,需要把它加入 optimizeDeps.include,或者在生产构建时外置(external)处理。

  • 类型错误但页面不提示

    • Vite dev 环境不做类型检查,需用 vite-plugin-checker 或在 CI/本地运行 tsc。

optimizeDeps 示例(vite.config.ts):

optimizeDeps: {
  include: ['some-cjs-lib'],
  exclude: ['large-esm-only-lib']
}

10. 性能优化小贴士

  • 使用路由/组件懒加载做代码拆分。

  • 在生产使用 gzip 或 brotli 压缩(CDN 或服务器配置)。

  • 用 Rollup 分析工具查看打包体积(rollup-plugin-visualizer)。

  • 对大资源(图片、视频)使用 CDN,或延迟加载。

  • 对 node_modules 中慢速依赖,使用 optimizeDeps 手动包含预构建。

示例:添加构建分析

npm install -D rollup-plugin-visualizer

vite.config.ts 中:

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

build: {
  rollupOptions: {
    plugins: [visualizer({ open: true })]
  }
}

11. SSR / SSG 简要说明

  • Vite 提供 SSR 构建支持,但通常结合框架(如 Nuxt 3、SvelteKit、VitePress)更方便。

  • SSR 场景需要处理 server entry、外部化依赖(externals)以及客户端 hydration。


12. 总结

  • Vite 的核心优势是“开发体验快”,非常适合现代前端开发流程。

  • 新项目推荐直接使用 Vite 启动;已有大型 Webpack 项目可以分步迁移(替换 loader、配置别名、校验依赖)。

  • 配置简单、插件生态丰富,结合 esbuild 与 Rollup,兼顾速度与产物质量。


参考与延伸阅读

  • 官方文档:https://vitejs.dev

  • @vitejs/plugin-react / @vitejs/plugin-vue

  • vite-plugin-checker、unplugin 系列插件