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.

106 lines
2.8 KiB

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