消毒机设备
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.

110 lines
3.2 KiB

  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. plugins: [
  44. vue(),
  45. AutoImport({
  46. imports: [
  47. 'vue',
  48. 'vue-router',
  49. { vue: ['withModifiers'] },
  50. {
  51. from: 'element-plus/es',
  52. imports: ['TabPaneName'],
  53. type: true,
  54. },
  55. ],
  56. dts: true,
  57. eslintrc: {
  58. enabled: true,
  59. },
  60. resolvers: [ElementPlusResolver({ importStyle: 'sass' })],
  61. }),
  62. eslintPlugin({
  63. cache: false, // 禁用缓存,以确保每次修改后都能及时生效
  64. }),
  65. viteCompression({
  66. verbose: true,
  67. disable: false,
  68. threshold: 10240,
  69. algorithm: 'gzip',
  70. ext: '.gz',
  71. }),
  72. ],
  73. resolve: {
  74. alias: {
  75. '@': resolve(__dirname, './src'),
  76. 'apis': resolve(__dirname, 'src/apis'),
  77. 'assets': resolve(__dirname, 'src/assets'),
  78. 'components': resolve(__dirname, 'src/components'),
  79. 'hooks': resolve(__dirname, 'src/hooks'),
  80. 'libs': resolve(__dirname, 'src/libs'),
  81. 'stores': resolve(__dirname, 'src/stores'),
  82. 'views': resolve(__dirname, 'src/views'),
  83. 'router': resolve(__dirname, 'src/router'),
  84. },
  85. },
  86. css: {
  87. preprocessorOptions: {
  88. scss: {
  89. additionalData: '@use "@/assets/styles/variable.scss" as *;',
  90. },
  91. },
  92. },
  93. // 本地化配置
  94. server: {
  95. open: false,
  96. hmr: true,
  97. port: 3010,
  98. host: '0.0.0.0',
  99. proxy: {
  100. [env.FT_API_BASE]: {
  101. target: env.FT_PROXY,
  102. // secure: false,
  103. changeOrigin: true, // 是否跨域
  104. rewrite: path => path.replace(new RegExp(`^${env.FT_API_BASE}`), 'api'),
  105. },
  106. },
  107. },
  108. }
  109. })