You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

120 lines
3.4 KiB

2 weeks ago
2 weeks ago
2 weeks ago
  1. import { resolve } from 'node:path'
  2. import vue from '@vitejs/plugin-vue'
  3. import AutoImport from 'unplugin-auto-import/vite'
  4. import { ElementPlusResolver } from 'unplugin-vue-components/resolvers'
  5. import { defineConfig, loadEnv } from 'vite'
  6. import viteCompression from 'vite-plugin-compression'
  7. import eslintPlugin from 'vite-plugin-eslint'
  8. import packageJson from './package.json'
  9. const Timestamp = new Date().getTime()
  10. export default defineConfig(({ mode }) => {
  11. // eslint-disable-next-line node/prefer-global/process
  12. const env = loadEnv(mode, process.cwd(), 'FT_')
  13. return {
  14. define: {
  15. __APP_VERSION__: JSON.stringify(packageJson.version),
  16. },
  17. base: './',
  18. envPrefix: 'FT_',
  19. esbuild: {
  20. // eslint-disable-next-line node/prefer-global/process
  21. drop: process.env.NODE_ENV === 'production' ? ['console'] : [],
  22. },
  23. build: {
  24. sourcemap: false,
  25. outDir: `dist-v${packageJson.version}`,
  26. rollupOptions: {
  27. output: {
  28. manualChunks(id) {
  29. if (id.includes('node_modules')) {
  30. return id.toString().split('node_modules/')[1].split('/')[0].toString()
  31. }
  32. },
  33. chunkFileNames: (chunkInfo) => {
  34. const facadeModuleId = chunkInfo.facadeModuleId
  35. ? chunkInfo.facadeModuleId.split('/')
  36. : []
  37. const fileName = facadeModuleId.slice(-2)[0] || '[name]'
  38. return `js/${fileName}/[name].[hash].${Timestamp}.js`
  39. },
  40. },
  41. },
  42. },
  43. optimizeDeps: {
  44. include: ['pug'],
  45. },
  46. plugins: [
  47. vue({
  48. template: {
  49. preprocessOptions: {
  50. // 配置 Pug 预处理器
  51. pug: {},
  52. },
  53. },
  54. }),
  55. AutoImport({
  56. imports: [
  57. 'vue',
  58. 'vue-router',
  59. { vue: ['withModifiers'] },
  60. {
  61. from: 'element-plus/es',
  62. imports: ['TabPaneName'],
  63. type: true,
  64. },
  65. ],
  66. dts: true,
  67. eslintrc: {
  68. enabled: true,
  69. },
  70. resolvers: [ElementPlusResolver({ importStyle: 'sass' })],
  71. }),
  72. eslintPlugin({
  73. cache: false, // 禁用缓存,以确保每次修改后都能及时生效
  74. }),
  75. viteCompression({
  76. verbose: true,
  77. disable: false,
  78. threshold: 10240,
  79. algorithm: 'gzip',
  80. ext: '.gz',
  81. }),
  82. ],
  83. resolve: {
  84. alias: {
  85. '@': resolve(__dirname, './src'),
  86. 'apis': resolve(__dirname, 'src/apis'),
  87. 'assets': resolve(__dirname, 'src/assets'),
  88. 'components': resolve(__dirname, 'src/components'),
  89. 'hooks': resolve(__dirname, 'src/hooks'),
  90. 'libs': resolve(__dirname, 'src/libs'),
  91. 'stores': resolve(__dirname, 'src/stores'),
  92. 'views': resolve(__dirname, 'src/views'),
  93. 'router': resolve(__dirname, 'src/router'),
  94. },
  95. },
  96. css: {
  97. preprocessorOptions: {
  98. scss: {
  99. additionalData: '@use "@/assets/styles/variable.scss" as *;',
  100. },
  101. },
  102. },
  103. // 本地化配置
  104. server: {
  105. open: false,
  106. hmr: true,
  107. port: 3040,
  108. host: '0.0.0.0',
  109. proxy: {
  110. [env.FT_API_BASE]: {
  111. target: env.FT_PROXY,
  112. // secure: false,
  113. changeOrigin: true, // 是否跨域
  114. rewrite: path => path.replace(new RegExp(`^${env.FT_API_BASE}`), 'api'),
  115. },
  116. },
  117. },
  118. }
  119. })