vite.config.ts 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. import { fileURLToPath, URL } from 'node:url'
  2. import { defineConfig } from 'vite'
  3. import vue from '@vitejs/plugin-vue'
  4. import path from 'path'
  5. import { createSvgIconsPlugin } from 'vite-plugin-svg-icons'
  6. import AutoImport from 'unplugin-auto-import/vite' // 自动导入ref等api
  7. // import Components from 'unplugin-vue-components/vite'
  8. // import { ElementPlusResolver } from 'unplugin-vue-components/resolvers'
  9. import rollupPluginVisualizer from 'rollup-plugin-visualizer'
  10. import vitePluginCompression from 'vite-plugin-compression'
  11. import { ViteImageOptimizer } from 'vite-plugin-image-optimizer'
  12. import tailwindcss from '@tailwindcss/vite'
  13. // https://vitejs.dev/config/
  14. export default defineConfig(async ({ command, mode }) => {
  15. process.env.VUE_APP_ENV = mode
  16. let { env } = await import('./sys.config')
  17. return {
  18. define: {
  19. 'process.env.VUE_APP_ENV': JSON.stringify(mode),
  20. __PACK_DATETIME__: JSON.stringify(new Date().toLocaleString()),
  21. },
  22. base: env.BASE_URL || '/',
  23. resolve: {
  24. // https://cn.vitejs.dev/config/#resolve-alias
  25. alias: {
  26. '@': fileURLToPath(new URL('./src', import.meta.url)),
  27. '/@': fileURLToPath(new URL('./src', import.meta.url)),
  28. '~': fileURLToPath(new URL('./src/components', import.meta.url)),
  29. // vue: '@vue/compat',
  30. },
  31. // https://cn.vitejs.dev/config/#resolve-extensions
  32. extensions: ['.mjs', '.js', '.ts', '.jsx', '.tsx', '.json', '.vue'],
  33. },
  34. // vite 相关配置
  35. server: {
  36. port: { development: 2024, test: 2025 }[mode],
  37. host: true,
  38. open: true,
  39. proxy: {
  40. // https://cn.vitejs.dev/config/#server-proxy
  41. '/api': {
  42. target: env.BASE_API,
  43. changeOrigin: true,
  44. rewrite: (p) => p.replace(/^\/api/, ''),
  45. },
  46. },
  47. },
  48. build: {
  49. // minify: 'terser',
  50. reportCompressedSize: false, // 启用/禁用 gzip 压缩大小报告
  51. // modulePreload: false, // { polyfill: false }
  52. // modulePreload: { polyfill: false },
  53. terserOptions: {
  54. compress: {
  55. //生产环境时移除console
  56. drop_console: mode == 'production',
  57. drop_debugger: mode == 'production',
  58. },
  59. },
  60. rollupOptions: {
  61. output: {
  62. assetFileNames: 'assets/[ext]/[name]-[hash][extname]',
  63. chunkFileNames: 'assets/js/[name]-[hash].js',
  64. manualChunks: (id) => {
  65. if (id.includes('assets/icons/svg')) {
  66. return 'icons-svg'
  67. } else if (['quill-image-resize-module', 'Quill'].some((e) => id.includes(e))) {
  68. return 'quill-image-resize-module'
  69. } else if (id.includes('node_modules')) {
  70. return id.split(/node_modules\/(\.store\/)??/)[1]?.split?.('/')[0]
  71. }
  72. },
  73. },
  74. },
  75. },
  76. plugins: [
  77. tailwindcss(),
  78. vue({}),
  79. createSvgIconsPlugin({
  80. iconDirs: [path.resolve(process.cwd(), 'src/assets/icons/svg')],
  81. symbolId: 'icon-[dir]-[name]',
  82. }),
  83. ViteImageOptimizer({
  84. png: {
  85. // https://sharp.pixelplumbing.com/api-output#png
  86. quality: 100,
  87. },
  88. jpeg: {
  89. quality: 100,
  90. },
  91. jpg: {
  92. quality: 100,
  93. },
  94. }),
  95. AutoImport({
  96. imports: ['vue', 'vue-router'],
  97. // // 可以选择auto-import.d.ts生成的位置
  98. // dts: 'src/auto-import.d.ts',
  99. // resolvers: [ElementPlusResolver()],
  100. }),
  101. vitePluginCompression({
  102. // disable: false, // 是否禁用压缩,默认为 false
  103. threshold: 10000, // 启用压缩的文件大小限制,单位是字节,默认为 0, 对大于 10kb 的文件进行压缩
  104. // filter:过滤器,对哪些类型的文件进行压缩,默认为 ‘/.(js|mjs|json|css|html)$/i’
  105. // verbose: true:是否在控制台输出压缩结果,默认为 true
  106. // deleteOriginFile:压缩后是否删除原文件,默认为 false
  107. // algorithm:采用的压缩算法,默认是 gzip
  108. // ext:生成的压缩包后缀
  109. }),
  110. process.env.npm_config_report &&
  111. rollupPluginVisualizer({
  112. emitFile: false, //使用 emitFile 生成文件。 属性为 true,打包后的分析文件会出现在打包好的文件包下;设置为 false ,则会出现在项目根目录下
  113. filename: 'report.html', //生成分析网页文件名
  114. open: false, //在默认用户代理中打开生成的文件
  115. gzipSize: true, //从源代码中收集 gzip 大小并将其显示在图表中
  116. // brotliSize: true, //从源代码中收集 brotli 大小并将其显示在图表中
  117. }),
  118. ],
  119. }
  120. })