vite.config.ts 4.0 KB

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