vite.config.ts 3.0 KB

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