Files
license-manager/frontend/vite.config.ts
T
2025-08-09 01:34:49 +08:00

109 lines
3.7 KiB
TypeScript

import { ConfigEnv, UserConfig, defineConfig, loadEnv } from 'vite'
import viteCompression from 'vite-plugin-compression'
import vue from '@vitejs/plugin-vue'
import path from 'path'
import { visualizer } from 'rollup-plugin-visualizer' // 打包分析插件
// 获取当前时间戳,用于构建输出的文件名
const Timestamp = new Date().getTime();
// 路径解析辅助函数
function _resolve(dir: string) {
return path.resolve(__dirname, dir);
}
export default defineConfig(({ mode }: ConfigEnv): UserConfig => {
// 判断当前是否为生产环境
const isProd = mode === 'production'
// 加载环境变量文件(.env)
const env = loadEnv(mode, process.cwd())
const enableVisualizer = isProd && env.VITE_VISUALIZER === 'true'
return {
// 基础公共路径,从环境变量VITE_ADDRESS_BASE_URL获取
base: env.VITE_ADDRESS_BASE_URL,
// 插件配置
plugins: [
// Vue插件
vue(),
// Gzip压缩插件(仅生产环境启用)
viteCompression({
verbose: true, // 显示压缩日志
disable: !isProd, // 非生产环境禁用
deleteOriginFile: false, // 不删除源文件
threshold: 10240, // 文件大小10KB才压缩
algorithm: 'gzip', // 压缩算法
ext: '.gz', // 压缩文件扩展名
}),
// 打包分析插件(仅在显式启用时生效;容器/CI 默认不打开浏览器)
enableVisualizer && visualizer({ open: false })
].filter(Boolean), // 过滤掉false的插件
// 开发服务器配置
server: {
host: '0.0.0.0', // 监听所有IP
port: 8080, // 端口号
open: true, // 自动打开浏览器
https: false, // 不启用HTTPS
cors: true, // 启用CORS
proxy: { // 代理配置
"/devApi": {
target: "http://104.156.140.42:18888", // 目标服务器
changeOrigin: true, // 修改请求头中的origin为目标URL
rewrite: path => path.replace(/^\/devApi/, "") // 路径重写
},
}
},
// 模块解析配置
resolve: {
alias: { // 路径别名
'@': _resolve('src'), // 源码目录
'@assets': _resolve('src/assets'), // 资源目录
'@views': _resolve('src/views'), // 视图目录
'@components': _resolve('src/components'), // 组件目录
'@utils': _resolve('src/utils'), // 工具函数
'@router': _resolve('src/router'), // 路由配置
'@store': _resolve('src/store'), // 状态管理
}
},
// ESBuild配置
esbuild: {
pure: isProd ? ["console.log", "debugger"] : [] // 生产环境移除console.log和debugger
},
// 构建配置
build: {
minify: 'terser', // 使用terser进行代码压缩
assetsInlineLimit: 8 * 1024, // 小于8KB的资源转为base64
sourcemap: isProd, // 生产环境生成sourcemap
outDir: env.VITE_OUTDIR, // 输出目录(从环境变量获取)
emptyOutDir: true, // 构建前清空输出目录
chunkSizeWarningLimit: 1500, // 块大小警告阈值(KB)
rollupOptions: { // Rollup打包配置
output: {
manualChunks(id) { // 手动分块策略
if (id.includes('node_modules')) {
// 将node_modules中的依赖单独分块
return id.toString().split('node_modules/')[1].split('/')[0].toString();
}
},
// 输出文件命名规则(添加时间戳避免缓存)
chunkFileNames: `static/js/[name]-[hash]${Timestamp}.js`,
entryFileNames: `static/js/[name]-[hash]${Timestamp}.js`,
assetFileNames: `static/[ext]/[name]-[hash]${Timestamp}.[ext]`,
}
}
},
// JSON文件处理配置
json: {
stringify: false
}
}
})