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

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