vite 常用配置这篇就够了!!
目录
- 基础配置
- 打包优化
- 代码压缩
- 性能提升
- 常用插件
- 常见踩坑
- 高级配置
- 最佳实践
- 示例配置
1. 基础配置 #技术分享
1.1 项目初始化
npm create vite@latest my-project
cd my-project
npm install
yarn create vite my-project cd my-project yarn
JavaScript 1.2 基础 vite.config.js 配置
配置说明与最佳实践
插件配置 (plugins)
plugins: [
vue(),
]
- 好处 : 插件系统是Vite的核心特性,提供了丰富的功能扩展能力
- 坏处 : 过多插件会增加构建时间,插件冲突可能导致构建失败
- 提议 : 只引入必要的插件,定期检查插件更新和兼容性
- 适用场景 : 所有Vite项目都需要根据技术栈选择合适的插件
开发服务器配置 (server)
server: {
host: '0.0.0.0',
port: 3000,
open: true,
cors: true,
proxy: {
'/api': {
target: 'http://localhost:8080',
changeOrigin: true,
rewrite: (path) => path.replace(/^/api/, '')
}
}
}
host: '0.0.0.0' 配置分析 :
- 好处 : 允许局域网内其他设备访问开发服务器,便于移动端调试和团队协作
- 坏处 : 可能存在安全风险,暴露开发环境给网络中的其他设备
- 适用场景 : 移动端开发、团队协作开发、跨设备测试
- 安全提议 : 仅在可信网络环境中使用,生产环境绝对不要使用
port: 3000 配置分析 :
- 好处 : 避免与常用端口冲突,3000是前端开发的标准端口
- 坏处 : 如果端口被占用,需要手动指定其他端口
- 提议 : 可以配置端口范围,如 port: [3000, 3001, 3002] ,自动寻找可用端口
open: true 配置分析 :
- 好处 : 提升开发体验,自动打开浏览器
- 坏处 : 在某些CI/CD环境中可能不适用
- 提议 : 可以根据环境变量动态配置
cors: true 配置分析 :
- 好处 : 解决跨域问题,便于前后端分离开发
- 坏处 : 可能掩盖真正的跨域问题
- 提议 : 开发环境可以开启,生产环境应该通过服务器配置解决跨域
proxy 代理配置分析 :
- 好处 : 解决开发环境跨域问题,模拟生产环境API调用
- 坏处 : 代理配置错误可能导致API调用失败
- 适用场景 : 前后端分离项目、微服务架构
- 注意事项 : 确保target地址正确,changeOrigin一般需要设置为true
构建配置 (build)
build: {
outDir: 'dist',
assetsDir: 'assets',
sourcemap: false,
minify: 'terser',
rollupOptions: {
input: {
main: resolve(__dirname, 'index.html')
}
}
}
outDir: 'dist' 配置分析 :
- 好处 : 清晰的输出目录结构,便于部署
- 坏处 : 默认配置可能不符合某些部署平台要求
- 提议 : 根据部署平台要求调整,如Vercel使用'out',Netlify使用'public'
sourcemap: false 配置分析 :
- 好处 : 减少构建时间,减小包体积
- 坏处 : 生产环境调试困难
- 提议 : 开发环境设为true,生产环境根据需求决定
- 替代方案 : 可以设置为'source-map'或'hidden-source-map'
minify: 'terser' 配置分析 :
- 好处 : 更好的压缩效果,支持ES6+语法
- 坏处 : 构建时间相对较长
- 替代方案 : 'esbuild'压缩速度更快但效果稍差
- 提议 : 大型项目使用terser,小型项目可以使用esbuild
路径别名配置 (resolve.alias)
resolve: {
alias: {
'@': resolve(__dirname, 'src'),
'@components': resolve(__dirname, 'src/components'),
'@utils': resolve(__dirname, 'src/utils'),
'@assets': resolve(__dirname, 'src/assets')
}
}
路径别名优势分析 :
- 好处 :
- 避免相对路径的复杂性,如 ../../../components/Button
- 提高代码可读性和维护性
- 重构时路径更稳定
- IDE支持更好,自动补全和跳转
- 坏处 :
- 需要团队统一规范
- 新成员需要学习别名规则
- 最佳实践 :
- 使用简洁明了的别名
- 在项目文档中说明别名规则
- 配置TypeScript路径映射
CSS 预处理器配置 (css.preprocessorOptions)
css: {
preprocessorOptions: {
scss: {
additionalData: `@import "@/styles/variables.scss";`
}
}
}
全局样式注入分析 :
- 好处 : 自动注入全局变量和混入,无需在每个文件中重复导入
- 坏处 : 可能增加CSS体积,影响样式隔离
- 适用场景 : 使用设计系统的项目,需要全局变量的项目
- 注意事项 : 避免注入过多全局样式,保持样式的模块化
1.3 环境变量配置
环境变量管理策略
环境变量文件结构
VITE_APP_TITLE=开发环境
VITE_API_BASE_URL=http:
VITE_ENABLE_MOCK=true
VITE_DEBUG_MODE=true
VITE_APP_TITLE=生产环境 VITE_API_BASE_URL=https: VITE_ENABLE_MOCK=false VITE_DEBUG_MODE=false
VITE_APP_TITLE=测试环境 VITE_API_BASE_URL=http: VITE_ENABLE_MOCK=true VITE_DEBUG_MODE=false
环境变量配置分析 :
VITE_前缀要求 :
- 好处 : 明确标识哪些变量会被暴露给客户端,提高安全性
- 坏处 : 必须记住使用VITE_前缀,否则变量不会被注入
- 安全思考 : 只有VITE_前缀的变量才会被暴露给浏览器,避免敏感信息泄露
- 最佳实践 : 敏感信息(如API密钥)应该通过服务器端处理,不要暴露给客户端
环境变量使用方式 :
export default defineConfig({
define: {
__APP_VERSION__: JSON.stringify(process.env.npm_package_version),
__BUILD_TIME__: JSON.stringify(new Date().toISOString())
}
})
const apiUrl = import.meta.env.VITE_API_BASE_URL const isDev = import.meta.env.DEV const isProd = import.meta.env.PROD
环境变量优势分析 :
- 好处 :
- 不同环境使用不同配置,避免硬编码
- 便于CI/CD流程中的配置管理
- 支持动态配置,无需重新构建
- 坏处 :
- 配置分散在多个文件中,管理复杂
- 类型安全问题,需要额外配置TypeScript类型
- 适用场景 : 多环境部署、配置驱动的应用
- 注意事项 : 确保所有环境都有对应的配置文件
TypeScript 类型支持 :
interface ImportMetaEnv {
readonly VITE_APP_TITLE: string
readonly VITE_API_BASE_URL: string
readonly VITE_ENABLE_MOCK: string
readonly VITE_DEBUG_MODE: string
}
interface ImportMeta { readonly env: ImportMetaEnv }
环境变量验证 :
const requiredEnvVars = [
'VITE_API_BASE_URL',
'VITE_APP_TITLE'
]
const validateEnv = () => { const missing = requiredEnvVars.filter(key => !import.meta.env[key]) if (missing.length > 0) { throw new Error(`Missing required environment variables: ${missing.join(', ')}`) } }
export { validateEnv }
2. 打包优化
2.1 代码分割策略
代码分割的重大性与策略分析
为什么需要代码分割?
- 性能优化 : 减少初始加载时间,只加载当前页面需要的代码
- 缓存优化 : 第三方库变化频率低,可以长期缓存
- 并行加载 : 浏览器可以并行下载多个小文件
- 按需加载 : 支持路由级别的懒加载
代码分割配置详解
export default defineConfig({
build: {
rollupOptions: {
output: {
manualChunks: {
vendor: ['vue', 'vue-router', 'pinia'],
utils: ['lodash', 'dayjs', 'axios'],
ui: ['element-plus', 'ant-design-vue']
},
chunkFileNames: (chunkInfo) => {
const facadeModuleId = chunkInfo.facadeModuleId
if (facadeModuleId) {
if (facadeModuleId.includes('node_modules')) {
return 'vendor/[name]-[hash].js'
}
if (facadeModuleId.includes('src/components')) {
return 'components/[name]-[hash].js'
}
if (facadeModuleId.includes('src/pages')) {
return 'pages/[name]-[hash].js'
}
}
return 'chunks/[name]-[hash].js'
},
assetFileNames: (assetInfo) => {
const info = assetInfo.name.split('.')
const ext = info[info.length - 1]
if (/.(mp4|webm|ogg|mp3|wav|flac|aac)(?.*)?$/i.test(assetInfo.name)) {
return `media/[name]-[hash].${ext}`
}
if (/.(png|jpe?g|gif|svg)(?.*)?$/i.test(assetInfo.name)) {
return `images/[name]-[hash].${ext}`
}
if (/.(woff2?|eot|ttf|otf)(?.*)?$/i.test(assetInfo.name)) {
return `fonts/[name]-[hash].${ext}`
}
return `assets/[name]-[hash].${ext}`
}
}
}
}
})
手动分包策略分析 :
vendor 分包 :
- 好处 :
- 第三方库变化频率低,可以长期缓存
- 减少主包体积,提升首屏加载速度
- 便于CDN缓存策略配置
- 坏处 :
- 可能产生过多小文件,增加HTTP请求数
- 分包策略需要根据项目特点调整
- 适用场景 : 使用大型第三方库的项目
- 最佳实践 : 将稳定的大型库(如Vue、React)单独分包
utils 分包 :
- 好处 :
- 工具库一般比较稳定,缓存效果好
- 便于按需引入,减少包体积
- 坏处 :
- 如果工具库使用频率不高,可能影响缓存效果
- 提议 : 根据工具库的使用频率和大小决定是否分包
ui 分包 :
- 好处 :
- UI组件库一般体积较大,单独分包可以显著减少主包体积
- 支持按需引入,进一步优化体积
- 坏处 :
- 可能增加HTTP请求数
- 适用场景 : 使用大型UI组件库的项目
动态导入分包策略分析 :
chunkFileNames 函数配置 :
- 好处 :
- 根据文件来源自动分类,便于管理
- 支持细粒度的分包策略
- 便于CDN缓存配置
- 坏处 :
- 配置复杂,需要理解Rollup的chunk信息
- 可能产生过多小文件
- 性能影响 :
- 正面:提升缓存效率,减少重复下载
- 负面:增加HTTP请求数,可能影响加载速度
- 提议 : 平衡文件数量和缓存效果,避免过度分割
资源文件分类命名分析 :
分类命名的好处 :
- CDN优化 : 不同类型的资源可以配置不同的缓存策略
- 性能监控 : 便于分析不同类型资源的加载性能
- 部署优化 : 可以针对不同类型资源配置不同的压缩策略
- 维护性 : 清晰的目录结构便于维护
分类命名的注意事项 :
- 文件数量 : 避免产生过多小文件
- 缓存策略 : 思考不同类型资源的更新频率
- CDN配置 : 确保CDN支持目录结构
2.2 预构建优化
预构建机制深度解析
什么是预构建? Vite 的预构建(Dependency Pre-Bundling)是 Vite 的核心特性之一,它会在开发服务器启动前将依赖项转换为 ES 模块格式,并缓存到 node_modules/.vite 目录中。
预构建的优势 :
- 兼容性 : 将CommonJS/UMD格式的依赖转换为ES模块
- 性能 : 减少HTTP请求数量,将多个小文件合并为单个文件
- 缓存 : 依赖变化时才重新构建,提升开发体验
- 优化 : 使用esbuild进行快速转换和优化
预构建配置详解
export default defineConfig({
optimizeDeps: {
include: [
'vue',
'vue-router',
'pinia',
'axios',
'lodash-es',
'dayjs'
],
exclude: [
'vue-demi'
],
force: true,
esbuildOptions: {
target: 'es2020',
supported: {
'top-level-await': true
}
}
}
})
include 配置分析 :
为什么需要手动指定 include?
- 自动发现限制 : Vite可能无法自动发现某些动态导入的依赖
- 性能优化 : 提前预构建常用依赖,避免运行时发现
- 兼容性 : 确保某些特殊依赖被正确处理
include 配置的好处 :
- 启动速度 : 避免开发服务器启动时的依赖发现延迟
- 稳定性 : 确保关键依赖被正确预构建
- 性能 : 减少运行时的模块解析时间
include 配置的坏处 :
- 维护成本 : 需要手动维护依赖列表
- 冗余 : 可能包含不必要的依赖
- 更新 : 依赖变化时需要更新配置
exclude 配置分析 :
什么时候需要 exclude?
- 兼容性问题 : 某些依赖在预构建后可能出现问题
- 特殊处理 : 需要特殊处理方式的依赖
- 性能思考 : 某些依赖预构建反而影响性能
exclude 的注意事项 :
- 谨慎使用 : 排除依赖可能导致兼容性问题
- 测试验证 : 排除后需要充分测试
- 文档记录 : 记录排除缘由,便于后续维护
force 配置分析 :
force: true 的使用场景 :
- 依赖更新 : 依赖版本更新后强制重新构建
- 配置变更 : 预构建配置变更后
- 缓存问题 : 预构建缓存出现问题时
- CI/CD : 构建环境需要确保依赖是最新的
force 配置的影响 :
- 好处 : 确保依赖是最新状态,解决缓存问题
- 坏处 : 增加开发服务器启动时间
- 提议 : 仅在必要时使用,不要设置为默认值
esbuildOptions 配置分析 :
target 配置 :
- 好处 : 控制输出代码的兼容性,平衡性能和兼容性
- 坏处 : 目标过低可能影响现代浏览器性能
- 提议 : 根据目标用户群体选择合适的target
supported 配置 :
- 好处 : 启用现代JavaScript特性,提升性能
- 坏处 : 可能影响旧浏览器兼容性
- 适用场景 : 现代浏览器项目,PWA应用
预构建性能优化提议 :
- 合理配置include : 只包含必要的依赖
- 避免过度exclude : 除非必要,不要排除依赖
- 监控构建时间 : 关注预构建对开发体验的影响
- 缓存策略 : 利用Vite的缓存机制,避免重复构建
- 依赖管理 : 定期清理不必要的依赖
2.3 构建分析
构建分析与性能监控
为什么需要构建分析?
- 包体积优化 : 识别体积过大的模块,进行针对性优化
- 依赖分析 : 了解项目的依赖结构,发现冗余依赖
- 性能监控 : 跟踪构建性能变化,优化构建速度
- 缓存策略 : 分析模块变化频率,优化缓存策略
构建分析工具配置
import { defineConfig } from 'vite'
import { visualizer } from 'rollup-plugin-visualizer'
export default defineConfig({ plugins: [ visualizer({ filename: 'dist/stats.html', open: true, gzipSize: true, brotliSize: true, template: 'treemap', sourcemap: true }) ], build: { rollupOptions: { output: { manifest: true, sourcemap: true } } } })
构建分析配置详解 :
visualizer 插件分析 :
- 好处 :
- 可视化展示包体积分布,直观了解项目结构
- 支持多种展示方式(树状图、旭日图、网络图)
- 提供gzip和brotli压缩后的体积分析
- 支持sourcemap分析,准确定位问题代码
- 坏处 :
- 增加构建时间
- 生成额外的分析文件
- 适用场景 : 大型项目、性能敏感项目、需要持续优化的项目
manifest 文件分析 :
- 好处 :
- 记录所有构建产物的映射关系
- 便于实现自定义的资源加载策略
- 支持服务端渲染(SSR)场景
- 坏处 :
- 增加构建产物数量
- 需要额外的处理逻辑
- 适用场景 : SSR项目、需要准确控制资源加载的项目
构建分析最佳实践 :
- 定期分析 : 在每次重大更新后进行构建分析
- 对比分析 : 对比不同版本的构建结果,识别变化
- 阈值设置 : 设置包体积阈值,超过时进行优化
- 自动化 : 集成到CI/CD流程中,自动生成分析报告
构建分析结果解读 :
包体积分析 :
- 重点关注 : 体积超过100KB的模块
- 优化策略 : 代码分割、按需加载、依赖优化
- 监控指标 : 首屏加载时间、总包体积、chunk数量
依赖关系分析 :
- 循环依赖 : 识别并解决循环依赖问题
- 重复依赖 : 发现并合并重复的依赖
- 未使用依赖 : 清理未使用的依赖
性能影响分析 :
- 构建时间 : 监控构建时间变化
- 内存使用 : 关注构建过程中的内存使用
- 缓存效果 : 分析缓存命中率
3. 代码压缩
3.1 Terser 压缩配置
代码压缩的重大性与策略
为什么需要代码压缩?
- 减少文件体积 : 显著减少JavaScript文件大小,提升加载速度
- 提升性能 : 减少网络传输时间,降低带宽消耗
- 保护代码 : 混淆代码结构,增加逆向工程难度
- 优化执行 : 移除无用代码,优化执行效率
压缩工具对比分析 :
| 工具 | 压缩效果 | 构建速度 | 兼容性 | 推荐场景 | | —
| Terser | 最好 | 较慢 | 最好 | 生产环境 | | esbuild | 中等 | 最快 | 好 | 开发环境 | | SWC | 好 | 快 | 好 | 大型项目 |
Terser 压缩配置详解
export default defineConfig({
build: {
minify: 'terser',
terserOptions: {
compress: {
drop_console: true,
drop_debugger: true,
dead_code: true,
conditionals: true,
booleans: true,
loops: true,
functions: true,
variables: true,
properties: true,
strings: true,
numbers: true,
regex: true,
arrays: true,
objects: true,
try_catch: true,
switch: true,
if_return: true,
sequences: true,
evaluate: true,
typeofs: true,
global_defs: {
'@process.env.NODE_ENV': '"production"'
}
},
mangle: {
toplevel: true,
keep_fnames: false,
keep_classnames: false,
properties: {
regex: /^_/
}
},
format: {
comments: false,
beautify: false,
ascii_only: true
}
}
}
})
compress 配置分析 :
drop_console 配置 :
- 好处 :
- 移除所有console语句,减少文件体积
- 提升生产环境性能,避免控制台输出
- 保护敏感信息不被泄露
- 坏处 :
- 移除所有console,包括有用的错误日志
- 可能影响生产环境调试
- 提议 : 生产环境提议开启,但保留error级别的日志
- 替代方案 : 使用条件编译,保留特定级别的日志
drop_debugger 配置 :
- 好处 :
- 移除所有debugger语句
- 避免生产环境意外断点
- 坏处 :
- 可能移除有用的调试代码
- 提议 : 生产环境必须开启
dead_code 配置 :
- 好处 :
- 移除永远不会执行的代码
- 显著减少文件体积
- 提升执行效率
- 坏处 :
- 可能误删某些动态调用的代码
- 注意事项 : 确保代码中没有动态调用被标记为死代码的函数
mangle 配置分析 :
toplevel 配置 :
- 好处 :
- 混淆顶级变量名,减少文件体积
- 增加代码安全性
- 坏处 :
- 可能影响全局变量访问
- 调试困难
- 适用场景 : 库文件、生产环境
keep_fnames 配置 :
- 好处 :
- 保留函数名,便于调试和错误追踪
- 支持依赖注入框架
- 坏处 :
- 增加文件体积
- 降低混淆效果
- 提议 : 开发环境设为true,生产环境设为false
properties 配置 :
- 好处 :
- 混淆对象属性名,进一步减少体积
- 增加代码安全性
- 坏处 :
- 可能破坏某些依赖属性名的代码
- 调试困难
- 注意事项 : 确保代码中没有依赖特定属性名的逻辑
format 配置分析 :
comments 配置 :
- 好处 :
- 移除注释,减少文件体积
- 保护代码逻辑
- 坏处 :
- 移除有用的文档注释
- 影响代码可读性
- 提议 : 生产环境设为false,保留必要的版权信息
beautify 配置 :
- 好处 :
- 美化代码格式,便于阅读
- 坏处 :
- 增加文件体积
- 降低压缩效果
- 提议 : 生产环境设为false
ascii_only 配置 :
- 好处 :
- 确保输出为ASCII字符,避免编码问题
- 提高兼容性
- 坏处 :
- 可能增加文件体积
- 提议 : 国际化项目提议开启
压缩配置最佳实践 :
- 分环境配置 : 开发环境使用esbuild,生产环境使用terser
- 渐进式优化 : 逐步启用压缩选项,测试兼容性
- 性能监控 : 监控压缩后的文件大小和加载性能
- 错误处理 : 保留必要的错误日志,便于生产环境调试
- 兼容性测试 : 充分测试压缩后的代码在各种环境下的表现
C 3.2 CSS 压缩配置
CSS 压缩策略与优化
CSS 压缩的重大性 :
- 减少文件体积 : CSS文件一般包含大量空白字符和注释
- 提升加载速度 : 减少网络传输时间
- 优化渲染性能 : 减少浏览器解析时间
- 缓存优化 : 压缩后的CSS更适合CDN缓存
CSS 压缩工具对比 :
| 工具 | 压缩效果 | 构建速度 | 兼容性 | 推荐场景 | | —
| cssnano | 最好 | 中等 | 最好 | 生产环境 | | esbuild | 中等 | 最快 | 好 | 开发环境 | | clean-css | 好 | 慢 | 最好 | 复杂项目 |
CSS 压缩配置详解
export default defineConfig({
build: {
cssCodeSplit: true,
cssMinify: 'esbuild',
rollupOptions: {
output: {
assetFileNames: (assetInfo) => {
if (assetInfo.name.endsWith('.css')) {
return 'css/[name]-[hash].css'
}
return 'assets/[name]-[hash].[ext]'
}
}
}
},
css: {
postcss: {
plugins: [
require('autoprefixer'),
require('cssnano')({
preset: ['default', {
discardComments: {
removeAll: true
},
normalizeWhitespace: true,
colormin: true,
minifyFontValues: true,
minifySelectors: true,
mergeLonghand: true,
mergeRules: true,
minifyGradients: true,
minifyParams: true,
minifyTimingFunctions: true,
normalizeUrl: true,
orderedValues: true,
reduceIdents: true,
reduceInitial: true,
reduceTransforms: true,
svgo: true,
uniqueSelectors: true
}]
})
]
}
}
})
cssCodeSplit 配置分析 :
- 好处 :
- 将CSS分割到不同的chunk中,支持按需加载
- 减少初始CSS体积,提升首屏加载速度
- 支持动态导入的CSS
- 坏处 :
- 可能增加HTTP请求数
- 增加配置复杂度
- 适用场景 : 大型项目、多页面应用、需要按需加载的项目
- 提议 : 单页面应用可以关闭,多页面应用提议开启
cssMinify 配置分析 :
- esbuild :
- 好处 : 构建速度快,配置简单
- 坏处 : 压缩效果一般
- 适用场景 : 开发环境、小型项目
- cssnano :
- 好处 : 压缩效果最好,功能丰富
- 坏处 : 构建速度较慢
- 适用场景 : 生产环境、大型项目
cssnano 配置详解 :
discardComments 配置 :
- 好处 : 移除所有注释,减少文件体积
- 坏处 : 移除有用的文档注释
- 提议 : 生产环境开启,保留必要的版权信息
normalizeWhitespace 配置 :
- 好处 : 标准化空白字符,减少文件体积
- 坏处 : 可能影响某些CSS的渲染
- 注意事项 : 确保不影响CSS的语义
colormin 配置 :
- 好处 : 优化颜色值,减少文件体积
- 坏处 : 可能改变颜色格式
- 提议 : 开启,一般不会影响视觉效果
minifySelectors 配置 :
- 好处 : 优化选择器,减少文件体积
- 坏处 : 可能影响选择器的可读性
- 注意事项 : 确保不影响CSS的优先级
mergeRules 配置 :
- 好处 : 合并一样的CSS规则,减少重复
- 坏处 : 可能影响CSS的维护性
- 提议 : 开启,可以显著减少文件体积
CSS 压缩最佳实践 :
- 分环境配置 : 开发环境使用esbuild,生产环境使用cssnano
- 渐进式优化 : 逐步启用压缩选项,测试兼容性
- 性能监控 : 监控CSS文件大小和加载性能
- 兼容性测试 : 确保压缩后的CSS在各种浏览器中正常显示
- 缓存策略 : 配置合适的CSS缓存策略
3.3 图片压缩配置
图片压缩的重大性与策略
为什么需要图片压缩?
- 减少文件体积 : 图片一般占据网站总流量的60-80%
- 提升加载速度 : 减少图片加载时间,改善用户体验
- 节省带宽 : 降低服务器带宽消耗和用户流量消耗
- SEO优化 : 提升页面加载速度,有利于搜索引擎排名
图片压缩工具对比 :
| 格式 | 工具 | 压缩效果 | 构建速度 | 兼容性 | 推荐场景 | | —
| JPEG | mozjpeg | 最好 | 中等 | 最好 | 照片、复杂图像 | | PNG | optipng/pngquant | 最好 | 慢/快 | 最好 | 图标、透明图像 | | GIF | gifsicle | 好 | 快 | 最好 | 动画、简单图像 | | SVG | svgo | 最好 | 快 | 好 | 矢量图标、简单图形 |
图片压缩配置详解
import { defineConfig } from 'vite'
import { viteImagemin } from 'vite-plugin-imagemin'
export default defineConfig({ plugins: [ viteImagemin({ gifsicle: { optimizationLevel: 7, interlaced: false }, optipng: { optimizationLevel: 7 }, mozjpeg: { quality: 80 }, pngquant: { quality: [0.8, 0.9], speed: 4 }, svgo: { plugins: [ { name: 'removeViewBox' }, { name: 'removeEmptyAttrs', active: false } ] } }) ] })
gifsicle 配置分析 :
- optimizationLevel :
- 范围 : 1-7,数值越高压缩效果越好
- 提议 : 设置为7,获得最佳压缩效果
- 注意 : 压缩时间会随级别增加而增加
- interlaced :
- 好处 : 渐进式加载,提升用户体验
- 坏处 : 增加文件体积
- 提议 : 大文件开启,小文件关闭
optipng 配置分析 :
- optimizationLevel :
- 范围 : 0-7,数值越高压缩效果越好
- 提议 : 设置为7,获得最佳压缩效果
- 注意 : 压缩时间会显著增加
- 适用场景 : 对PNG压缩要求极高的项目
- 替代方案 : pngquant压缩速度更快,但效果稍差
mozjpeg 配置分析 :
- quality :
- 范围 : 0-100,数值越高质量越好
- 提议 : 设置为80-85,平衡质量和体积
- 注意 : 低于70可能影响图片质量
- 优势 : 相比标准JPEG编码器,压缩效果更好
- 适用场景 : 照片、复杂图像的压缩
pngquant 配置分析 :
- quality :
- 范围 : [0.0-1.0, 0.0-1.0],第一个值是最低质量
- 提议 : 设置为[0.8, 0.9],平衡质量和体积
- 注意 : 过低的质量可能影响图片效果
- speed :
- 范围 : 1-11,数值越高速度越快
- 提议 : 设置为4,平衡速度和效果
- 优势 : 压缩速度快,适合大型项目
svgo 配置分析 :
- removeViewBox :
- 好处 : 移除viewBox属性,减少文件体积
- 坏处 : 可能影响SVG的响应式特性
- 提议 : 如果SVG有固定尺寸,可以开启
- removeEmptyAttrs :
- 好处 : 移除空属性,减少文件体积
- 坏处 : 可能影响某些SVG的渲染
- 提议 : 谨慎使用,充分测试
图片压缩最佳实践 :
- 格式选择 :
- 照片使用JPEG
- 图标和透明图像使用PNG
- 简单图形使用SVG
- 动画使用GIF或WebP
- 质量平衡 :
- 根据用途选择合适的质量参数
- 进行A/B测试,找到最佳平衡点
- 批量处理 :
- 使用自动化工具批量压缩图片
- 建立图片压缩的CI/CD流程
- 监控效果 :
- 监控图片压缩前后的文件大小
- 测试压缩后图片的视觉效果
- 缓存策略 :
- 配置合适的图片缓存策略
- 使用CDN加速图片加载
4. 性能提升
4.1 开发服务器优化
开发服务器性能优化策略
开发服务器性能的重大性 :
- 开发体验 : 快速的开发服务器响应提升开发效率
- 热更新 : 快速的热更新减少等待时间
- 资源加载 : 优化资源加载速度,提升开发体验
- 内存使用 : 合理的内存使用避免系统卡顿
开发服务器优化配置详解
export default defineConfig({
server: {
https: false,
warmup: {
clientFiles: [
'./src/main.js',
'./src/App.vue',
'./src/components/**/*.vue'
]
},
fs: {
strict: false,
allow: ['..']
},
middlewareMode: false,
preTransformRequests: true
},
optimizeDeps: {
esbuildOptions: {
target: 'es2020'
}
}
})
warmup 配置分析 :
- 好处 :
- 提前转换常用文件,减少首次访问的延迟
- 提升开发体验,特别是大型项目
- 减少冷启动时间
- 坏处 :
- 增加开发服务器启动时间
- 占用更多内存
- 适用场景 : 大型项目、组件较多的项目
- 提议 : 只预热真正需要的文件,避免预热过多文件
fs 配置分析 :
- strict: false :
- 好处 : 允许访问项目根目录外的文件
- 坏处 : 可能存在安全风险
- 提议 : 仅在必要时设置为false
- allow 配置 :
- 好处 : 准确控制允许访问的目录
- 坏处 : 配置复杂
- 提议 : 明确指定允许访问的目录
preTransformRequests 配置分析 :
- 好处 :
- 提前转换请求的文件,减少响应时间
- 提升开发体验
- 坏处 :
- 增加服务器负载
- 可能转换不必要的文件
- 提议 : 在性能较好的开发机器上开启
开发服务器性能优化提议 :
- 合理配置预热 : 只预热必要的文件,避免过度预热
- 监控内存使用 : 关注开发服务器的内存使用情况
- 优化文件监听 : 减少不必要的文件监听
- 使用SSD : 使用SSD硬盘提升文件读写性能
- 关闭不必要的服务 : 关闭不需要的开发工具和服务
4.2 构建性能优化
构建性能优化策略
构建性能的重大性 :
- 开发效率 : 快速的构建速度提升开发效率
- CI/CD : 减少CI/CD流程的等待时间
- 资源消耗 : 降低构建过程中的资源消耗
- 用户体验 : 快速部署提升用户体验
构建性能优化配置详解
export default defineConfig({
build: {
target: 'es2020',
reportCompressedSize: false,
chunkSizeWarningLimit: 1000,
rollupOptions: {
external: ['vue', 'vue-router'],
plugins: [
require('rollup-plugin-terser').terser(),
require('rollup-plugin-cleanup')()
]
}
}
})
target 配置分析 :
- 好处 :
- 控制输出代码的兼容性
- 平衡性能和兼容性
- 减少polyfill的需求
- 坏处 :
- 目标过高可能影响旧浏览器兼容性
- 目标过低可能影响现代浏览器性能
- 提议 : 根据目标用户群体选择合适的target
- 性能影响 : 更高的target一般意味着更小的包体积和更好的性能
reportCompressedSize 配置分析 :
- 好处 :
- 显示压缩后的文件大小
- 便于评估压缩效果
- 坏处 :
- 增加构建时间
- 可能影响构建性能
- 提议 : 开发环境可以关闭,生产环境提议开启
chunkSizeWarningLimit 配置分析 :
- 好处 :
- 设置合理的警告阈值
- 避免过度分割导致的性能问题
- 坏处 :
- 阈值设置不当可能错过优化机会
- 提议 : 根据项目特点设置合适的阈值
external 配置分析 :
- 好处 :
- 将依赖标记为外部依赖,不打包到bundle中
- 减少bundle体积
- 提升构建速度
- 坏处 :
- 需要确保外部依赖可用
- 可能影响部署复杂度
- 适用场景 : 库开发、微前端应用
- 注意事项 : 确保外部依赖在运行时可用
构建性能优化提议 :
- 合理设置target : 根据目标用户群体选择合适的target
- 优化依赖 : 移除不必要的依赖,使用按需导入
- 并行构建 : 利用多核CPU进行并行构建
- 缓存策略 : 合理配置构建缓存
- 监控构建时间 : 定期监控构建时间变化
4.3 缓存策略
缓存策略的重大性与配置
缓存策略的重大性 :
- 构建性能 : 合理的缓存策略可以显著提升构建速度
- 开发体验 : 减少重复构建,提升开发效率
- 资源优化 : 避免重复处理一样的资源
- 部署效率 : 优化部署流程,减少不必要的资源传输
缓存策略配置详解
export default defineConfig({
build: {
rollupOptions: {
output: {
entryFileNames: 'js/[name]-[hash].js',
chunkFileNames: 'js/[name]-[hash].js',
assetFileNames: 'assets/[name]-[hash].[ext]',
manifest: true
}
}
},
cacheDir: 'node_modules/.vite',
optimizeDeps: {
force: false
}
})
文件哈希策略分析 :
entryFileNames 配置 :
- 好处 :
- 入口文件变化时自动更新哈希
- 支持长期缓存策略
- 避免缓存问题
- 坏处 :
- 文件内容未变化时哈希也会变化
- 可能影响缓存效果
- 提议 : 使用内容哈希而非时间哈希
chunkFileNames 配置 :
- 好处 :
- 代码分割后的chunk文件支持独立缓存
- 提升缓存效率
- 支持按需加载
- 坏处 :
- 可能产生过多小文件
- 提议 : 合理配置代码分割策略
assetFileNames 配置 :
- 好处 :
- 静态资源支持独立缓存
- 便于CDN缓存配置
- 支持资源版本管理
- 坏处 :
- 配置复杂
- 提议 : 根据资源类型配置不同的缓存策略
manifest 配置分析 :
- 好处 :
- 记录所有构建产物的映射关系
- 支持服务端渲染
- 便于实现自定义资源加载策略
- 坏处 :
- 增加构建产物数量
- 适用场景 : SSR项目、需要准确控制资源加载的项目
cacheDir 配置分析 :
- 好处 :
- 自定义缓存目录位置
- 便于缓存管理
- 支持多项目共享缓存
- 坏处 :
- 配置复杂
- 提议 : 使用默认配置,除非有特殊需求
optimizeDeps.force 配置分析 :
- 好处 :
- 强制重新预构建依赖
- 解决缓存问题
- 坏处 :
- 增加构建时间
- 提议 : 仅在必要时使用
缓存策略最佳实践 :
- 合理使用哈希 : 使用内容哈希而非时间哈希
- 分层缓存 : 不同类型资源使用不同的缓存策略
- 缓存清理 : 定期清理无效缓存
- 监控缓存效果 : 监控缓存命中率
- CDN配置 : 合理配置CDN缓存策略
5. 常用插件
5.1 开发插件
开发插件的重大性与选择
开发插件的作用 :
- 功能扩展 : 为Vite提供额外的功能支持
- 开发体验 : 提升开发效率和体验
- 工具集成 : 集成各种开发工具和框架
- 自动化 : 自动化各种开发任务
开发插件配置详解
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import { VitePWA } from 'vite-plugin-pwa'
import { createHtmlPlugin } from 'vite-plugin-html'
import { viteMockServe } from 'vite-plugin-mock'
import { createSvgIconsPlugin } from 'vite-plugin-svg-icons'
import { resolve } from 'path'
export default defineConfig({ plugins: [ vue({ template: { compilerOptions: { comments: false } } }), VitePWA({ registerType: 'autoUpdate', workbox: { globPatterns: ['**/*.{js,css,html,ico,png,svg}'] }, manifest: { name: 'My App', short_name: 'MyApp', description: 'My App description', theme_color: '#ffffff', icons: [ { src: 'pwa-192x192.png', sizes: '192x192', type: 'image/png' } ] } }), createHtmlPlugin({ minify: true, inject: { data: { title: 'My App', description: 'My App description' } } }), viteMockServe({ mockPath: 'mock', enable: true, watchFiles: true }), createSvgIconsPlugin({ iconDirs: [resolve(process.cwd(), 'src/assets/icons')], symbolId: 'icon-[dir]-[name]' }) ] })
Vue 插件分析 :
- 好处 :
- 提供Vue单文件组件支持
- 支持Vue 3的所有特性
- 热更新支持
- TypeScript支持
- 坏处 :
- 仅适用于Vue项目
- 适用场景 : 所有Vue项目
- 配置提议 : 根据项目需求配置编译器选项
PWA 插件分析 :
- 好处 :
- 将应用转换为PWA
- 支持离线访问
- 支持推送通知
- 提升用户体验
- 坏处 :
- 增加配置复杂度
- 需要处理缓存策略
- 适用场景 : 需要离线访问的应用、移动端应用
- 注意事项 : 需要配置合适的缓存策略
HTML 插件分析 :
- 好处 :
- 自动注入资源到HTML
- 支持HTML压缩
- 支持模板变量
- 坏处 :
- 增加构建复杂度
- 适用场景 : 需要动态HTML生成的项目
- 提议 : 合理配置注入选项
Mock 插件分析 :
- 好处 :
- 提供本地Mock服务
- 支持热更新
- 便于前后端分离开发
- 坏处 :
- 可能掩盖真实API问题
- 适用场景 : 前后端分离项目、API开发阶段
- 注意事项 : 确保Mock数据与真实API一致
SVG 图标插件分析 :
- 好处 :
- 支持SVG图标按需加载
- 减少HTTP请求
- 支持图标优化
- 坏处 :
- 配置复杂
- 适用场景 : 使用大量图标的项目
- 提议 : 合理组织图标目录结构
5.2 构建插件
构建插件的重大性与选择
构建插件的作用 :
- 资源处理 : 处理各种静态资源
- 压缩优化 : 提供各种压缩和优化功能
- 分析工具 : 提供构建分析和监控功能
- 自动化 : 自动化构建过程中的各种任务
构建插件配置详解
import { defineConfig } from 'vite'
import { viteStaticCopy } from 'vite-plugin-static-copy'
import { viteCompression } from 'vite-plugin-compression'
import { viteBuildInfo } from 'vite-plugin-build-info'
import { viteBundleAnalyzer } from 'vite-bundle-analyzer'
export default defineConfig({ plugins: [ viteStaticCopy({ targets: [ { src: 'public/robots.txt', dest: '' }, { src: 'public/sitemap.xml', dest: '' } ] }), viteCompression({ algorithm: 'gzip', ext: '.gz', threshold: 10240, minRatio: 0.8 }), viteCompression({ algorithm: 'brotliCompress', ext: '.br', threshold: 10240, minRatio: 0.8 }), viteBuildInfo({ name: 'My App', version: '1.0.0', buildTime: new Date().toISOString() }), viteBundleAnalyzer({ analyzerMode: 'static', openAnalyzer: false, reportFilename: 'bundle-report.html' }) ] })
静态资源复制插件分析 :
- 好处 :
- 自动复制静态资源到构建目录
- 支持多种资源类型
- 配置简单
- 坏处 :
- 可能复制不必要的文件
- 适用场景 : 需要复制特定文件到构建目录的项目
- 提议 : 明确指定需要复制的文件
压缩插件分析 :
- Gzip压缩 :
- 好处 : 广泛支持,压缩效果好
- 坏处 : 压缩率不如Brotli
- 适用场景 : 需要广泛兼容性的项目
- Brotli压缩 :
- 好处 : 压缩率更高
- 坏处 : 浏览器支持相对较少
- 适用场景 : 现代浏览器项目
- 提议 : 同时配置两种压缩方式
构建信息插件分析 :
- 好处 :
- 自动生成构建信息
- 便于版本管理
- 支持调试
- 坏处 :
- 增加构建产物
- 适用场景 : 需要版本管理的项目
- 提议 : 合理配置构建信息内容
包分析插件分析 :
- 好处 :
- 可视化展示包体积分布
- 便于优化分析
- 支持多种分析模式
- 坏处 :
- 增加构建时间
- 适用场景 : 需要持续优化的项目
- 提议 : 定期进行包分析
5.3 代码质量插件
代码质量插件的重大性与选择
代码质量插件的作用 :
- 代码规范 : 确保代码符合团队规范
- 错误检测 : 提前发现代码错误和问题
- 类型检查 : 提供TypeScript类型检查
- 代码质量 : 提升代码质量和可维护性
代码质量插件配置详解
import { defineConfig } from 'vite'
import eslint from 'vite-plugin-eslint'
import { checker } from 'vite-plugin-checker'
export default defineConfig({ plugins: [ eslint({ cache: false, include: ['src/**/*.vue', 'src/**/*.js', 'src/**/*.ts'] }), checker({ typescript: true, vueTsc: true, eslint: { lintCommand: 'eslint "./src/**/*.{ts,tsx,vue}"' } }) ] })
ESLint 插件分析 :
- 好处 :
- 实时检查代码规范
- 支持多种文件类型
- 可配置检查规则
- 支持缓存提升性能
- 坏处 :
- 可能影响开发体验
- 需要配置合适的规则
- 适用场景 : 所有项目
- 提议 : 配置合适的ESLint规则,避免过于严格
TypeScript 检查插件分析 :
- 好处 :
- 提供TypeScript类型检查
- 支持Vue文件的类型检查
- 集成ESLint检查
- 支持多种检查模式
- 坏处 :
- 增加构建时间
- 需要配置TypeScript
- 适用场景 : TypeScript项目、Vue项目
- 提议 : 合理配置检查选项,平衡性能和检查效果
代码质量插件最佳实践 :
- 合理配置规则 : 根据项目特点配置合适的检查规则
- 渐进式引入 : 逐步引入代码质量检查,避免影响开发体验
- 团队协作 : 确保团队成员都使用一样的代码质量配置
- 持续改善 : 定期更新和优化代码质量配置
- 性能平衡 : 平衡代码质量检查和构建性能
6. 常见踩坑
6.1 路径问题
路径问题的常见缘由与解决方案
路径问题的常见缘由 :
- 相对路径混乱 : 使用过多的相对路径导致路径复杂
- 别名配置错误 : 路径别名配置不正确
- 构建环境差异 : 开发环境和生产环境路径处理不同
- 静态资源处理 : 静态资源的路径处理方式不当
问题 : 静态资源路径错误
import logo from '/src/assets/logo.png'
import logo from '@/assets/logo.png'
import logo from './assets/logo.png'
路径问题的详细分析 :
相对路径问题 :
- 问题 : 使用过多的相对路径,如 ../../../assets/logo.png
- 影响 : 代码可读性差,维护困难,重构时容易出错
- 解决方案 : 使用路径别名,如 @/assets/logo.png
绝对路径问题 :
- 问题 : 使用绝对路径,如 /src/assets/logo.png
- 影响 : 在不同环境下可能无法正确解析
- 解决方案 : 使用相对路径或路径别名
路径别名配置问题 :
- 问题 : 路径别名配置不正确或未配置
- 影响 : 无法使用别名,代码可读性差
- 解决方案 : 正确配置路径别名
解决方案 :
export default defineConfig({
resolve: {
alias: {
'@': resolve(__dirname, 'src'),
'@assets': resolve(__dirname, 'src/assets'),
'@components': resolve(__dirname, 'src/components'),
'@utils': resolve(__dirname, 'src/utils')
}
}
})
路径问题最佳实践 :
- 统一使用别名 : 避免使用相对路径,统一使用路径别名
- 合理组织目录 : 保持清晰的目录结构
- 配置TypeScript : 为路径别名配置TypeScript支持
- 测试验证 : 在不同环境下测试路径解析
- 文档说明 : 在项目文档中说明路径别名规则
6.2 环境变量问题
环境变量问题的常见缘由与解决方案
环境变量问题的常见缘由 :
- API使用错误 : 使用了错误的API来访问环境变量
- 前缀要求 : 忘记了VITE_前缀要求
- 类型问题 : 环境变量类型处理不当
- 配置缺失 : 环境变量配置文件缺失或配置错误
问题 : 环境变量未正确读取
const apiUrl = process.env.VITE_API_URL
const apiUrl = import.meta.env.VITE_API_URL
环境变量问题的详细分析 :
API 使用错误 :
- 问题 : 使用 process.env 而不是 import.meta.env
- 影响 : 无法正确读取环境变量
- 缘由 : Vite使用ES模块的 import.meta.env 而不是Node.js的 process.env
- 解决方案 : 使用 import.meta.env 访问环境变量
前缀要求问题 :
- 问题 : 环境变量没有使用VITE_前缀
- 影响 : 环境变量不会被暴露给客户端
- 缘由 : Vite的安全机制,只有VITE_前缀的变量才会被暴露
- 解决方案 : 所有客户端环境变量都使用VITE_前缀
类型问题 :
- 问题 : 环境变量都是字符串类型,需要类型转换
- 影响 : 可能导致类型错误
- 解决方案 : 正确进行类型转换
配置缺失问题 :
- 问题 : 环境变量配置文件缺失或配置错误
- 影响 : 无法读取环境变量
- 解决方案 : 确保配置文件存在且配置正确
解决方案 :
VITE_API_URL=https:
VITE_APP_TITLE=My App
VITE_DEBUG_MODE=true
export default defineConfig({ define: { __APP_VERSION__: JSON.stringify(process.env.npm_package_version) } })
const apiUrl = import.meta.env.VITE_API_URL const appTitle = import.meta.env.VITE_APP_TITLE const isDebug = import.meta.env.VITE_DEBUG_MODE === 'true'
环境变量问题最佳实践 :
- 使用正确的API : 使用 import.meta.env 而不是 process.env
- 添加VITE_前缀 : 所有客户端环境变量都使用VITE_前缀
- 类型转换 : 正确进行类型转换
- 配置验证 : 验证环境变量配置是否正确
- 文档说明 : 在项目文档中说明环境变量的使用方式
6.3 热更新问题
热更新问题的常见缘由与解决方案
热更新问题的常见缘由 :
- 配置错误 : HMR配置不正确或关闭
- 网络问题 : 开发服务器网络连接问题
- 文件监听问题 : 文件监听配置不当
- 插件冲突 : 插件之间的冲突导致HMR失效
问题 : 热更新不生效
export default defineConfig({
server: {
hmr: false
}
})
export default defineConfig({ server: { hmr: { overlay: true } } })
热更新问题的详细分析 :
配置错误问题 :
- 问题 : HMR被关闭或配置不正确
- 影响 : 无法享受热更新的便利
- 解决方案 : 正确配置HMR选项
网络问题 :
- 问题 : 开发服务器网络连接问题
- 影响 : HMR连接失败
- 解决方案 : 检查网络连接,配置正确的host和port
文件监听问题 :
- 问题 : 文件监听配置不当
- 影响 : 文件变化无法被检测到
- 解决方案 : 配置正确的文件监听选项
插件冲突问题 :
- 问题 : 插件之间的冲突导致HMR失效
- 影响 : HMR功能异常
- 解决方案 : 检查插件配置,解决冲突
热更新问题最佳实践 :
- 正确配置HMR : 确保HMR配置正确
- 检查网络连接 : 确保开发服务器网络连接正常
- 配置文件监听 : 正确配置文件监听选项
- 解决插件冲突 : 检查并解决插件冲突
- 监控HMR状态 : 监控HMR连接状态
6.4 构建问题
构建问题的常见缘由与解决方案
构建问题的常见缘由 :
- 配置错误 : 构建配置不正确
- 依赖问题 : 依赖版本冲突或缺失
- 资源问题 : 静态资源路径错误或缺失
- 插件问题 : 插件配置错误或冲突
问题 : 构建失败
export default defineConfig({
build: {
rollupOptions: {
external: ['vue']
}
}
})
export default defineConfig({ build: { rollupOptions: { external: [] } } })
构建问题的详细分析 :
配置错误问题 :
- 问题 : 构建配置不正确,如错误的external配置
- 影响 : 构建失败或构建结果不正确
- 解决方案 : 检查并修正构建配置
依赖问题 :
- 问题 : 依赖版本冲突或缺失
- 影响 : 构建失败或运行时错误
- 解决方案 : 检查依赖版本,解决冲突
资源问题 :
- 问题 : 静态资源路径错误或缺失
- 影响 : 构建失败或资源加载失败
- 解决方案 : 检查资源路径,确保资源存在
插件问题 :
- 问题 : 插件配置错误或冲突
- 影响 : 构建失败或功能异常
- 解决方案 : 检查插件配置,解决冲突
构建问题最佳实践 :
- 检查配置 : 仔细检查构建配置
- 解决依赖 : 解决依赖版本冲突
- 验证资源 : 确保所有资源路径正确
- 测试构建 : 定期测试构建流程
- 监控构建 : 监控构建时间和结果
6.5 插件冲突问题
插件冲突问题的常见缘由与解决方案
插件冲突问题的常见缘由 :
- 版本冲突 : 插件版本不兼容
- 功能重复 : 多个插件提供一样功能
- 配置冲突 : 插件配置相互冲突
- 依赖冲突 : 插件依赖版本冲突
问题 : 插件版本冲突
npm install vite-plugin-vue2@latest vite-plugin-vue@latest
npm install @vitejs/plugin-vue@latest
插件冲突问题的详细分析 :
版本冲突问题 :
- 问题 : 插件版本不兼容
- 影响 : 构建失败或功能异常
- 解决方案 : 使用兼容的插件版本
功能重复问题 :
- 问题 : 多个插件提供一样功能
- 影响 : 功能冲突或重复处理
- 解决方案 : 选择最适合的插件,移除重复的插件
配置冲突问题 :
- 问题 : 插件配置相互冲突
- 影响 : 功能异常或构建失败
- 解决方案 : 调整插件配置,解决冲突
依赖冲突问题 :
- 问题 : 插件依赖版本冲突
- 影响 : 构建失败或运行时错误
- 解决方案 : 解决依赖版本冲突
解决方案 :
export default defineConfig({
plugins: [
vue({
template: {
compilerOptions: {
}
}
})
]
})
插件冲突问题最佳实践 :
- 版本兼容 : 确保插件版本兼容
- 功能单一 : 避免功能重复的插件
- 配置检查 : 检查插件配置是否冲突
- 依赖管理 : 管理插件依赖版本
- 测试验证 : 充分测试插件配置
7. 高级配置
7.1 多页面应用配置
多页面应用配置的重大性与策略
多页面应用的特点 :
- 多个入口 : 每个页面都有独立的HTML入口
- 独立构建 : 每个页面可以独立构建和部署
- 资源共享 : 页面之间可以共享公共资源
- 灵活部署 : 支持按需部署特定页面
多页面应用配置详解
import { defineConfig } from 'vite'
import { resolve } from 'path'
export default defineConfig({ build: { rollupOptions: { input: { main: resolve(__dirname, 'index.html'), admin: resolve(__dirname, 'admin.html'), mobile: resolve(__dirname, 'mobile.html') } } } })
多页面应用配置分析 :
input 配置 :
- 好处 :
- 支持多个HTML入口
- 每个页面独立构建
- 支持不同的页面配置
- 坏处 :
- 配置复杂
- 构建时间可能增加
- 适用场景 : 多页面应用、管理后台、移动端应用
多页面应用最佳实践 :
- 合理规划页面 : 根据业务需求规划页面结构
- 资源共享 : 合理配置公共资源
- 独立部署 : 支持页面的独立部署
- 性能优化 : 优化每个页面的性能
- 监控分析 : 监控每个页面的性能
7.2 微前端配置
微前端配置的重大性与策略
微前端的特点 :
- 独立开发 : 每个微应用可以独立开发和部署
- 技术栈自由 : 不同微应用可以使用不同的技术栈
- 团队自治 : 不同团队可以独立维护各自的微应用
- 渐进式升级 : 可以渐进式升级整个系统
微前端配置详解
export default defineConfig({
build: {
lib: {
entry: resolve(__dirname, 'src/main.js'),
name: 'MyMicroApp',
fileName: 'my-micro-app'
},
rollupOptions: {
external: ['vue', 'vue-router'],
output: {
globals: {
vue: 'Vue',
'vue-router': 'VueRouter'
}
}
}
}
})
微前端配置分析 :
lib 配置 :
- 好处 :
- 将应用构建为库格式
- 支持微前端架构
- 便于集成到主应用
- 坏处 :
- 配置复杂
- 需要处理依赖问题
- 适用场景 : 微前端应用、组件库开发
external 配置 :
- 好处 :
- 将依赖标记为外部依赖
- 减少bundle体积
- 避免依赖冲突
- 坏处 :
- 需要确保外部依赖可用
- 注意事项 : 确保外部依赖在运行时可用
微前端最佳实践 :
- 依赖管理 : 合理管理微应用之间的依赖
- 通信机制 : 建立微应用之间的通信机制
- 样式隔离 : 确保微应用之间的样式隔离
- 路由管理 : 合理管理微应用的路由
- 监控分析 : 监控微应用的性能和行为
7.3 自定义插件开发
自定义插件开发的重大性与策略
自定义插件的作用 :
- 功能扩展 : 为Vite提供自定义功能
- 自动化 : 自动化各种开发任务
- 工具集成 : 集成各种开发工具
- 性能优化 : 提供性能优化功能
自定义插件开发详解
function myPlugin() {
return {
name: 'my-plugin',
configResolved(config) {
console.log('配置已解析:', config)
},
buildStart() {
console.log('构建开始')
},
transform(code, id) {
if (id.endsWith('.vue')) {
return code
}
}
}
}
export default defineConfig({ plugins: [ myPlugin() ] })
自定义插件开发分析 :
插件结构 :
- name : 插件名称,用于标识插件
- configResolved : 配置解析完成后的钩子
- buildStart : 构建开始时的钩子
- transform : 文件转换钩子
插件开发最佳实践 :
- 明确目标 : 明确插件的功能和目标
- 合理设计 : 设计合理的插件接口
- 充分测试 : 充分测试插件的功能
- 文档说明 : 提供详细的文档说明
- 性能思考 : 思考插件的性能影响
7.4 条件编译
条件编译的重大性与策略
条件编译的作用 :
- 环境区分 : 区分不同环境的代码
- 功能开关 : 控制功能的开启和关闭
- 性能优化 : 移除不需要的代码
- 调试支持 : 提供调试相关的代码
条件编译配置详解
export default defineConfig({
define: {
__DEV__: JSON.stringify(process.env.NODE_ENV === 'development'),
__PROD__: JSON.stringify(process.env.NODE_ENV === 'production'),
__TEST__: JSON.stringify(process.env.NODE_ENV === 'test')
}
})
条件编译配置分析 :
define 配置 :
- 好处 :
- 支持条件编译
- 移除不需要的代码
- 提升性能
- 坏处 :
- 配置复杂
- 可能影响调试
- 适用场景 : 需要环境区分的项目
条件编译最佳实践 :
- 合理使用 : 合理使用条件编译
- 环境区分 : 明确区分不同环境
- 功能开关 : 合理控制功能开关
- 性能思考 : 思考条件编译对性能的影响
- 调试支持 : 提供调试相关的支持
8. 最佳实践
8.1 项目结构
项目结构的重大性与设计原则
项目结构的重大性 :
- 可维护性 : 清晰的结构便于维护和扩展
- 团队协作 : 统一的结构便于团队协作
- 开发效率 : 合理的结构提升开发效率
- 代码质量 : 良好的结构有助于提升代码质量
推荐的项目结构 :
src/
├── components/
│ ├── common/
│ └── business/
├── views/
├── router/
├── store/
├── utils/
├── api/
├── assets/
│ ├── images/
│ ├── icons/
│ └── styles/
├── types/
└── main.js
项目结构设计原则 :
- 模块化 : 按功能模块组织代码
- 分层清晰 : 明确区分不同层次的代码
- 职责单一 : 每个目录都有明确的职责
- 易于扩展 : 结构便于后续扩展
- 团队共识 : 团队成员都理解并遵循结构规范
项目结构最佳实践 :
- 合理分层 : 按照业务逻辑和技术层次合理分层
- 命名规范 : 使用清晰、一致的命名规范
- 文档说明 : 在项目文档中说明结构设计
- 定期重构 : 定期重构和优化项目结构
- 团队培训 : 确保团队成员理解项目结构
8.2 环境配置
环境配置的重大性与策略
环境配置的重大性 :
- 环境隔离 : 不同环境使用不同的配置
- 安全性 : 保护敏感信息
- 灵活性 : 支持不同环境的部署需求
- 维护性 : 便于配置的管理和维护
环境配置策略
const config = {
development: {
apiBaseUrl: 'http://localhost:8080',
enableMock: true,
enableDevtools: true
},
production: {
apiBaseUrl: 'https://api.example.com',
enableMock: false,
enableDevtools: false
},
test: {
apiBaseUrl: 'http://test-api.example.com',
enableMock: true,
enableDevtools: false
}
}
export default config[process.env.NODE_ENV]
环境配置最佳实践 :
- 环境隔离 : 确保不同环境的配置完全隔离
- 敏感信息保护 : 保护敏感信息,不要暴露给客户端
- 配置验证 : 验证配置的正确性和完整性
- 文档说明 : 在文档中说明配置项的含义和用法
- 版本管理 : 对配置进行版本管理
8.3 性能监控
性能监控的重大性与策略
性能监控的重大性 :
- 用户体验 : 监控用户体验相关的性能指标
- 问题发现 : 及时发现性能问题
- 优化指导 : 为性能优化提供数据支持
- 持续改善 : 支持持续的性能改善
性能监控策略
export const performanceMonitor = {
measurePageLoad() {
window.addEventListener('load', () => {
const loadTime = performance.timing.loadEventEnd - performance.timing.navigationStart
console.log('页面加载时间:', loadTime + 'ms')
})
},
measureResourceLoad() {
const observer = new PerformanceObserver((list) => {
list.getEntries().forEach((entry) => {
console.log('资源加载时间:', entry.name, entry.duration + 'ms')
})
})
observer.observe({ entryTypes: ['resource'] })
}
}
性能监控最佳实践 :
- 关键指标 : 监控关键的性能指标
- 实时监控 : 建立实时监控系统
- 数据分析 : 定期分析性能数据
- 优化指导 : 根据监控数据指导优化
- 持续改善 : 持续改善性能监控系统
9. 示例配置
9.1 完整配置示例
生产级Vite配置示例
配置特点 :
- 功能完整 : 包含开发、构建、优化等完整功能
- 性能优化 : 集成了多种性能优化策略
- 开发体验 : 提供了良好的开发体验
- 生产就绪 : 可以直接用于生产环境
完整配置示例
import { defineConfig, loadEnv } from 'vite'
import vue from '@vitejs/plugin-vue'
import { resolve } from 'path'
import { VitePWA } from 'vite-plugin-pwa'
import { createHtmlPlugin } from 'vite-plugin-html'
import { viteMockServe } from 'vite-plugin-mock'
import { createSvgIconsPlugin } from 'vite-plugin-svg-icons'
import { viteCompression } from 'vite-plugin-compression'
import { visualizer } from 'rollup-plugin-visualizer'
export default defineConfig(({ command, mode }) => { const env = loadEnv(mode, process.cwd(), '') return { plugins: [ vue(), createHtmlPlugin({ minify: true, inject: { data: { title: env.VITE_APP_TITLE || 'My App' } } }), VitePWA({ registerType: 'autoUpdate', workbox: { globPatterns: ['**/*.{js,css,html,ico,png,svg}'] } }), viteMockServe({ mockPath: 'mock', enable: command === 'serve' }), createSvgIconsPlugin({ iconDirs: [resolve(process.cwd(), 'src/assets/icons')], symbolId: 'icon-[dir]-[name]' }), viteCompression({ algorithm: 'gzip', ext: '.gz' }), visualizer({ filename: 'dist/stats.html', open: false }) ], resolve: { alias: { '@': resolve(__dirname, 'src'), '@components': resolve(__dirname, 'src/components'), '@utils': resolve(__dirname, 'src/utils'), '@assets': resolve(__dirname, 'src/assets') } }, server: { host: '0.0.0.0', port: 3000, open: true, cors: true, proxy: { '/api': { target: env.VITE_API_BASE_URL, changeOrigin: true, rewrite: (path) => path.replace(/^/api/, '') } } }, build: { outDir: 'dist', assetsDir: 'assets', sourcemap: false, minify: 'terser', terserOptions: { compress: { drop_console: true, drop_debugger: true } }, rollupOptions: { output: { manualChunks: { vendor: ['vue', 'vue-router', 'pinia'], utils: ['lodash-es', 'dayjs', 'axios'] }, chunkFileNames: 'js/[name]-[hash].js', entryFileNames: 'js/[name]-[hash].js', assetFileNames: 'assets/[name]-[hash].[ext]' } } }, css: { preprocessorOptions: { scss: { additionalData: `@import "@/styles/variables.scss";` } } }, optimizeDeps: { include: ['vue', 'vue-router', 'pinia', 'axios'] } } })
配置说明 :
- 插件配置 : 集成了常用的开发和生产插件
- 路径别名 : 配置了常用的路径别名
- 开发服务器 : 配置了开发服务器选项
- 构建配置 : 配置了生产构建选项
- CSS处理 : 配置了CSS预处理器
- 依赖优化 : 配置了依赖预构建选项
使用提议 :
- 根据需求调整 : 根据项目需求调整配置
- 逐步引入 : 可以逐步引入各种配置
- 测试验证 : 充分测试配置的正确性
- 文档维护 : 维护配置文档
- 持续优化 : 持续优化配置
9.2 环境变量配置
环境变量配置示例
环境变量配置的重大性 :
- 环境隔离 : 不同环境使用不同的配置
- 安全性 : 保护敏感信息
- 灵活性 : 支持不同环境的部署需求
- 维护性 : 便于配置的管理和维护
环境变量配置示例
VITE_APP_TITLE=开发环境
VITE_API_BASE_URL=http://localhost:8080
VITE_ENABLE_MOCK=true
VITE_APP_TITLE=生产环境 VITE_API_BASE_URL=https://api.example.com VITE_ENABLE_MOCK=false
VITE_APP_TITLE=测试环境 VITE_API_BASE_URL=http://test-api.example.com VITE_ENABLE_MOCK=true
环境变量配置说明 :
- 开发环境 : 使用本地API,启用Mock服务
- 生产环境 : 使用生产API,禁用Mock服务
- 测试环境 : 使用测试API,启用Mock服务
环境变量配置最佳实践 :
- 命名规范 : 使用清晰的命名规范
- 类型安全 : 确保类型安全
- 默认值 : 提供合理的默认值
- 文档说明 : 在文档中说明配置项
- 版本管理 : 对配置进行版本管理
9.3 构建脚本
构建脚本配置示例
构建脚本的重大性 :
- 自动化 : 自动化构建和部署流程
- 环境管理 : 管理不同环境的构建
- 开发效率 : 提升开发效率
- CI/CD : 支持CI/CD流程
构建脚本配置示例
{
"scripts": {
"dev": "vite",
"build": "vite build",
"build:dev": "vite build --mode development",
"build:test": "vite build --mode test",
"build:prod": "vite build --mode production",
"preview": "vite preview",
"analyze": "vite build --mode production && npx vite-bundle-analyzer dist/stats.html"
}
}
构建脚本说明 :
- dev : 启动开发服务器
- build : 构建生产版本
- build:dev : 构建开发版本
- build:test : 构建测试版本
- build:prod : 构建生产版本
- preview : 预览构建结果
- analyze : 构建并分析包体积
构建脚本最佳实践 :
- 环境区分 : 明确区分不同环境的构建
- 自动化 : 尽可能自动化构建流程
- 错误处理 : 处理构建过程中的错误
- 性能监控 : 监控构建性能
- 文档维护 : 维护构建脚本文档
总结下
关键要点总结
基础配置 :
- 合理配置路径别名 ,提高开发效率和代码可读性
- 正确使用环境变量 ,实现环境隔离和配置管理
- 优化开发服务器配置 ,提升开发体验
打包优化 :
- 优化代码分割策略 ,减少包体积,提升加载速度
- 合理配置预构建 ,提升开发服务器启动速度
- 使用构建分析工具 ,持续优化构建结果
代码压缩 :
- 使用合适的压缩配置 ,平衡压缩效果和构建时间
- 配置CSS压缩 ,减少样式文件体积
- 优化图片压缩 ,提升页面加载速度
性能提升 :
- 配置缓存策略 ,提升构建性能和用户体验
- 优化开发服务器 ,提升开发体验
- 监控性能指标 ,持续优化应用性能
插件管理 :
- 选择合适的插件 ,满足项目需求
- 避免插件冲突 ,确保构建稳定
- 合理配置插件 ,平衡功能和性能
问题解决 :
- 避免常见踩坑 ,减少开发问题
- 掌握调试技巧 ,快速定位和解决问题
- 建立最佳实践 ,提升团队开发效率
持续优化提议
技术更新 :
- 定期更新依赖版本,获取最新特性和性能改善
- 关注Vite官方更新,及时采用新特性
- 学习社区最佳实践,持续改善配置
性能监控 :
- 监控构建性能,识别性能瓶颈
- 分析包体积,持续优化资源加载
- 监控运行时性能,提升用户体验
团队协作 :
- 建立团队配置规范,确保配置一致性
- 定期进行配置评审,持续改善配置
- 分享配置经验,提升团队整体水平
质量保证 :
- 建立配置测试流程,确保配置正确性
- 定期进行配置优化,保持配置最佳状态
- 建立配置文档,便于团队维护
记住
通过合理配置 Vite,可以构建出高性能、可维护的现代前端应用。
记住!!,配置不是一成不变的,需要根据项目需求、团队情况和业务发展不断调整和优化。持续学习、实践和改善,才能构建出真正优秀的前端应用。

收藏了
收藏了,感谢分享