vite.config.ts 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. import { defineConfig, loadEnv } from 'vite'
  2. import vue from '@vitejs/plugin-vue'
  3. import path from 'path'
  4. import Components from 'unplugin-vue-components/vite'
  5. import AutoImport from 'unplugin-auto-import/vite'
  6. import { VantResolver } from 'unplugin-vue-components/resolvers'
  7. export default defineConfig(({ mode }) => {
  8. // 加载环境变量
  9. const env = loadEnv(mode, process.cwd(), '')
  10. const apiBaseUrl = env.VITE_API_BASE_URL || 'http://127.0.0.1:8000'
  11. // 打印代理配置(仅在开发环境)
  12. if (mode === 'development') {
  13. console.log('🔧 Vite Proxy Config:')
  14. console.log(' Target:', apiBaseUrl)
  15. console.log(' Path: /api -> forwarded with /api prefix (no rewrite)')
  16. }
  17. return {
  18. base: './',
  19. server: {
  20. port: 5174,
  21. proxy: {
  22. '/api': {
  23. target: apiBaseUrl,
  24. changeOrigin: true,
  25. secure: false,
  26. configure: (proxy, options) => {
  27. proxy.on('error', (err, req, res) => {
  28. console.log('❌ Proxy error:', err)
  29. })
  30. proxy.on('proxyReq', (proxyReq, req, res) => {
  31. const originalUrl = req.url || ''
  32. const [path, query] = originalUrl.split('?')
  33. const pathParts = path.split('/').filter(Boolean)
  34. // 集合根路径须带尾斜杠;客户端已规范化时勿再追加,避免 /api/inventory// 导致 404
  35. if (pathParts.length === 2 && pathParts[0] === 'api') {
  36. const resource = pathParts[1]
  37. const listResources = ['plans', 'inventory', 'weighing']
  38. if (listResources.includes(resource) && !path.endsWith('/')) {
  39. const newPath = path + '/' + (query ? '?' + query : '')
  40. proxyReq.path = newPath
  41. req.url = newPath
  42. console.log(
  43. `➡️ Proxying: ${req.method} ${originalUrl} -> ${apiBaseUrl}${newPath} (added trailing slash)`
  44. )
  45. return
  46. }
  47. }
  48. console.log(`➡️ Proxying: ${req.method} ${req.url} -> ${apiBaseUrl}${req.url}`)
  49. })
  50. proxy.on('proxyRes', (proxyRes, req, res) => {
  51. console.log(`⬅️ Response: ${req.url} -> ${proxyRes.statusCode}`)
  52. })
  53. }
  54. }
  55. },
  56. host: true
  57. },
  58. resolve: {
  59. alias: {
  60. '@': path.resolve(__dirname, 'src')
  61. }
  62. },
  63. plugins: [
  64. vue(),
  65. Components({
  66. resolvers: [VantResolver()],
  67. dts: 'src/types/components.d.ts',
  68. dirs: ['src/components'],
  69. extensions: ['vue']
  70. }),
  71. AutoImport({
  72. imports: ['vue', 'vue-router', 'pinia'],
  73. dts: 'src/types/auto-imports.d.ts',
  74. eslintrc: {
  75. enabled: true,
  76. filepath: './.auto-import.json',
  77. globalsPropValue: true
  78. }
  79. })
  80. ],
  81. css: {
  82. preprocessorOptions: {
  83. scss: {
  84. additionalData: `@use "@/assets/styles/variables.scss" as *;`
  85. }
  86. }
  87. }
  88. }
  89. })