import { defineConfig, loadEnv } from 'vite' import react from '@vitejs/plugin-react' import path from 'path' import fs from 'fs-extra' // 复制 Monaco Editor 的资源文件 const copyMonacoEditorFiles = () => { return { name: 'copy-monaco-editor', buildStart() { const monacoPath = path.resolve(__dirname, 'node_modules/monaco-editor/min/vs') const targetPath = path.resolve(__dirname, 'public/monaco-editor/min/vs') if (!fs.existsSync(targetPath)) { fs.copySync(monacoPath, targetPath) } } } } export default defineConfig(({ mode }) => { // 加载环境变量 const env = loadEnv(mode, process.cwd(), '') // 开发环境代理目标地址(可通过环境变量配置) const proxyTarget = env.VITE_PROXY_TARGET || 'http://localhost:8080' return { plugins: [ react(), copyMonacoEditorFiles() ], resolve: { alias: { '@': path.resolve(__dirname, 'src') } }, build: { rollupOptions: { output: { manualChunks(id) { // 将 node_modules 分包 if (id.includes('node_modules')) { // React 核心库必须单独打包,避免重复引用 if (id.includes('react') || id.includes('react-dom') || id.includes('scheduler')) { return 'react-vendor'; } // 将大型库单独打包 if (id.includes('react-flow') || id.includes('@xyflow')) { return 'react-flow'; } if (id.includes('antd') || id.includes('@ant-design')) { return 'antd'; } if (id.includes('@radix-ui')) { return 'radix-ui'; } if (id.includes('monaco-editor') || id.includes('@monaco-editor')) { return 'monaco-editor'; } // 其他 node_modules 库打包到 vendor return 'vendor'; } } } } }, server: { port: 3000, proxy: { '/api': { target: proxyTarget, changeOrigin: true, // 打印代理信息 configure: (proxy, _options) => { proxy.on('error', (err, _req, _res) => { console.log('代理错误', err); }); proxy.on('proxyReq', (proxyReq, req, _res) => { console.log('📡 代理请求:', req.method, req.url, '→', proxyTarget); }); } } }, fs: { strict: false, allow: ['..'] } } } })