vite.config.ts 1.74 KB
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'],
  }
})