vite.config.mts 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. import { ConfigEnv, UserConfigExport } from "vite"
  2. import { resolve } from "path"
  3. import vue from "@vitejs/plugin-vue"
  4. import vueJsx from "@vitejs/plugin-vue-jsx"
  5. import { createSvgIconsPlugin } from "vite-plugin-svg-icons"
  6. import svgLoader from "vite-svg-loader"
  7. import UnoCSS from "unocss/vite"
  8. import electron from "vite-electron-plugin"
  9. import { loadViteEnv } from "vite-electron-plugin/plugin"
  10. import { rmSync } from "fs"
  11. import pkg from "./package.json"
  12. /** 清空 dist */
  13. rmSync("dist", { recursive: true, force: true })
  14. /** 配置项文档:https://cn.vitejs.dev/config */
  15. export default ({ mode }: ConfigEnv): UserConfigExport => {
  16. // const viteEnv = loadEnv(mode, process.cwd()) as ImportMetaEnv
  17. return {
  18. resolve: {
  19. alias: {
  20. /** @ 符号指向 src 目录 */
  21. "@": resolve(__dirname, "./src")
  22. }
  23. },
  24. server: {
  25. /** 是否自动打开浏览器 */
  26. open: false,
  27. /** 设置 host: true 才可以使用 Network 的形式,以 IP 访问项目 */
  28. host: pkg.env.host,
  29. /** 端口号 */
  30. port: pkg.env.port,
  31. /** 预热常用文件,提高初始页面加载速度 */
  32. warmup: {
  33. clientFiles: ["./src/layouts/**/*.vue"]
  34. }
  35. },
  36. build: {
  37. /** 单个 chunk 文件的大小超过 2048KB 时发出警告 */
  38. chunkSizeWarningLimit: 2048,
  39. /** 禁用 gzip 压缩大小报告 */
  40. reportCompressedSize: false,
  41. rollupOptions: {
  42. output: {
  43. /**
  44. * 分块策略
  45. * 1. 注意这些包名必须存在,否则打包会报错
  46. * 2. 如果你不想自定义 chunk 分割策略,可以直接移除这段配置
  47. */
  48. manualChunks: {
  49. vue: ["vue", "vue-router", "pinia"],
  50. element: ["element-plus", "@element-plus/icons-vue"],
  51. vxe: ["vxe-table", "vxe-table-plugin-element", "xe-utils"]
  52. }
  53. }
  54. }
  55. },
  56. /** 混淆器 */
  57. esbuild:
  58. mode === "development"
  59. ? undefined
  60. : {
  61. /** 打包时移除 console.log */
  62. pure: ["console.log"],
  63. /** 打包时移除 debugger */
  64. drop: ["debugger"],
  65. /** 打包时移除所有注释 */
  66. legalComments: "none"
  67. },
  68. /** Vite 插件 */
  69. plugins: [
  70. vue(),
  71. vueJsx(),
  72. /** 将 SVG 静态图转化为 Vue 组件 */
  73. svgLoader({ defaultImport: "url" }),
  74. /** SVG 插件 */
  75. createSvgIconsPlugin({
  76. // Specify the icon folder to be cached
  77. iconDirs: [resolve(process.cwd(), "./src/icons/svg")],
  78. // Specify symbolId format
  79. symbolId: "icon-[dir]-[name]",
  80. inject: "body-first"
  81. }),
  82. /** UnoCSS */
  83. UnoCSS(),
  84. electron({
  85. outDir: "dist",
  86. include: ["script"],
  87. transformOptions: { sourcemap: false },
  88. plugins: [
  89. {
  90. name: "remove-comments",
  91. transform: ({ code }) => {
  92. let content = code
  93. // 匹配 块级注释、行级注释、Region注释
  94. // \s 是匹配所有空白符, 包括换行; \S 非空白符, 不包括换行
  95. const pattern1 = /\/\*[\s\S]*?\*\/|(\s)+\/\/[\s\S]*?[\n]+/g
  96. content = content.replaceAll(pattern1, "\n")
  97. // 匹配 所有空行
  98. const pattern2 = /^\s*[\r\n]/gm
  99. content = content.replaceAll(pattern2, "")
  100. return content
  101. }
  102. },
  103. loadViteEnv()
  104. ]
  105. })
  106. ],
  107. css: {
  108. postcss: {
  109. plugins: [
  110. {
  111. postcssPlugin: "internal:charset-removal",
  112. AtRule: {
  113. charset: (atRule) => {
  114. if (atRule.name === "charset") {
  115. atRule.remove()
  116. }
  117. }
  118. }
  119. }
  120. ]
  121. }
  122. },
  123. clearScreen: false
  124. }
  125. }