vite.config.ts 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. import { fileURLToPath, URL } from 'node:url'
  2. import { mkdir, readFile, writeFile } from 'node:fs/promises'
  3. import { resolve } from 'node:path'
  4. import { defineConfig, loadEnv, UserConfig, type Plugin, type ResolvedConfig } from 'vite'
  5. import vue from '@vitejs/plugin-vue'
  6. const TRAINING_PAGE_TITLE = '医药代表合规培训'
  7. const TRAINING_PAGE_PATHS = ['compliance-plan', 'compliance-registration', 'training-entry']
  8. const trainingPageHtmlPlugin = (): Plugin => {
  9. let resolvedConfig: ResolvedConfig
  10. return {
  11. name: 'training-page-html',
  12. apply: 'build',
  13. configResolved(config) {
  14. resolvedConfig = config
  15. },
  16. async closeBundle() {
  17. const outputDirectory = resolve(resolvedConfig.root, resolvedConfig.build.outDir)
  18. const indexHtml = await readFile(resolve(outputDirectory, 'index.html'), 'utf8')
  19. const trainingPageHtml = indexHtml.replace(
  20. /<title>.*?<\/title>/,
  21. `<title>${TRAINING_PAGE_TITLE}</title>`,
  22. )
  23. await Promise.all(
  24. TRAINING_PAGE_PATHS.map(async (pagePath) => {
  25. const pageDirectory = resolve(outputDirectory, pagePath)
  26. await mkdir(pageDirectory, { recursive: true })
  27. await writeFile(resolve(pageDirectory, 'index.html'), trainingPageHtml, 'utf8')
  28. }),
  29. )
  30. },
  31. }
  32. }
  33. // https://vite.dev/config/
  34. export default defineConfig(({ mode }): UserConfig => {
  35. const root = process.cwd()
  36. const env = loadEnv(mode, root)
  37. // const isProduction = mode === 'production'
  38. return {
  39. base: '/h5/',
  40. plugins: [vue(), trainingPageHtmlPlugin()].filter(Boolean),
  41. resolve: {
  42. alias: {
  43. '@': fileURLToPath(new URL('./src', import.meta.url)),
  44. },
  45. },
  46. server: {
  47. open: false,
  48. proxy: {
  49. '/api': {
  50. target: env.VITE_APP_URL,
  51. changeOrigin: true,
  52. rewrite: (path) => path.replace(/^\/api/, ''),
  53. },
  54. },
  55. },
  56. build: {
  57. rollupOptions: {
  58. output: {
  59. entryFileNames: `assets/[name].[hash].js`,
  60. chunkFileNames: `assets/[name].[hash].js`,
  61. assetFileNames: `assets/[name].[hash].[ext]`,
  62. // 使用 Vite 原生 manualChunks 替代 chunk-split 插件
  63. manualChunks(id: string) {
  64. if (id.includes('node_modules')) {
  65. if (id.includes('@vant/area-data')) return 'area-data'
  66. if (id.includes('lodash-es')) return 'vendor-lodash'
  67. if (id.includes('echarts')) return 'vendor-echarts'
  68. return 'vendor'
  69. }
  70. },
  71. },
  72. },
  73. },
  74. }
  75. })