分享一份项目中使用的vite.config.ts的配置项集合
import { defineConfig } from 'vite';
import vue from '@vitejs/plugin-vue';
import path from 'path';
import AutoImport from 'unplugin-auto-import/vite';
import Components from 'unplugin-vue-components/vite';
// ElementPlus
import { ElementPlusResolver } from 'unplugin-vue-components/resolvers';
// 图标
import Icons from 'unplugin-icons/vite';
import IconsResolver from 'unplugin-icons/resolver';
// mock 数据
import { viteMockServe } from 'vite-plugin-mock';
// 打包体积分析
import { visualizer } from 'rollup-plugin-visualizer';
// Gzip文件压缩
import viteCompression from 'vite-plugin-compression';
// 图片压缩
import viteImagemin from 'vite-plugin-imagemin';
// https://vitejs.dev/config/
export default defineConfig({
plugins: [
vue(),
viteMockServe(),
AutoImport({
resolvers: [
// 自动导入element-plus组件
ElementPlusResolver(),
// 自动导入图标组件
IconsResolver({
prefix: 'Icon',
}),
],
include: [
/\.[tj]sx?$/, // .ts, .tsx, .js, .jsx
/\.vue$/,
/\.vue\?vue/, // .vue
/\.md$/, // .md
],
// 自动导入vue,vue-router, @vueuse/core相关函数,如ref,reactive
imports: ['vue', 'vue-router'],
// 可以选择auto-import.d.ts生成的位置,使用ts建议设置为'src/types/auto-import.d.ts'
dts: 'src/types/auto-import.d.ts',
}), // 自动下载图标
Icons({
autoInstall: true,
compiler: 'vue3',
}),
Components({
resolvers: [
ElementPlusResolver(),
IconsResolver({
// icon前缀默认i,使用方式:<i-ep-xxx/>
// prefix: 'i',
// 指定图标集ep
enabledCollections: ['ep'],
}),
],
dirs: ['src/components'],
// 可以选择components.d.ts生成的位置,使用ts建议设置为'src/types/components.d.ts'
dts: 'src/types/components.d.ts',
}),
// 打包体积分析
visualizer({
open: true,
filename: 'visualizer.html', // 分析图生成的文件名
}),
// 开启Gzip压缩
viteCompression({
verbose: true, // 是否在控制台中输出压缩结果
disable: false,
threshold: 1024, // 如果体积大于阈值,将被压缩,单位为b,体积过小时请不要压缩,以免适得其反
algorithm: 'gzip', // 压缩算法,可选['gzip',' brotliccompress ','deflate ','deflateRaw']
ext: '.gz',
deleteOriginFile: true, // 源文件压缩后是否删除(我为了看压缩后的效果,先选择了true)
}),
// 图片资源压缩
viteImagemin({
gifsicle: {
// gif图片压缩
optimizationLevel: 3, // 选择1到3之间的优化级别
interlaced: false, // 隔行扫描gif进行渐进式渲染
},
optipng: {
// png
optimizationLevel: 7, // 选择0到7之间的优化级别
},
mozjpeg: {
// jpeg
quality: 20, // 压缩质量,范围从0(最差)到100(最佳)。
},
pngquant: {
// png
quality: [0.8, 0.9], // Min和max是介于0(最差)到1(最佳)之间的数字,类似于JPEG。达到或超过最高质量所需的最少量的颜色。如果转换导致质量低于最低质量,图像将不会被保存。
speed: 4, // 压缩速度,1(强力)到11(最快)
},
svgo: {
plugins: [
// svg压缩
{
name: 'removeViewBox',
},
{
name: 'removeEmptyAttrs',
active: false,
},
],
},
}),
],
server: {
port: 3000,
host: '0.0.0.0',
open: false, // 自动打开浏览器
proxy: {
// 字符串简写写法
// '/foo1': 'http://liang.web.com:3001/foo2',
// 选项写法
'/api': {
target: '',
changeOrigin: true,
rewrite: path => path.replace(/^\/api/, ''),
},
// 正则表达式写法
// '^/fallback/.*': {
// target: '',
// changeOrigin: true,
// rewrite: (path) => path.replace(/^\/fallback/, '')
// },
},
},
resolve: {
alias: {
'@': path.resolve(__dirname, './src'), // 设置别名
},
},
css: {
preprocessorOptions: {
// 全局sass变量引入
scss: {
additionalData: '@use "./src/styles/globalVariable/index.scss" as *;',
},
},
},
// 生产环境打包配置
build: {
minify: 'terser',
terserOptions: {
// 去除 console debugger
compress: {
drop_console: true,
drop_debugger: true,
},
},
rollupOptions: {
output: {
chunkFileNames: 'js/[name]-[hash].js', // 引入文件名的名称
entryFileNames: 'js/[name]-[hash].js', // 包的入口文件名称
assetFileNames: '[ext]/[name]-[hash].[ext]', // 资源文件像 字体,图片等
// 最小化拆分包 node_modules的包逐个打包 将需要分离的包单独的打包出来
manualChunks(id) {
// 静态资源分拆打包
if (id.includes('node_modules')) {
return id.toString().split('node_modules/')[1].split('/')[0].toString();
}
},
},
},
},
optimizeDeps: {
include: [],
},
});