import type { UserConfig, ConfigEnv } from 'vite'; import { loadEnv } from 'vite'; import path, { resolve } from 'path'; import { codeInspectorPlugin } from 'code-inspector-plugin'; import { createSvgIconsPlugin } from 'vite-plugin-svg-icons'; import { wrapperEnv } from './build/utils'; import { createVitePlugins } from './build/vite/plugin'; import { OUTPUT_DIR } from './build/constant'; import devProxy from './utils/devProxy'; import pkg from './package.json'; import { formatToDateTime } from './src/utils/dateUtil'; const svg = createSvgIconsPlugin({ // 要缓存的图标文件夹 iconDirs: [path.resolve(__dirname, 'src/assets/icons')], // 执行 icon name 的格式 symbolId: 'icon-[name]', }); const { dependencies, devDependencies, name, version } = pkg; const __APP_INFO__ = { pkg: { dependencies, devDependencies, name, version }, lastBuildTime: formatToDateTime(new Date()), }; function pathResolve(dir: string) { return resolve(process.cwd(), '.', dir); } export default ({ command, mode }: ConfigEnv): UserConfig => { const root = process.cwd(); const env = loadEnv(mode, root); const viteEnv = wrapperEnv(env); const { VITE_PORT, VITE_GLOB_PROD_MOCK, VITE_PROXY } = viteEnv; const prodMock = VITE_GLOB_PROD_MOCK; const isBuild = command === 'build'; return { base: './', publicDir: isBuild ? 'public' : 'public-dev', esbuild: {}, resolve: { alias: [ { find: /\/#\//, replacement: pathResolve('types') + '/', }, { find: '@', replacement: pathResolve('src') + '/', }, ], dedupe: ['vue'], }, plugins: [ createVitePlugins(viteEnv, isBuild, prodMock), svg, codeInspectorPlugin({ bundler: 'vite', openIn: 'reuse', }), ], define: { __APP_INFO__: JSON.stringify(__APP_INFO__), }, css: { devSourcemap: true, preprocessorOptions: { scss: { modifyVars: {}, javascriptEnabled: true, additionalData: `@import "src/styles/var.scss";`, }, }, }, server: { host: true, port: VITE_PORT, proxy: devProxy, // proxy: { // '/api': { // target: '', // changeOrigin: true, // rewrite: (path) => path.replace(/^\/api/, '/api/v1') // } // } }, optimizeDeps: { include: ['dayjs', '@vicons/ionicons5', '@vicons/antd', '@element-plus/icons-vue'], exclude: [], }, build: { target: 'es2015', outDir: OUTPUT_DIR, minify: 'terser', /** * 当 minify 为 minify 或 terser 打开注释 */ terserOptions: { compress: { keep_infinity: true, drop_console: true, }, }, reportCompressedSize: false, chunkSizeWarningLimit: 2000, }, }; };