vite.config.ts 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  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 useElectronPlugin from './electron-plugin'
  10. import server from './server.config'
  11. const resolvePath = (...args: string[]) => {
  12. return path.resolve(__dirname, ...args)
  13. }
  14. export default defineConfig({
  15. base: '/',
  16. plugins: [
  17. vue(),
  18. vueJsx(),
  19. ElementPlus({ useSource: true }),
  20. createSvgIconsPlugin({
  21. iconDirs: [resolvePath('src/assets/icons')],
  22. symbolId: 'icon-[dir]-[name]',
  23. customDomId: '__svg__icons__dom__',
  24. }),
  25. vueSetupExtend(),
  26. eslint(),
  27. useElectronPlugin(),
  28. ],
  29. resolve: {
  30. extensions: ['.js', '.ts', '.jsx', '.tsx', '.vue', '.json'],
  31. alias: [
  32. { find: '@', replacement: resolvePath('src') },
  33. { find: '@img', replacement: resolvePath('src/assets/images') },
  34. { find: '@style', replacement: resolvePath('src/assets/styles') },
  35. ],
  36. },
  37. css: {
  38. preprocessorOptions: {
  39. scss: {
  40. additionalData: `@use "@style/element/index.scss" as *; \n @use "@style/var.scss" as *;`,
  41. },
  42. },
  43. },
  44. build: {
  45. outDir: 'dist/web',
  46. emptyOutDir: true,
  47. rollupOptions: {
  48. output: {
  49. assetFileNames(assetInfo) {
  50. return `${getExtName(assetInfo.name)}/[name].[hash][extname]`
  51. },
  52. chunkFileNames: 'js/[name].[hash].js',
  53. entryFileNames: 'js/[name].[hash].js',
  54. manualChunks(id, mode) {
  55. const m = manualChunks.find((m) => id.includes(`node_modules/${m}`))
  56. return m ? `third/${m}` : splitVendorChunk()(id, mode)
  57. },
  58. },
  59. },
  60. },
  61. server,
  62. })
  63. const manualChunks = []
  64. const IMAGE_EXT = /\.(png|jpg|jpeg|gif|webp)$/
  65. const SVG_EXT = /\.(svg)$/
  66. const FONT_EXT = /\.(ttf|otf|woff|woff2)$/
  67. const getExtName = (name: string) => {
  68. if (IMAGE_EXT.test(name)) {
  69. return 'image'
  70. } else if (SVG_EXT.test(name)) {
  71. return 'icons'
  72. } else if (FONT_EXT.test(name)) {
  73. return 'fonts'
  74. } else {
  75. return '[ext]'
  76. }
  77. }