vite.config.ts 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. import fs from "node:fs";
  2. import path from "node:path";
  3. import process from "node:process";
  4. import dayjs from "dayjs";
  5. import { defineConfig, loadEnv } from "vite";
  6. import pkg from "./package.json";
  7. import createVitePlugins from "./vite/plugins";
  8. // https://vitejs.dev/config/
  9. export default defineConfig(({ mode, command }) => {
  10. const env = loadEnv(mode, process.cwd());
  11. // 全局 scss 资源
  12. const scssResources: string[] = [];
  13. fs.readdirSync("src/assets/styles/resources").forEach((dirname) => {
  14. if (fs.statSync(`src/assets/styles/resources/${dirname}`).isFile()) {
  15. scssResources.push(
  16. `@use "/src/assets/styles/resources/${dirname}" as *;`
  17. );
  18. }
  19. });
  20. return {
  21. // 静态资源基础路径
  22. base: env.VITE_BASE_PATH || "/",
  23. // 开发服务器选项 https://cn.vitejs.dev/config/server-options
  24. server: {
  25. open: true,
  26. host: "0.0.0.0", // 监听所有接口
  27. port: 9000,
  28. proxy: {
  29. "/proxy": {
  30. target: env.VITE_APP_API_BASEURL,
  31. changeOrigin: command === "serve" && env.VITE_OPEN_PROXY === "true",
  32. rewrite: (path) => path.replace(/\/proxy/, ""),
  33. },
  34. },
  35. },
  36. // 构建选项 https://cn.vitejs.dev/config/build-options
  37. build: {
  38. outDir: mode === "production" ? "dist" : `dist-${mode}`,
  39. sourcemap: env.VITE_BUILD_SOURCEMAP === "true",
  40. minify: "terser",
  41. terserOptions: {
  42. compress: {
  43. drop_console: true,
  44. drop_debugger: true,
  45. pure_funcs: ["console.log", "console.table"], // 可选
  46. },
  47. },
  48. rollupOptions: {
  49. output: {
  50. manualChunks(id) {
  51. // Vue 核心生态:稳定、基础、几乎不变
  52. if (
  53. id.includes("node_modules/vue") ||
  54. id.includes("node_modules/pinia") ||
  55. id.includes("node_modules/vue-router") ||
  56. id.includes("node_modules/@vue/")
  57. ) {
  58. return "vendor-vue";
  59. }
  60. // Element Plus 及其关联 UI 组件
  61. if (
  62. id.includes("node_modules/element-plus") ||
  63. id.includes("node_modules/@element-plus") ||
  64. id.includes("node_modules/floating-vue") ||
  65. id.includes("node_modules/@headlessui") ||
  66. id.includes("node_modules/overlayscrollbars") ||
  67. id.includes("node_modules/vue-m-message")
  68. ) {
  69. return "vendor-ui";
  70. }
  71. // VueUse 全家桶
  72. if (id.includes("node_modules/@vueuse/")) {
  73. return "vendor-vueuse";
  74. }
  75. // ECharts(独立大体积,按需更新)
  76. if (
  77. id.includes("node_modules/echarts") ||
  78. id.includes("node_modules/zrender")
  79. ) {
  80. return "vendor-echarts";
  81. }
  82. // 办公文档处理相关(一般只有特定页面用,可异步加载)
  83. if (
  84. id.includes("node_modules/@vue-office") ||
  85. id.includes("node_modules/jszip") ||
  86. id.includes("node_modules/html2canvas") ||
  87. id.includes("node_modules/file-saver")
  88. ) {
  89. return "vendor-office";
  90. }
  91. // 通用工具库:使用频繁、体积适中、变更少
  92. if (
  93. id.includes("node_modules/axios") ||
  94. id.includes("node_modules/lodash-es") ||
  95. id.includes("node_modules/dayjs") ||
  96. id.includes("node_modules/qs") ||
  97. id.includes("node_modules/mitt") ||
  98. id.includes("node_modules/decimal.js") ||
  99. id.includes("node_modules/defu") ||
  100. id.includes("node_modules/scule") ||
  101. id.includes("node_modules/path-to-regexp") ||
  102. id.includes("node_modules/chinese-days") ||
  103. id.includes("node_modules/js-pinyin") ||
  104. id.includes("node_modules/hotkeys-js") ||
  105. id.includes("node_modules/nprogress") ||
  106. id.includes("node_modules/mockjs")
  107. ) {
  108. return "vendor-utils";
  109. }
  110. // 其它第三方库(较小的、非核心)
  111. if (id.includes("node_modules")) {
  112. return "vendor-misc";
  113. }
  114. },
  115. },
  116. },
  117. },
  118. define: {
  119. __SYSTEM_INFO__: JSON.stringify({
  120. pkg: {
  121. version: pkg.version,
  122. dependencies: pkg.dependencies,
  123. devDependencies: pkg.devDependencies,
  124. },
  125. lastBuildTime: dayjs().format("YYYY-MM-DD HH:mm:ss"),
  126. }),
  127. },
  128. plugins: createVitePlugins(mode, command === "build"),
  129. resolve: {
  130. alias: {
  131. "@": path.resolve(__dirname, "src"),
  132. "#": path.resolve(__dirname, "src/types"),
  133. },
  134. },
  135. optimizeDeps: {
  136. include: ["@vue-office/docx", "vue-demi"],
  137. },
  138. css: {
  139. preprocessorOptions: {
  140. scss: {
  141. api: "modern-compiler",
  142. additionalData: scssResources.join(""),
  143. },
  144. },
  145. },
  146. };
  147. });