1. Vite 配置基础与文件结构
作为现代前端构建工具的代表,Vite 的配置文件是其核心能力的集中体现。与传统的 webpack 配置不同,Vite 采用了更简洁的配置方式,同时保持了极高的灵活性。
1.1 配置文件的位置与命名
Vite 会自动在项目根目录下查找名为vite.config.js的配置文件。实际上,Vite 支持多种配置文件格式:
- JavaScript 文件:
vite.config.js - TypeScript 文件:
vite.config.ts - ESM 模块:
vite.config.mjs - CommonJS 模块:
vite.config.cjs
提示:即使项目没有在 package.json 中设置
"type": "module",Vite 也支持在配置文件中使用 ESM 语法。Vite 会在加载前自动对配置文件进行预处理。
1.2 基本配置结构
一个最简单的 Vite 配置如下所示:
export default { // 配置选项将放在这里 }对于 TypeScript 项目,我们可以使用更类型安全的方式:
import { defineConfig } from 'vite' export default defineConfig({ // 配置选项 })defineConfig辅助函数不仅提供了类型提示,还能确保配置对象的正确性。在实际项目中,我强烈推荐使用这种方式,它能显著提升开发体验。
1.3 配置智能提示
为了让配置过程更加高效,Vite 提供了完善的类型提示支持。在 VS Code 中,可以通过以下方式获得智能提示:
/** @type {import('vite').UserConfig} */ export default { // 配置选项 }或者更简洁地使用defineConfig:
import { defineConfig } from 'vite' export default defineConfig({ // 配置选项 })在实际开发中,我发现类型提示能有效减少配置错误,特别是在处理复杂配置时。例如,当配置服务器选项时,IDE 会自动提示可用的参数和它们的类型。
1.4 条件配置
Vite 支持根据不同的运行环境(开发或生产)提供不同的配置:
export default defineConfig(({ command, mode }) => { if (command === 'serve') { return { // 开发环境特有配置 } } else { return { // 生产环境特有配置 } } })这种条件配置在实际项目中非常有用。例如,在开发环境中我们可能需要配置代理服务器,而在生产环境中则需要考虑代码压缩和分包策略。
2. 核心配置选项详解
2.1 服务器配置 (server)
Vite 的开发服务器是其一大亮点,提供了丰富的配置选项:
export default defineConfig({ server: { port: 3000, // 指定开发服务器端口 host: true, // 监听所有地址 open: true, // 启动时自动打开浏览器 proxy: { '/api': { target: 'http://localhost:8080', changeOrigin: true, rewrite: (path) => path.replace(/^\/api/, '') } }, cors: true // 启用 CORS } })在实际项目中,我经常遇到需要配置代理的情况。特别是在前后端分离的架构中,API 请求通常需要转发到后端服务器。Vite 的代理配置非常灵活,支持路径重写、跨域等常见需求。
注意:在生产环境中,这些服务器配置不会生效,它们仅用于开发服务器。
2.2 构建配置 (build)
生产构建相关的配置集中在build选项中:
export default defineConfig({ build: { outDir: 'dist', // 输出目录 assetsDir: 'assets', // 静态资源目录 assetsInlineLimit: 4096, // 小于此值的资源将内联为 base64 cssCodeSplit: true, // CSS 代码分割 sourcemap: true, // 生成 source map minify: 'terser', // 代码压缩工具 rollupOptions: { output: { manualChunks: (id) => { if (id.includes('node_modules')) { return 'vendor' } } } } } })在实际项目中,我特别关注rollupOptions的配置。通过manualChunks可以自定义代码分割策略,这对于优化大型应用的加载性能非常重要。
2.3 插件配置 (plugins)
Vite 的插件系统是其强大扩展能力的基础:
import vue from '@vitejs/plugin-vue' import viteCompression from 'vite-plugin-compression' export default defineConfig({ plugins: [ vue(), viteCompression({ algorithm: 'gzip' }) ] })Vite 的插件生态系统非常丰富,常见的插件包括:
@vitejs/plugin-vue:Vue 单文件组件支持@vitejs/plugin-react:React 支持vite-plugin-pwa:PWA 支持vite-plugin-svg-icons:SVG 图标处理vite-plugin-compression:Gzip/Brotli 压缩
在实际项目中,我通常会根据项目需求选择合适的插件组合。例如,在 Vue 项目中,@vitejs/plugin-vue是必不可少的;而对于需要 SEO 优化的项目,可能会添加vite-plugin-ssr或类似的 SSR 插件。
3. 高级配置技巧
3.1 环境变量处理
Vite 提供了完善的环境变量支持:
import { defineConfig, loadEnv } from 'vite' export default defineConfig(({ mode }) => { const env = loadEnv(mode, process.cwd(), '') return { define: { __APP_VERSION__: JSON.stringify(env.APP_VERSION) }, server: { port: env.VITE_PORT ? Number(env.APP_PORT) : 5173 } } })在项目中,我通常会在.env文件中定义环境变量:
VITE_PORT=3000 VITE_API_BASE_URL=/api然后在代码中通过import.meta.env访问这些变量:
const apiBaseUrl = import.meta.env.VITE_API_BASE_URL注意:只有以
VITE_为前缀的变量才会被 Vite 自动暴露给客户端代码。
3.2 CSS 相关配置
Vite 对现代 CSS 提供了开箱即用的支持:
export default defineConfig({ css: { preprocessorOptions: { scss: { additionalData: `@import "@/styles/variables.scss";` }, less: { math: 'always' } }, modules: { localsConvention: 'camelCase' } } })在实际项目中,我经常需要配置 CSS 预处理器。例如,在 Vue 项目中,我通常会全局注入 SCSS 变量文件,这样就不需要在每个组件中单独引入了。
3.3 路径别名配置
路径别名可以大大简化模块导入:
import path from 'path' import { defineConfig } from 'vite' export default defineConfig({ resolve: { alias: { '@': path.resolve(__dirname, './src'), 'components': path.resolve(__dirname, './src/components') } } })配置完成后,就可以在代码中使用简洁的路径:
import MyComponent from '@/components/MyComponent.vue'在实际项目中,我通常会为src目录设置@别名,并为常用子目录(如components、utils等)设置单独的别名。这不仅能提高代码可读性,还能避免复杂的相对路径。
4. 常见场景配置实战
4.1 配置 Tailwind CSS
根据热搜词中的需求,我们来配置 Tailwind CSS v3.4:
npm install -D tailwindcss@3.4 postcss autoprefixer npx tailwindcss init然后在vite.config.js中添加 PostCSS 配置:
export default defineConfig({ css: { postcss: { plugins: [ require('tailwindcss'), require('autoprefixer') ] } } })创建tailwind.config.js:
module.exports = { content: [ './index.html', './src/**/*.{vue,js,ts,jsx,tsx}' ], theme: { extend: {}, }, plugins: [], }最后,在项目的 CSS 文件中引入 Tailwind:
@tailwind base; @tailwind components; @tailwind utilities;4.2 解决打包缓存问题
Vite 的缓存机制有时会导致打包问题,可以通过以下配置解决:
export default defineConfig({ build: { rollupOptions: { output: { entryFileNames: `assets/[name].[hash].js`, chunkFileNames: `assets/[name].[hash].js`, assetFileNames: `assets/[name].[hash].[ext]` } } } })4.3 SSL 证书配置
对于需要 HTTPS 的开发环境:
import { readFileSync } from 'fs' export default defineConfig({ server: { https: { key: readFileSync('path/to/key.pem'), cert: readFileSync('path/to/cert.pem') } } })4.4 多页面应用配置
export default defineConfig({ build: { rollupOptions: { input: { main: path.resolve(__dirname, 'index.html'), admin: path.resolve(__dirname, 'admin.html') } } } })4.5 性能优化配置
export default defineConfig({ build: { target: 'esnext', polyfillModulePreload: false, reportCompressedSize: false, chunkSizeWarningLimit: 1000, terserOptions: { compress: { drop_console: true, drop_debugger: true } } } })在实际项目中,我通常会根据项目特点调整这些优化选项。例如,对于现代浏览器应用,可以设置更高的target以减少 polyfill;而对于需要兼容旧浏览器的项目,则可能需要更保守的配置。