vite.config.ts 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. import type { UserConfig, ConfigEnv } from 'vite';
  2. import { loadEnv } from 'vite';
  3. import path, { resolve } from 'path';
  4. import { wrapperEnv } from './build/utils';
  5. import { createVitePlugins } from './build/vite/plugin';
  6. import { OUTPUT_DIR } from './build/constant';
  7. import devProxy from './utils/devProxy';
  8. import pkg from './package.json';
  9. import { formatToDateTime } from './src/utils/dateUtil';
  10. import { createSvgIconsPlugin } from 'vite-plugin-svg-icons';
  11. const svg = createSvgIconsPlugin({
  12. // 要缓存的图标文件夹
  13. iconDirs: [path.resolve(__dirname, 'src/assets/icons')],
  14. // 执行 icon name 的格式
  15. symbolId: 'icon-[name]',
  16. });
  17. const { dependencies, devDependencies, name, version } = pkg;
  18. const __APP_INFO__ = {
  19. pkg: { dependencies, devDependencies, name, version },
  20. lastBuildTime: formatToDateTime(new Date()),
  21. };
  22. function pathResolve(dir: string) {
  23. return resolve(process.cwd(), '.', dir);
  24. }
  25. export default ({ command, mode }: ConfigEnv): UserConfig => {
  26. const root = process.cwd();
  27. const env = loadEnv(mode, root);
  28. const viteEnv = wrapperEnv(env);
  29. const { VITE_PORT, VITE_GLOB_PROD_MOCK, VITE_PROXY } = viteEnv;
  30. const prodMock = VITE_GLOB_PROD_MOCK;
  31. const isBuild = command === 'build';
  32. return {
  33. base: './',
  34. publicDir: isBuild ? 'public' : 'public-dev',
  35. esbuild: {},
  36. resolve: {
  37. alias: [
  38. {
  39. find: /\/#\//,
  40. replacement: pathResolve('types') + '/',
  41. },
  42. {
  43. find: '@',
  44. replacement: pathResolve('src') + '/',
  45. },
  46. ],
  47. dedupe: ['vue'],
  48. },
  49. plugins: [createVitePlugins(viteEnv, isBuild, prodMock), svg],
  50. define: {
  51. __APP_INFO__: JSON.stringify(__APP_INFO__),
  52. },
  53. css: {
  54. devSourcemap: true,
  55. preprocessorOptions: {
  56. scss: {
  57. modifyVars: {},
  58. javascriptEnabled: true,
  59. additionalData: `@import "src/styles/var.scss";`,
  60. },
  61. },
  62. },
  63. server: {
  64. host: true,
  65. port: VITE_PORT,
  66. proxy: devProxy,
  67. // proxy: {
  68. // '/api': {
  69. // target: '',
  70. // changeOrigin: true,
  71. // rewrite: (path) => path.replace(/^\/api/, '/api/v1')
  72. // }
  73. // }
  74. },
  75. optimizeDeps: {
  76. include: ['dayjs', '@vicons/ionicons5', '@vicons/antd', '@element-plus/icons-vue'],
  77. exclude: [],
  78. },
  79. build: {
  80. target: 'es2015',
  81. outDir: OUTPUT_DIR,
  82. minify: 'terser',
  83. /**
  84. * 当 minify 为 minify 或 terser 打开注释
  85. */
  86. terserOptions: {
  87. compress: {
  88. keep_infinity: true,
  89. drop_console: true,
  90. },
  91. },
  92. reportCompressedSize: false,
  93. chunkSizeWarningLimit: 2000,
  94. },
  95. };
  96. };