vite.config.js 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. import vue from "@vitejs/plugin-vue";
  2. import AutoImport from "unplugin-auto-import/vite";
  3. import Components from "unplugin-vue-components/vite";
  4. import { ElementPlusResolver } from "unplugin-vue-components/resolvers";
  5. import tailwindcss from '@tailwindcss/vite'
  6. import { loadEnv } from 'vite'
  7. import { resolve } from 'path'
  8. import { createVitePlugins } from './build/vite/plugin'
  9. import { versionPlugin } from './build/vite/plugin/versionPlugin'
  10. import pkg from './package.json'
  11. import proxy from './build/proxy'
  12. function pathResolve(dir) {
  13. return resolve(process.cwd(), '.', dir)
  14. }
  15. export default({ command, mode }) =>{
  16. const root = process.cwd()
  17. const isBuild = command === 'build'
  18. const viteEnv = loadEnv(mode, root)
  19. const { VITE_BASE, VITE_OUT_DIR, VITE_DROP_DEBUGGER, VITE_DROP_CONSOLE, VITE_PORT } = viteEnv
  20. const now = new Date().getTime()
  21. const customArgs = process.argv.slice(3)
  22. const module = customArgs.find((m) => m.startsWith('module='))?.split('module=')[1]
  23. // const viteBase = module ? `/${VITE_BASE.replace(/\//g, '')}-${module}/` : VITE_BASE
  24. const viteBase = './'
  25. const viteOutDir = module ? `${VITE_OUT_DIR.split('-')[0]}-${module}` : VITE_OUT_DIR
  26. return {
  27. root,
  28. base: viteBase,
  29. define: {
  30. __APP_VERSION__: now,
  31. },
  32. plugins: [
  33. ...createVitePlugins(viteEnv, isBuild),
  34. versionPlugin({
  35. version: now,
  36. }),
  37. // vue(),
  38. tailwindcss(),
  39. AutoImport({
  40. resolvers: [ElementPlusResolver()],
  41. }),
  42. Components({
  43. resolvers: [ElementPlusResolver()],
  44. }),
  45. ],
  46. // resolve: {
  47. // alias: {
  48. // "@": path.resolve(__dirname, "./src"),
  49. // },
  50. // },
  51. css: {
  52. preprocessorOptions: {
  53. scss: {
  54. additionalData: `
  55. @use "@/styles/variables" as *;
  56. @use "@/styles/mixins" as *;
  57. `,
  58. }
  59. }
  60. },
  61. // 路径问题
  62. resolve: {
  63. extensions: ['.mjs', '.js', '.ts', '.jsx', '.tsx', '.json', '.less', '.css'],
  64. alias: [
  65. // @/xxxx => src/xxxx
  66. {
  67. find: /\@\//,
  68. replacement: `${pathResolve('src')}/`,
  69. },
  70. ],
  71. },
  72. build: {
  73. target: 'es2015',
  74. cssTarget: 'chrome83',
  75. outDir: viteOutDir,
  76. sourcemap: false,
  77. brotliSize: false,
  78. // 关闭brotliSize显示可以稍微减少打包时间
  79. reportCompressedSize: false,
  80. // 超大静态资源警告大小
  81. chunkSizeWarningLimit: 1500,
  82. minify: 'terser',
  83. terserOptions: {
  84. compress: {
  85. // 删除所有 debugger
  86. drop_debugger: VITE_DROP_DEBUGGER === 'true',
  87. // 删除所有 console
  88. drop_console: VITE_DROP_CONSOLE === 'true',
  89. },
  90. },
  91. rollupOptions: {
  92. treeshake: true,
  93. output: {
  94. // 设置chunk的文件名格式
  95. chunkFileNames: 'assets/js/[name].[hash].js',
  96. // 设置入口文件的文件名格式
  97. entryFileNames: 'assets/js/[name].[hash].js',
  98. // 设置静态资源文件的文件名格式
  99. assetFileNames: 'assets/[ext]/[name].[hash].[ext]',
  100. // 最小化拆分包
  101. manualChunks(id) {
  102. if (id.includes('node_modules')) {
  103. // 指定需要拆分的第三方库或模块
  104. const dependenciesKeys = Object.keys(pkg.dependencies)
  105. const match = dependenciesKeys.find((item) => {
  106. return id.includes(item)
  107. })
  108. if (match) {
  109. // 合并打包
  110. if (['vue', 'vue-router'].includes(match)) {
  111. return 'vue'
  112. } else if (['element-plus', '@element-plus/icons-vue'].includes(match)) {
  113. return 'element-plus-vendor'
  114. } else {
  115. return match
  116. }
  117. }
  118. }
  119. },
  120. },
  121. },
  122. },
  123. server: {
  124. https: false,
  125. host: true,
  126. port: VITE_PORT,
  127. proxy,
  128. },
  129. test: {
  130. globals: true,
  131. environment: 'jsdom',
  132. },
  133. }
  134. }