vite.config.ts 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. import vue from '@vitejs/plugin-vue';
  2. import { UserConfig, ConfigEnv, loadEnv, defineConfig } from 'vite';
  3. import AutoImport from 'unplugin-auto-import/vite';
  4. import Components from 'unplugin-vue-components/vite';
  5. import { ElementPlusResolver } from 'unplugin-vue-components/resolvers';
  6. import Icons from 'unplugin-icons/vite';
  7. import IconsResolver from 'unplugin-icons/resolver';
  8. import { createSvgIconsPlugin } from 'vite-plugin-svg-icons';
  9. import UnoCSS from 'unocss/vite';
  10. import path from 'path';
  11. const pathSrc = path.resolve(__dirname, 'src');
  12. export default defineConfig(({ mode }: ConfigEnv): UserConfig => {
  13. const env = loadEnv(mode, process.cwd());
  14. return {
  15. /// 打包相对路径
  16. base:'./',
  17. resolve: {
  18. alias: {
  19. '@': pathSrc
  20. }
  21. },
  22. css: {
  23. // CSS 预处理器
  24. preprocessorOptions: {
  25. //define global scss variable
  26. scss: {
  27. javascriptEnabled: true,
  28. additionalData: `
  29. @use "@/styles/variables.scss" as *;
  30. `
  31. }
  32. }
  33. },
  34. server: {
  35. host: '0.0.0.0',
  36. port: Number(env.VITE_APP_PORT),
  37. open: true, // 运行是否自动打开浏览器
  38. // 反向代理解决跨域
  39. proxy: {
  40. [env.VITE_APP_BASE_API]: {
  41. // 线上接口API地址
  42. target: env.VITE_APP_BASE_URL,
  43. // 本地接口API地址
  44. // target: 'http://192.168.140.73:8089',
  45. changeOrigin: true,
  46. rewrite: path =>
  47. // localhost:3000/dev-api/api/v1/userAction/login → http://192.168.140.73:8089/api/v1/userAction/login
  48. path.replace(new RegExp('^' + env.VITE_APP_BASE_API), '')
  49. }
  50. }
  51. },
  52. plugins: [
  53. vue(),
  54. UnoCSS({
  55. /* options */
  56. }),
  57. AutoImport({
  58. // 自动导入 Vue 相关函数,如:ref, reactive, toRef 等
  59. imports: ['vue', '@vueuse/core'],
  60. eslintrc: {
  61. enabled: false, // Default `false`
  62. filepath: './.eslintrc-auto-import.json', // Default `./.eslintrc-auto-import.json`
  63. globalsPropValue: true // Default `true`, (true | false | 'readonly' | 'readable' | 'writable' | 'writeable')
  64. },
  65. resolvers: [
  66. // 自动导入 Element Plus 相关函数,如:ElMessage, ElMessageBox... (带样式)
  67. ElementPlusResolver(),
  68. // 自动导入图标组件
  69. IconsResolver({})
  70. ],
  71. vueTemplate: true, // 是否在 vue 模板中自动导入
  72. dts: path.resolve(pathSrc, 'types', 'auto-imports.d.ts') // 自动导入组件类型声明文件位置,默认根目录; false 关闭自动生成
  73. }),
  74. Components({
  75. resolvers: [
  76. // 自动注册图标组件
  77. IconsResolver({
  78. enabledCollections: ['ep'] //@iconify-json/ep 是 Element Plus 的图标库
  79. }),
  80. // 自动导入 Element Plus 组件
  81. ElementPlusResolver()
  82. ],
  83. dts: path.resolve(pathSrc, 'types', 'components.d.ts') // 自动导入组件类型声明文件位置,默认根目录; false 关闭自动生成
  84. }),
  85. Icons({
  86. // 自动安装图标库
  87. autoInstall: true
  88. }),
  89. createSvgIconsPlugin({
  90. // 指定需要缓存的图标文件夹
  91. iconDirs: [path.resolve(pathSrc, 'assets/icons')],
  92. // 指定symbolId格式
  93. symbolId: 'icon-[dir]-[name]'
  94. })
  95. ],
  96. optimizeDeps: {
  97. include: [
  98. 'vue',
  99. 'vue-router',
  100. 'pinia',
  101. 'axios',
  102. 'element-plus/es/components/form/style/css',
  103. 'element-plus/es/components/form-item/style/css',
  104. 'element-plus/es/components/button/style/css',
  105. 'element-plus/es/components/input/style/css',
  106. 'element-plus/es/components/input-number/style/css',
  107. 'element-plus/es/components/switch/style/css',
  108. 'element-plus/es/components/upload/style/css',
  109. 'element-plus/es/components/menu/style/css',
  110. 'element-plus/es/components/col/style/css',
  111. 'element-plus/es/components/icon/style/css',
  112. 'element-plus/es/components/row/style/css',
  113. 'element-plus/es/components/tag/style/css',
  114. 'element-plus/es/components/dialog/style/css',
  115. 'element-plus/es/components/loading/style/css',
  116. 'element-plus/es/components/radio/style/css',
  117. 'element-plus/es/components/radio-group/style/css',
  118. 'element-plus/es/components/popover/style/css',
  119. 'element-plus/es/components/scrollbar/style/css',
  120. 'element-plus/es/components/tooltip/style/css',
  121. 'element-plus/es/components/dropdown/style/css',
  122. 'element-plus/es/components/dropdown-menu/style/css',
  123. 'element-plus/es/components/dropdown-item/style/css',
  124. 'element-plus/es/components/sub-menu/style/css',
  125. 'element-plus/es/components/menu-item/style/css',
  126. 'element-plus/es/components/divider/style/css',
  127. 'element-plus/es/components/card/style/css',
  128. 'element-plus/es/components/link/style/css',
  129. 'element-plus/es/components/breadcrumb/style/css',
  130. 'element-plus/es/components/breadcrumb-item/style/css',
  131. 'element-plus/es/components/table/style/css',
  132. 'element-plus/es/components/tree-select/style/css',
  133. 'element-plus/es/components/table-column/style/css',
  134. 'element-plus/es/components/select/style/css',
  135. 'element-plus/es/components/option/style/css',
  136. 'element-plus/es/components/pagination/style/css',
  137. 'element-plus/es/components/tree/style/css',
  138. 'element-plus/es/components/alert/style/css',
  139. '@vueuse/core',
  140. 'path-to-regexp',
  141. 'vue-i18n'
  142. ]
  143. }
  144. };
  145. });