import { defineConfig, loadEnv } from 'vite' import path from 'path' import type { ProxyOptions } from 'vite' import tailwindcss from '@tailwindcss/vite' import react from '@vitejs/plugin-react' /** 开发时代理到 PHP;默认 9901,可用 .env.development 的 VITE_DEV_PROXY_TARGET 覆盖 */ function devProxyTarget(mode: string): string { const env = loadEnv(mode, process.cwd(), '') const raw = env.VITE_DEV_PROXY_TARGET?.trim() || 'http://127.0.0.1:9901' return raw.replace(/\/$/, '') } let proxyErrorHintPrinted = false function withProxyErrorHint(target: string): ProxyOptions { return { target, changeOrigin: true, configure(proxy) { proxy.on('error', (err: Error) => { if (proxyErrorHintPrinted) return proxyErrorHintPrinted = true console.error(`\n[vite proxy] ${err.message}`) console.error(`[vite proxy] 无法连接 ${target}(ECONNREFUSED = 该端口没有 PHP 在监听)`) console.error('[vite proxy] 请在新终端执行:') console.error(' cd ../daocheng-api') console.error(' composer run dev') console.error(' 或在本目录执行:npm run api') console.error('[vite proxy] 若后端端口不同,请改 .env.development 里 VITE_DEV_PROXY_TARGET 与之一致。\n') }) }, } } export default defineConfig(({ mode }) => { const target = devProxyTarget(mode) return { server: { port: 9999, strictPort: true, proxy: { '/api': withProxyErrorHint(target), '/uploads': withProxyErrorHint(target), }, }, plugins: [react(), tailwindcss()], resolve: { alias: { '@': path.resolve(__dirname, './src'), }, }, assetsInclude: ['**/*.svg', '**/*.csv'], } })