Files
incudal/client/vite.config.ts
2026-06-20 14:26:29 +08:00

110 lines
3.5 KiB
TypeScript

import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import obfuscator from 'rollup-plugin-obfuscator'
import { fileURLToPath, URL } from 'node:url'
export default defineConfig(({ mode }) => {
const isProd = mode === 'production'
return {
// 使用绝对路径根路径,在生产环境中静态资源需要从根路径加载
base: '/',
plugins: [
vue(),
// 代码混淆器(仅生产环境)
// 注意:如果遇到白屏问题,可能是混淆配置过于严格
// 临时禁用混淆以排查问题,确认问题后再启用
// isProd && obfuscator({
// include: ['src/**/*.{js,ts,vue}'],
// exclude: [/node_modules/, /\.html$/],
// options: {
// compact: true,
// controlFlowFlattening: true,
// controlFlowFlatteningThreshold: 0.3,
// identifierNamesGenerator: 'hexadecimal',
// stringArray: true,
// stringArrayEncoding: ['base64'],
// stringArrayThreshold: 0.5,
// debugProtection: false,
// debugProtectionInterval: 0,
// disableConsoleOutput: true,
// }
// }),
].filter(Boolean),
resolve: {
alias: {
'@': fileURLToPath(new URL('./src', import.meta.url))
}
},
server: {
port: 43173,
proxy: {
'/api': {
target: 'http://localhost:8888',
changeOrigin: true,
ws: true,
timeout: 10000,
configure: (proxy, _options) => {
proxy.on('error', (err, _req, res) => {
// Handle proxy errors gracefully
if (res && !res.headersSent) {
res.writeHead(500, {
'Content-Type': 'application/json'
})
res.end(JSON.stringify({ error: 'Proxy error: Backend server may not be ready yet' }))
}
})
proxy.on('proxyReq', (proxyReq, req, _res) => {
// Log proxy requests in development
if (process.env.NODE_ENV === 'development') {
console.log(`[Proxy] ${req.method} ${req.url} -> ${proxyReq.path}`)
}
})
}
}
}
},
build: {
outDir: 'dist',
sourcemap: false,
assetsDir: 'assets',
// 优化代码分割,提升加载性能
rollupOptions: {
output: {
// 使用纯哈希命名,不包含文件名,提高安全性
chunkFileNames: 'assets/[hash].js',
entryFileNames: 'assets/[hash].js',
assetFileNames: 'assets/[hash].[ext]',
// 手动分割代码块,优化缓存和加载
manualChunks: {
// 核心 Vue 库(基础库,缓存利用率高)
'vue-core': ['vue', 'vue-router', 'pinia'],
// 国际化库
'vue-i18n': ['vue-i18n'],
// 网络请求库
'axios': ['axios'],
},
},
onwarn(warning, warn) {
// 忽略 sourcemap 相关警告
if (warning.message?.includes('sourcemap')) return
warn(warning)
}
},
minify: 'terser',
terserOptions: {
compress: {
// 临时保留 console.error 和 console.warn,方便调试白屏问题
drop_console: false, // 临时禁用,方便调试
pure_funcs: ['console.log', 'console.debug', 'console.info'], // 只移除这些
drop_debugger: true,
},
},
},
}
})