PetAgent/frontend/vite.config.mjs

132 lines
3.2 KiB
JavaScript

/**
* Vite Configuration for AI Pet Companion Frontend
* Sets up development server, build options, and plugin configurations
*/
import { defineConfig, loadEnv } from 'vite'
import vue from '@vitejs/plugin-vue'
import { resolve, dirname } from 'path'
import { fileURLToPath } from 'url'
const __dirname = dirname(fileURLToPath(import.meta.url))
const env = loadEnv(process.env.NODE_ENV || 'development', process.cwd(), '')
const proxyUrl = env.VITE_PROXY_TARGET || env.PROXY_URL || 'http://8.152.169.84:8001'
const serverPort = parseInt(env.VITE_SERVER_PORT) || 3000
function getPackageSubChunk(id, packageName, markers) {
const packagePath = `node_modules/${packageName}/`
const packageIndex = id.indexOf(packagePath)
if (packageIndex === -1) {
return null
}
const relativePath = id.slice(packageIndex + packagePath.length)
for (const marker of markers) {
const markerIndex = relativePath.indexOf(`${marker}/`)
if (markerIndex === -1) {
continue
}
const chunkName = relativePath
.slice(markerIndex + marker.length + 1)
.split('/')[0]
.replace(/[^a-zA-Z0-9_-]/g, '')
if (chunkName) {
return chunkName.toLowerCase()
}
}
return null
}
export default defineConfig({
optimizeDeps: {
include: ['vue', 'vue-router', 'pinia', 'element-plus', 'axios', '@vueuse/core']
},
plugins: [vue()],
resolve: {
alias: {
'@': resolve(__dirname, 'src'),
},
},
server: {
host: '0.0.0.0',
port: serverPort,
open: false,
cors: true,
proxy: {
'/api': {
target: proxyUrl,
changeOrigin: true,
secure: false,
ws: true,
},
'/uploads': {
target: proxyUrl,
changeOrigin: true,
secure: false,
},
'/ws': {
target: proxyUrl,
ws: true,
changeOrigin: true,
}
}
},
build: {
outDir: 'dist',
assetsDir: 'assets',
sourcemap: false,
minify: 'terser',
chunkSizeWarningLimit: 1200,
rollupOptions: {
output: {
manualChunks(id) {
const echartsSubChunk = getPackageSubChunk(id, 'echarts', ['charts', 'components', 'renderers', 'coord', 'features'])
if (echartsSubChunk) {
return `charts-${echartsSubChunk}`
}
if (id.includes('node_modules/echarts')) {
return 'charts'
}
const elementSubChunk = getPackageSubChunk(id, 'element-plus', ['es/components', 'lib/components'])
if (elementSubChunk) {
return `ui-${elementSubChunk}`
}
if (id.includes('node_modules/@element-plus/icons-vue')) {
return 'icons'
}
if (id.includes('node_modules/element-plus')) {
return 'ui'
}
if (id.includes('node_modules/axios') || id.includes('node_modules/@vueuse/core')) {
return 'utils'
}
if (id.includes('node_modules/vue-router') || id.includes('node_modules/vue')) {
return 'vendor'
}
return undefined
}
}
}
},
css: {
preprocessorOptions: {
scss: {
api: 'modern-compiler'
}
}
}
})