vite.config.ts 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. import { UserConfig, ConfigEnv, loadEnv } from 'vite'
  2. import vue from '@vitejs/plugin-vue'
  3. import { resolve } from 'path'
  4. import fs from 'fs'
  5. import { ElementPlusResolver } from 'unplugin-vue-components/resolvers'
  6. fs.writeFile(
  7. './src/utils/build_time.json',
  8. JSON.stringify({
  9. compile_time: new Date().getTime(),
  10. time_zone: Intl.DateTimeFormat().resolvedOptions().timeZone
  11. }),
  12. () => {}
  13. )
  14. // vite项目运行自动检查eslint
  15. import eslintPlugin from 'vite-plugin-eslint'
  16. // 自动导入Vue相关函数和组件
  17. import AutoImport from 'unplugin-auto-import/vite'
  18. // 按需导入组件,包括自定义组件和UI库,vant的函数需要手动引入(函数 + 样式)
  19. import Components from 'unplugin-vue-components/vite'
  20. import { VantResolver } from 'unplugin-vue-components/resolvers'
  21. import { viteMockServe } from 'vite-plugin-mock'
  22. import svgLoader from 'vite-svg-loader'
  23. import { visualizer } from 'rollup-plugin-visualizer'
  24. const CWD = process.cwd()
  25. export default ({ mode }: ConfigEnv): UserConfig => {
  26. // 环境变量
  27. const { VITE_PROXY_TARGET, VITE_HASH, VITE_VISUALIZE, VITE_ASSETS_BASE } = loadEnv(mode, CWD)
  28. // 测试环境不加hash
  29. let output = {
  30. manualChunks: {
  31. vue: ['vue', 'vue-router', 'pinia', '@vueuse/core']
  32. }
  33. }
  34. if (VITE_HASH === 'false') {
  35. const names = {
  36. entryFileNames: `assets.[name].js`,
  37. chunkFileNames: `assets.[name].js`,
  38. assetFileNames: `assets.[name].[ext]`
  39. }
  40. output = { ...output, ...names }
  41. } else {
  42. const names = {
  43. entryFileNames: `assets.[name].[hash].js`,
  44. chunkFileNames: `assets.[name].[hash].js`,
  45. assetFileNames: `assets.[name].[hash].[ext]`
  46. }
  47. output = { ...output, ...names }
  48. }
  49. // 可视化分析
  50. let visualizerPlugin = {}
  51. if (VITE_VISUALIZE === 'true') {
  52. visualizerPlugin = visualizer({
  53. open: true, //注意这里要设置为true,否则无效
  54. gzipSize: true,
  55. brotliSize: true
  56. })
  57. }
  58. return {
  59. plugins: [
  60. vue(),
  61. eslintPlugin(),
  62. AutoImport({
  63. imports: ['vue', 'vue-router', 'pinia'], // 自动导入vue和vue-router相关函数
  64. dts: './auto-import.d.ts', // 生成 `auto-import.d.ts` 全局声明
  65. resolvers: [ElementPlusResolver()],
  66. // 使用自动导入插件,需要在配置相应的eslint,否则eslint以为您没有导入,会报错
  67. eslintrc: {
  68. // true启用。生成一次就可以,避免每次工程启动都生成,一旦生成配置文件之后,最好把enable关掉,即改成false。否则这个文件每次会在重新加载的时候重新生成,这会导致eslint有时会找不到这个文件。当需要更新配置文件的时候,再重新打开
  69. enabled: false, // 默认false
  70. filepath: './.eslintrc-auto-import.json', // 生成json文件,可以不配置该项,默认就是将生成在根目录
  71. globalsPropValue: true
  72. }
  73. }),
  74. Components({
  75. resolvers: [VantResolver(), ElementPlusResolver()]
  76. // dirs: ['src/components'], // 配置需要默认导入的自定义组件文件夹,该文件夹下的所有组件都会自动 import,默认为src/components
  77. }),
  78. {
  79. ...viteMockServe(),
  80. apply: 'serve'
  81. },
  82. svgLoader(),
  83. visualizerPlugin
  84. ],
  85. base: VITE_ASSETS_BASE || '/', // 设置打包路径
  86. server: {
  87. host: '0.0.0.0',
  88. proxy: {
  89. '^/(api|tools)': {
  90. target: VITE_PROXY_TARGET,
  91. changeOrigin: true,
  92. secure: false
  93. }
  94. }
  95. },
  96. resolve: {
  97. alias: [
  98. // 配置 @ 指代 src
  99. {
  100. find: '@',
  101. replacement: resolve(__dirname, './src')
  102. }
  103. ]
  104. },
  105. css: {
  106. // css预处理器
  107. preprocessorOptions: {
  108. scss: {
  109. // 定义全局的scss变量
  110. // 给导入的路径最后加上 ;
  111. additionalData: '@import "@/assets/styles/mixin/index.scss";'
  112. }
  113. }
  114. },
  115. build: {
  116. outDir: mode === 'github' ? 'docs' : `dist-${mode}`,
  117. // 压缩代码
  118. minify: 'terser', // 'terser' 相对较慢,但大多数情况下构建后的文件体积更小。'esbuild' 最小化混淆更快但构建后的文件相对更大。
  119. // 合并小文件
  120. rollupOptions: {
  121. output: output
  122. },
  123. /** 在打包代码时移除 console.log、debugger 和 注释 */
  124. terserOptions: {
  125. compress: {
  126. drop_console: false,
  127. drop_debugger: true,
  128. pure_funcs: ['console.log']
  129. },
  130. format: {
  131. /** 删除注释 */
  132. comments: false
  133. }
  134. },
  135. chunkSizeWarningLimit: 2000
  136. }
  137. }
  138. }