vite.config.ts 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. import { resolve } from 'node:path';
  2. import { loadEnv } from 'vite';
  3. import vueJsx from '@vitejs/plugin-vue-jsx';
  4. import mkcert from 'vite-plugin-mkcert';
  5. import vue from '@vitejs/plugin-vue';
  6. import checker from 'vite-plugin-checker';
  7. import Components from 'unplugin-vue-components/vite';
  8. import { AntDesignVueResolver } from 'unplugin-vue-components/resolvers';
  9. import Unocss from 'unocss/vite';
  10. import { createSvgIconsPlugin } from 'vite-plugin-svg-icons';
  11. import dayjs from 'dayjs';
  12. import mockServerPlugin from '@admin-pkg/vite-plugin-msw/vite';
  13. import TinymceResourcePlugin from '@admin-pkg/vite-plugin-tinymce-resource';
  14. import Http2Proxy from '@admin-pkg/vite-plugin-http2-proxy';
  15. import Inspector from 'vite-plugin-vue-inspector';
  16. import pkg from './package.json';
  17. import type { UserConfig, ConfigEnv } from 'vite';
  18. const CWD = process.cwd();
  19. // 环境变量
  20. // const BASE_ENV_CONFIG = loadEnv('', CWD);
  21. // const DEV_ENV_CONFIG = loadEnv('development', CWD);
  22. // const PROD_ENV_CONFIG = loadEnv('production', CWD);
  23. const __APP_INFO__ = {
  24. pkg,
  25. lastBuildTime: dayjs().format('YYYY-MM-DD HH:mm:ss'),
  26. };
  27. // https://vitejs.dev/config/
  28. export default ({ command, mode }: ConfigEnv): UserConfig => {
  29. // 环境变量
  30. const { VITE_BASE_URL, VITE_DROP_CONSOLE, VITE_MOCK_IN_PROD, VITE_BASE_API_TARGET_URL } = loadEnv(
  31. mode,
  32. CWD,
  33. );
  34. const isDev = command === 'serve';
  35. const isBuild = command === 'build';
  36. return {
  37. base: VITE_BASE_URL,
  38. define: {
  39. __APP_INFO__: JSON.stringify(__APP_INFO__),
  40. },
  41. resolve: {
  42. alias: [
  43. {
  44. find: '@',
  45. replacement: resolve(__dirname, './src'),
  46. },
  47. ],
  48. },
  49. plugins: [
  50. vue(),
  51. Inspector(),
  52. Unocss(),
  53. vueJsx({
  54. // options are passed on to @vue/babel-plugin-jsx
  55. }),
  56. // 指定 mkcert 的下载源为 coding,从 coding.net 镜像下载证书
  57. mkcert({ source: 'coding' }),
  58. // 开启 http2 代理
  59. Http2Proxy(),
  60. mockServerPlugin({ build: isBuild && VITE_MOCK_IN_PROD === 'true' }),
  61. TinymceResourcePlugin({ baseUrl: '/tinymce-resource/' }),
  62. createSvgIconsPlugin({
  63. // Specify the icon folder to be cached
  64. iconDirs: [resolve(CWD, 'src/assets/icons')],
  65. // Specify symbolId format
  66. symbolId: 'svg-icon-[dir]-[name]',
  67. }),
  68. Components({
  69. dts: 'types/components.d.ts',
  70. types: [
  71. {
  72. from: './src/components/basic/button/',
  73. names: ['AButton'],
  74. },
  75. {
  76. from: 'vue-router',
  77. names: ['RouterLink', 'RouterView'],
  78. },
  79. ],
  80. resolvers: [
  81. AntDesignVueResolver({
  82. importStyle: false, // css in js
  83. exclude: ['Button'],
  84. }),
  85. ],
  86. }),
  87. // https://github.com/fi3ework/vite-plugin-checker
  88. isDev &&
  89. checker({
  90. typescript: true,
  91. // vueTsc: true,
  92. eslint: {
  93. useFlatConfig: true,
  94. lintCommand: 'eslint "./src/**/*.{.vue,ts,tsx}"', // for example, lint .ts & .tsx
  95. },
  96. overlay: {
  97. initialIsOpen: false,
  98. },
  99. }),
  100. ],
  101. css: {
  102. preprocessorOptions: {
  103. less: {
  104. javascriptEnabled: true,
  105. modifyVars: {},
  106. // additionalData: `
  107. // @import '@/styles/variables.less';
  108. // `,
  109. },
  110. },
  111. },
  112. server: {
  113. host: '0.0.0.0',
  114. port: 8089,
  115. open: true,
  116. proxy: {
  117. '^/api': {
  118. // target: 'https://nest-admin.buqiyuan.top',
  119. // target: 'http://127.0.0.1:7501',
  120. target: VITE_BASE_API_TARGET_URL,
  121. changeOrigin: true,
  122. rewrite: (path) => path.replace(/^\/api/, '/api'),
  123. },
  124. '^/upload': {
  125. // target: 'https://nest-admin.buqiyuan.top/upload',
  126. // target: 'http://127.0.0.1:7501/upload',
  127. target: `${VITE_BASE_API_TARGET_URL}/upload`,
  128. changeOrigin: true,
  129. rewrite: (path) => path.replace(new RegExp(`^/upload`), ''),
  130. },
  131. },
  132. // 提前转换和缓存文件以进行预热。可以在服务器启动时提高初始页面加载速度,并防止转换瀑布。
  133. warmup: {
  134. // 请注意,只应该预热频繁使用的文件,以免在启动时过载 Vite 开发服务器
  135. // 可以通过运行 npx vite --debug transform 并检查日志来找到频繁使用的文件
  136. clientFiles: ['./index.html', './src/{components,api}/*'],
  137. },
  138. },
  139. optimizeDeps: {
  140. include: ['lodash-es', 'ant-design-vue/es/locale/zh_CN', 'ant-design-vue/es/locale/en_US'],
  141. },
  142. esbuild: {
  143. pure: VITE_DROP_CONSOLE === 'true' ? ['console.log'] : [],
  144. drop: VITE_DROP_CONSOLE === 'true' ? ['debugger'] : [],
  145. supported: {
  146. // https://github.com/vitejs/vite/pull/8665
  147. 'top-level-await': true,
  148. },
  149. },
  150. build: {
  151. minify: 'esbuild',
  152. cssTarget: 'chrome89',
  153. chunkSizeWarningLimit: 2000,
  154. rollupOptions: {
  155. output: {
  156. // minifyInternalExports: false,
  157. },
  158. onwarn(warning, rollupWarn) {
  159. // ignore circular dependency warning
  160. if (
  161. warning.code === 'CYCLIC_CROSS_CHUNK_REEXPORT' &&
  162. warning.exporter?.includes('src/api/')
  163. ) {
  164. return;
  165. }
  166. rollupWarn(warning);
  167. },
  168. },
  169. },
  170. };
  171. };