import { defineConfig, loadEnv } from "vite"; import path from "path"; import plugins from "./.build/plugins"; import { APP_VERSION, APP_NAME } from "./src/config/version"; // https://vite.dev/config/ export default defineConfig((cnf) => { const { mode } = cnf; const env = loadEnv(mode, process.cwd()); const { VITE_APP_ENV } = env; return { // 注入全局常量,供 index.html 和项目代码使用 define: { __APP_VERSION__: JSON.stringify(APP_VERSION), __APP_NAME__: JSON.stringify(APP_NAME), }, base: VITE_APP_ENV === "production" ? "/" : "/", plugins: plugins(cnf), resolve: { alias: { "@": path.resolve(__dirname, "./src"), "@components": path.resolve(__dirname, "./src/vue-element-plus-y/components"), }, }, css: { // css全局变量使用,@/styles/variable.scss文件 preprocessorOptions: { scss: { additionalData: '@use "@/styles/var.scss" as *;', }, }, }, // 构建优化配置 build: { target: 'es2015', cssTarget: 'chrome80', // 代码分割策略 rollupOptions: { output: { // 分包策略 - 更精细的分割以提高加载速度 manualChunks: (id) => { // Vue 核心库 if (id.includes('node_modules/vue/') || id.includes('node_modules/@vue/') || id.includes('node_modules/vue-router/')) { return 'vue-vendor'; } // Pinia 状态管理 if (id.includes('node_modules/pinia/')) { return 'pinia'; } // Element Plus UI 库 if (id.includes('node_modules/element-plus/') || id.includes('node_modules/@element-plus/')) { return 'element-plus'; } // Markdown 相关 if (id.includes('node_modules/unified/') || id.includes('node_modules/remark-') || id.includes('node_modules/rehype-') || id.includes('node_modules/marked/')) { return 'markdown'; } // 工具库 if (id.includes('node_modules/lodash-es/') || id.includes('node_modules/@vueuse/')) { return 'utils'; } // 代码高亮 if (id.includes('node_modules/highlight.js/') || id.includes('node_modules/shiki/')) { return 'highlight'; } // 图表库 if (id.includes('node_modules/echarts/')) { return 'echarts'; } // PDF 处理 if (id.includes('node_modules/pdfjs-dist/')) { return 'pdf'; } // 其他第三方库 if (id.includes('node_modules/')) { return 'vendor'; } }, // 文件命名 chunkFileNames: 'js/[name]-[hash].js', entryFileNames: 'js/[name]-[hash].js', assetFileNames: (assetInfo) => { const name = assetInfo.name || ''; if (name.endsWith('.css')) { return 'css/[name]-[hash][extname]'; } if (/\.(png|jpe?g|gif|svg|webp|ico)$/.test(name)) { return 'images/[name]-[hash][extname]'; } if (/\.(woff2?|eot|ttf|otf)$/.test(name)) { return 'fonts/[name]-[hash][extname]'; } return '[ext]/[name]-[hash][extname]'; }, }, }, // 压缩配置 minify: 'terser', terserOptions: { compress: { drop_console: VITE_APP_ENV === 'production', drop_debugger: VITE_APP_ENV === 'production', pure_funcs: VITE_APP_ENV === 'production' ? ['console.log', 'console.info'] : [], }, }, // chunk 大小警告限制 chunkSizeWarningLimit: 1000, // 启用 CSS 代码分割 cssCodeSplit: true, // 构建后是否生成 source map sourcemap: VITE_APP_ENV !== 'production', }, // 性能优化 optimizeDeps: { include: [ 'vue', 'vue-router', 'pinia', 'element-plus', '@element-plus/icons-vue', 'lodash-es', '@vueuse/core', '@fortawesome/vue-fontawesome', '@fortawesome/fontawesome-svg-core', '@fortawesome/free-solid-svg-icons', ], // 强制预构建依赖 force: false, // 排除不需要优化的依赖 exclude: [], }, // 预加载设置 preview: { // 预览服务配置 }, // 实验性功能 experimental: { // 启用渲染内联 CSS(提高首次加载速度) renderBuiltUrl(filename, { hostType }) { // 生产环境使用相对路径 if (hostType === 'js') { return { runtime: `window.__assetsPath(${JSON.stringify(filename)})` }; } return { relative: true }; }, }, server: { port: 17001, open: true, proxy: { [env.VITE_WEB_BASE_API]: { target: env.VITE_API_URL, changeOrigin: true, rewrite: (path) => path.replace(`${[env.VITE_WEB_BASE_API]}`, ""), //查看真实代理url bypass(req, res, options) { //@ts-ignore const proxyUrl = new URL(options.rewrite(req.url) || '',(options.target)as string)?.href || ''; req.headers['x-req-proxyUrl'] = proxyUrl res.setHeader('x-res-proxyUrl',proxyUrl) }, } }, }, }; });