vite.config.ts 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. import path from 'node:path'
  2. import { defineConfig, splitVendorChunk } from 'vite'
  3. import vue from '@vitejs/plugin-vue'
  4. import vueJsx from '@vitejs/plugin-vue-jsx'
  5. import vueSetupExtend from 'unplugin-vue-setup-extend-plus/vite'
  6. import ElementPlus from 'unplugin-element-plus/vite'
  7. import { createSvgIconsPlugin } from 'vite-plugin-svg-icons'
  8. import eslint from 'vite-plugin-eslint'
  9. import Unocss from 'unocss/vite'
  10. const resolvePath = (...args: string[]) => {
  11. return path.resolve(__dirname, ...args)
  12. }
  13. export default defineConfig({
  14. plugins: [
  15. vue(),
  16. vueJsx(),
  17. ElementPlus(),
  18. createSvgIconsPlugin({
  19. iconDirs: [resolvePath('src/assets/icons')],
  20. symbolId: 'icon-[dir]-[name]',
  21. customDomId: '__svg__icons__dom__',
  22. }),
  23. vueSetupExtend(),
  24. Unocss(),
  25. eslint(),
  26. ],
  27. resolve: {
  28. extensions: ['.js', '.ts', '.jsx', '.tsx', '.vue', '.json'],
  29. alias: [
  30. { find: '@', replacement: resolvePath('src') },
  31. { find: '@img', replacement: resolvePath('src/assets/images') },
  32. { find: '@style', replacement: resolvePath('src/assets/styles') },
  33. ],
  34. },
  35. css: {
  36. preprocessorOptions: {
  37. scss: {
  38. additionalData: `@use "@style/element/index.scss" as *;`,
  39. },
  40. },
  41. },
  42. build: {
  43. rollupOptions: {
  44. output: {
  45. assetFileNames(assetInfo) {
  46. return `${getExtName(assetInfo.name)}/[name].[hash][extname]`
  47. },
  48. chunkFileNames: 'js/[name].[hash].js',
  49. entryFileNames: 'js/[name].[hash].js',
  50. manualChunks(id, mode) {
  51. const m = manualChunks.find((m) => id.includes(`node_modules/${m}`))
  52. return m ? `third/${m}` : splitVendorChunk()(id, mode)
  53. },
  54. },
  55. },
  56. },
  57. server: {
  58. proxy: {},
  59. },
  60. })
  61. const manualChunks = [
  62. 'echarts',
  63. // "lodash-es",
  64. // "dayjs",
  65. // "vue-echarts",
  66. // "element-plus",
  67. // "zrender",
  68. ]
  69. const IMAGE_EXT = /\.(png|jpg|jpeg|gif|webp)$/
  70. const SVG_EXT = /\.(svg)$/
  71. const FONT_EXT = /\.(ttf|otf|woff|woff2)$/
  72. const getExtName = (name: string) => {
  73. if (IMAGE_EXT.test(name)) {
  74. return 'image'
  75. } else if (SVG_EXT.test(name)) {
  76. return 'icons'
  77. } else if (FONT_EXT.test(name)) {
  78. return 'fonts'
  79. } else {
  80. return '[ext]'
  81. }
  82. }