import { fileURLToPath, URL } from 'node:url' import { defineConfig } from 'vite' import vue from '@vitejs/plugin-vue' // https://vite.dev/config/ export default defineConfig({ // go:embed + NoRoute SPA 回退(go-api 已实现):history 路由用绝对资源路径 base: '/', plugins: [vue()], resolve: { alias: { '@': fileURLToPath(new URL('./src', import.meta.url)), }, }, // 站内文档(docs/api/*.md、docs/openapi.yaml)位于 web/ 之外,dev server 允许访问 server: { fs: { allow: ['.', '..'], }, // 业务 API 在根路径(/share /chunk /presign /admin,最终版契约),公共接口在 /api/v1。 // /admin 与前端 SPA 路由前缀重叠:GET 且 Accept 含 text/html(浏览器导航/刷新)时 bypass // 回 SPA,其余(fetch/XHR API 调用)代理到后端;embed 后由后端 NoRoute 回退兜底。 proxy: import.meta.env?.VITE_API_BASE ? undefined : { '/api': { target: 'http://127.0.0.1:8466', changeOrigin: true }, '/share': { target: 'http://127.0.0.1:8466', changeOrigin: true }, '/chunk': { target: 'http://127.0.0.1:8466', changeOrigin: true }, '/presign': { target: 'http://127.0.0.1:8466', changeOrigin: true }, '/admin': { target: 'http://127.0.0.1:8466', changeOrigin: true, bypass(req) { if (req.method === 'GET' && (req.headers.accept ?? '').includes('text/html')) { return '/index.html' } return undefined }, }, }, }, build: { outDir: 'dist', assetsDir: 'assets', sourcemap: false, chunkSizeWarningLimit: 1600, rollupOptions: { output: { manualChunks: { swagger: ['swagger-ui-dist'], markdown: ['marked'], }, }, }, }, })