Files
smart-project-pricing/前端应用/vite.config.ts
2026-01-31 21:33:06 +08:00

99 lines
2.5 KiB
TypeScript

import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import { resolve } from 'path'
import AutoImport from 'unplugin-auto-import/vite'
import Components from 'unplugin-vue-components/vite'
import { ElementPlusResolver } from 'unplugin-vue-components/resolvers'
import compression from 'vite-plugin-compression'
// https://vitejs.dev/config/
export default defineConfig({
plugins: [
vue(),
// Element Plus 自动导入
AutoImport({
resolvers: [ElementPlusResolver()],
imports: ['vue', 'vue-router', 'pinia'],
dts: 'src/types/auto-imports.d.ts',
}),
Components({
resolvers: [ElementPlusResolver()],
dts: 'src/types/components.d.ts',
}),
// Gzip 压缩
compression({
algorithm: 'gzip',
ext: '.gz',
threshold: 10240, // 大于 10KB 才压缩
}),
],
resolve: {
alias: {
'@': resolve(__dirname, 'src'),
},
},
server: {
host: '0.0.0.0',
port: 3000,
proxy: {
'/api': {
target: 'http://localhost:8000',
changeOrigin: true,
},
},
},
build: {
outDir: 'dist',
sourcemap: false,
minify: 'esbuild',
// 块大小警告阈值
chunkSizeWarningLimit: 500,
rollupOptions: {
output: {
chunkFileNames: 'assets/js/[name]-[hash].js',
entryFileNames: 'assets/js/[name]-[hash].js',
assetFileNames: 'assets/[ext]/[name]-[hash].[ext]',
// 优化的代码分割策略
manualChunks(id) {
// Vue 核心库
if (id.includes('node_modules/vue') ||
id.includes('node_modules/vue-router') ||
id.includes('node_modules/pinia')) {
return 'vue-vendor'
}
// Element Plus
if (id.includes('node_modules/element-plus')) {
return 'element-plus'
}
// ECharts
if (id.includes('node_modules/echarts') ||
id.includes('node_modules/vue-echarts') ||
id.includes('node_modules/zrender')) {
return 'echarts'
}
// 其他第三方库
if (id.includes('node_modules')) {
return 'vendor'
}
},
},
},
// 资源内联阈值
assetsInlineLimit: 4096,
// CSS 代码分割
cssCodeSplit: true,
},
// 预构建优化
optimizeDeps: {
include: [
'vue',
'vue-router',
'pinia',
'axios',
'element-plus',
'echarts',
'vue-echarts',
],
},
})