81 lines
3.2 KiB
TypeScript
81 lines
3.2 KiB
TypeScript
import { defineConfig, loadEnv } from 'vite'
|
||
import react from '@vitejs/plugin-react'
|
||
|
||
// 单一配置文件 + 多环境 .env:
|
||
// - .env.development / .env.production / .env.staging 中配置变量
|
||
// - 通过 loadEnv 读取并应用到开发服务器与代理
|
||
export default defineConfig(({ mode }) => {
|
||
const env = loadEnv(mode, '.', '')
|
||
const port = Number(env.VITE_PORT || 5173)
|
||
const open = String(env.VITE_OPEN ?? 'true').toLowerCase() === 'true' || env.VITE_OPEN === '1'
|
||
const proxyTarget = env.VITE_ADMIN_PROXY_PATH || 'http://127.0.0.1:9898'
|
||
|
||
return {
|
||
plugins: [
|
||
react({
|
||
babel: {
|
||
plugins: [
|
||
['@babel/plugin-proposal-decorators', { legacy: true }],
|
||
['babel-plugin-transform-typescript-metadata'],
|
||
['@babel/plugin-proposal-class-properties', { loose: true }],
|
||
['@babel/plugin-proposal-private-methods', { loose: true }],
|
||
['@babel/plugin-proposal-private-property-in-object', { loose: true }]
|
||
]
|
||
}
|
||
})
|
||
],
|
||
server: {
|
||
port,
|
||
open,
|
||
proxy: {
|
||
'/api': {
|
||
target: proxyTarget,
|
||
changeOrigin: true,
|
||
ws: true,
|
||
},
|
||
'/sse': {
|
||
target: 'http://127.0.0.1:8866',
|
||
changeOrigin: true,
|
||
ws: false,
|
||
proxyTimeout: 0,
|
||
timeout: 0,
|
||
headers: { 'Connection': 'keep-alive' },
|
||
rewrite: (path: string) => path.replace(/^\/sse/, '/api'),
|
||
configure: (proxy: any) => {
|
||
proxy.on('proxyReq', (proxyReq: any) => {
|
||
try {
|
||
if (typeof proxyReq.removeHeader === 'function') proxyReq.removeHeader('accept-encoding')
|
||
proxyReq.setHeader('accept', 'text/event-stream')
|
||
proxyReq.setHeader('connection', 'keep-alive')
|
||
} catch {}
|
||
})
|
||
proxy.on('proxyRes', (proxyRes: any, _req: any, res: any) => {
|
||
try {
|
||
proxyRes.headers['content-type'] = 'text/event-stream; charset=utf-8'
|
||
proxyRes.headers['cache-control'] = 'no-cache'
|
||
proxyRes.headers['pragma'] = 'no-cache'
|
||
proxyRes.headers['x-accel-buffering'] = 'no'
|
||
delete proxyRes.headers['content-length']
|
||
delete proxyRes.headers['content-encoding']
|
||
res.setHeader('Content-Type', 'text/event-stream; charset=utf-8')
|
||
res.setHeader('Cache-Control', 'no-cache')
|
||
res.setHeader('Pragma', 'no-cache')
|
||
res.setHeader('X-Accel-Buffering', 'no')
|
||
if (typeof res.removeHeader === 'function') res.removeHeader('Content-Length')
|
||
if (typeof res.removeHeader === 'function') res.removeHeader('Content-Encoding')
|
||
if (typeof res.flushHeaders === 'function') res.flushHeaders()
|
||
} catch {}
|
||
})
|
||
}
|
||
},
|
||
// 新增:WS 独立代理前缀,将 /ws/* 重写到后端 8855 的 /api/*(握手走 WS)
|
||
'/ws': {
|
||
target: 'http://127.0.0.1:8855',
|
||
changeOrigin: true,
|
||
ws: true,
|
||
rewrite: (path: string) => path.replace(/^\/ws/, '/api'),
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}) |