import { fileURLToPath, URL } from 'node:url' import { defineConfig,loadEnv } from 'vite' import type { PluginOption } from 'vite' import vue from '@vitejs/plugin-vue' import vueDevTools from 'vite-plugin-vue-devtools' import AutoImport from 'unplugin-auto-import/vite' import Components from 'unplugin-vue-components/vite' import { ElementPlusResolver } from 'unplugin-vue-components/resolvers' function setupPlugins(env: ImportMetaEnv): PluginOption[] { return [ vue(), vueDevTools(), // topLevelAwait(), AutoImport({ resolvers: [ElementPlusResolver()], }), Components({ resolvers: [ElementPlusResolver()], }), ] } export default defineConfig((env) => { const viteEnv = loadEnv(env.mode, process.cwd()) as unknown as ImportMetaEnv return { base: viteEnv.VITE_GLOB_FRONT_CTX, plugins: setupPlugins(viteEnv), server: { host: '0.0.0.0', port: viteEnv.VITE_GLOB_FRONT_PORT, open: false, proxy: { [viteEnv.VITE_GLOB_API_CTX]: { target: viteEnv.VITE_GLOB_API_DEV_IP, changeOrigin: true, // 转发原 Host,让后端能用 X-Forwarded-Host 拼出用户浏览器的实际 URL configure: (proxy) => { proxy.on('proxyReq', (proxyReq, req) => { if (req.headers.host) proxyReq.setHeader('X-Forwarded-Host', req.headers.host) proxyReq.setHeader('X-Forwarded-Proto', 'http') }) }, }, // CAS 回调:service URL 形如 /metalinfo/chat_web_backend/cas/login?ticket=xxx // 把 /metalinfo 前缀去掉转给后端,否则 vite 当前端路由吃掉 [`${viteEnv.VITE_GLOB_FRONT_CTX}${viteEnv.VITE_GLOB_API_CTX}`]: { target: viteEnv.VITE_GLOB_API_DEV_IP, changeOrigin: true, rewrite: (p) => p.replace(new RegExp(`^${viteEnv.VITE_GLOB_FRONT_CTX}`), ''), configure: (proxy) => { proxy.on('proxyReq', (proxyReq, req) => { if (req.headers.host) proxyReq.setHeader('X-Forwarded-Host', req.headers.host) proxyReq.setHeader('X-Forwarded-Proto', 'http') }) }, }, // 工具服务通过 Nginx(:18000) 反代,sub_filter 处理子资源路径 '/pdf/': { target: 'http://localhost:18000', changeOrigin: true, }, '/draw/': { target: 'http://localhost:18000', changeOrigin: true, }, }, }, build: { target: 'esnext', }, resolve: { alias: { '@': fileURLToPath(new URL('./src', import.meta.url)) }, }, } })