vite.config.ts 4.3 KB

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