import type { Configuration } from '@rspack/dev-server' import type { Configuration as CustomConfiguration } from '../utils/defineConfig' import setupMockServer from './plugins/mock-server' interface ProxyConfig { context: string[] target: string changeOrigin: boolean onProxyReq: (proxyReq: any) => void } function createProxy(context: string, target: string, origin?: string): ProxyConfig { const url = new URL(origin || target) return { context: [context], target: target, changeOrigin: true, onProxyReq: (proxyReq) => { proxyReq.setHeader('host', url.host) proxyReq.setHeader('origin', url.origin) proxyReq.removeHeader('referer') }, } } export default function getWebpackDevServerConfig( args: any, override: CustomConfiguration ): Configuration { const host = process.env.HOST || '0.0.0.0' const devServer: Configuration = { allowedHosts: 'all', historyApiFallback: true, port: args.port, host, client: { webSocketURL: 'auto://0.0.0.0:0/ws', overlay: { runtimeErrors: false, errors: true, warnings: false, }, }, headers: { 'Access-Control-Allow-Origin': '*', 'Access-Control-Allow-Methods': '*', 'Access-Control-Allow-Headers': '*', }, setupMiddlewares: (middlewares, devServer) => { if (override.mock !== false) { setupMockServer(middlewares, devServer) } return middlewares }, proxy: [ createProxy('/api', 'http://192.168.10.19:3339/qsxxwapdev', 'http://www.zhidianbao.cn'), ], compress: true, } if (override.proxy) { if (Array.isArray(override.proxy)) { devServer.proxy = [...override.proxy, ...(devServer.proxy || [])] } else if (typeof override.proxy === 'object') { const proxies = Object.entries(override.proxy).map(([context, target]) => { return createProxy(context, target as string) }) devServer.proxy = [...proxies, ...(devServer.proxy || [])] } else { throw new Error('proxy 必须是数组或对象') } // 清理重复的代理配置 const proxyMap = new Map() devServer.proxy = (devServer.proxy as ProxyConfig[]).filter((item) => { const key = JSON.stringify([...item.context].sort()) if (!proxyMap.has(key)) { proxyMap.set(key, true) return true } return false }) } return devServer }