vite.config.ts 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. import { resolve } from 'path'
  2. import type { ConfigEnv, UserConfig } from 'vite'
  3. import { loadEnv } from 'vite'
  4. import { createVitePlugins } from './build/vite'
  5. import { exclude, include } from "./build/vite/optimize"
  6. import { visualizer } from 'rollup-plugin-visualizer';
  7. // 👇 引入 obfuscator 插件
  8. import obfuscator from 'rollup-plugin-obfuscator'
  9. // 当前执行node命令时文件夹的地址(工作目录)
  10. const root = process.cwd()
  11. // 路径查找
  12. function pathResolve(dir: string) {
  13. return resolve(root, '.', dir)
  14. }
  15. // https://vitejs.dev/config/
  16. export default ({ command, mode }: ConfigEnv): UserConfig => {
  17. let env = {} as any
  18. const isBuild = command === 'build'
  19. if (!isBuild) {
  20. env = loadEnv((process.argv[3] === '--mode' ? process.argv[4] : process.argv[3]), root)
  21. } else {
  22. env = loadEnv(mode, root)
  23. }
  24. // 是否启用代码混淆(建议仅在生产构建时开启)
  25. const shouldObfuscate = true
  26. return {
  27. base: env.VITE_BASE_PATH,
  28. root: root,
  29. // 服务端渲染
  30. server: {
  31. port: env.VITE_PORT, // 端口号
  32. host: "0.0.0.0",
  33. open: env.VITE_OPEN === 'true',
  34. // 本地跨域代理. 目前注释的原因:暂时没有用途,server 端已经支持跨域
  35. proxy: {
  36. '/dexdev': {
  37. target: 'https://yudao-admin.hofo.co/dexdev',
  38. ws: false,
  39. changeOrigin: true,
  40. rewrite: (path) => path.replace(new RegExp(`^/dexdev`), ''),
  41. },
  42. // '/admin-api/system': {
  43. // target: env.VITE_BASE_URL,
  44. // ws: false,
  45. // changeOrigin: true,
  46. // // rewrite: (path) => path.replace(new RegExp(`^/admin-api`), ''),
  47. // },
  48. // '/admin-api/laboratory': {
  49. // target: env.VITE_BASE_URL2,
  50. // ws: false,
  51. // changeOrigin: true,
  52. // }
  53. },
  54. },
  55. // 项目使用的vite插件。 单独提取到build/vite/plugin中管理
  56. plugins: [
  57. createVitePlugins(),
  58. // visualizer({ open: true }) // 构建后自动打开分析页面
  59. ],
  60. css: {
  61. preprocessorOptions: {
  62. scss: {
  63. additionalData: '@use "@/styles/variables.scss" as *;',
  64. javascriptEnabled: true,
  65. silenceDeprecations: ["legacy-js-api"], // 参考自 https://stackoverflow.com/questions/78997907/the-legacy-js-api-is-deprecated-and-will-be-removed-in-dart-sass-2-0-0
  66. }
  67. }
  68. },
  69. resolve: {
  70. extensions: ['.mjs', '.js', '.ts', '.jsx', '.tsx', '.json', '.scss', '.css'],
  71. alias: [
  72. {
  73. find: 'vue-i18n',
  74. replacement: 'vue-i18n/dist/vue-i18n.cjs.js'
  75. },
  76. {
  77. find: /\@\//,
  78. replacement: `${pathResolve('src')}/`
  79. }
  80. ]
  81. },
  82. build: {
  83. minify: 'terser',
  84. outDir: env.VITE_OUT_DIR || 'dist',
  85. // sourcemap: env.VITE_SOURCEMAP === 'true' ? 'inline' : false,
  86. sourcemap: false, // ❗强烈建议关闭 sourcemap,否则可还原源码,造成隐私泄露
  87. // brotliSize: false,
  88. terserOptions: {
  89. compress: {
  90. drop_debugger: env.VITE_DROP_DEBUGGER === 'true',
  91. drop_console: env.VITE_DROP_CONSOLE === 'true',
  92. // drop_console: false,
  93. ecma: 2020, // 使用新版压缩标准
  94. passes: 2 // 减少压缩轮次(默认3)
  95. },
  96. format: {
  97. comments: false // 移除注释
  98. },
  99. maxWorkers: 4 // 启用多线程
  100. },
  101. chunkSizeWarningLimit: 1500, // 提高 chunk 大小警告阈值
  102. rollupOptions: {
  103. // external: [/^@grapecity-software\/.*/],
  104. output: {
  105. manualChunks: {
  106. echarts: ['echarts'], // 将 echarts 单独打包,参考 https://gitee.com/yudaocode/yudao-ui-admin-vue3/issues/IAB1SX 讨论
  107. spreadSheetsDesignerResourcesCn: ['@grapecity-software/spread-sheets-designer-resources-cn'],
  108. spreadSheetsDesignerResourcesEn: ['@grapecity-software/spread-sheets-designer-resources-en'],
  109. spreadSheets: ['@grapecity-software/spread-sheets'],
  110. spreadExcelio: ['@grapecity-software/spread-excelio'],
  111. spreadSheetsBarcode: ['@grapecity-software/spread-sheets-barcode'],
  112. spreadSheetsCharts: ['@grapecity-software/spread-sheets-charts'],
  113. spreadSheetsDesigner: ['@grapecity-software/spread-sheets-designer'],
  114. spreadSheetsIo: ['@grapecity-software/spread-sheets-io'],
  115. spreadSheetsLanguagepackages: ['@grapecity-software/spread-sheets-languagepackages'],
  116. spreadSheetsPdf: ['@grapecity-software/spread-sheets-pdf'],
  117. spreadSheetsPivotAddon: ['@grapecity-software/spread-sheets-pivot-addon'],
  118. spreadSheetsPrint: ['@grapecity-software/spread-sheets-print'],
  119. spreadSheetsShapes: ['@grapecity-software/spread-sheets-shapes'],
  120. spreadSheetsTablesheet: ['@grapecity-software/spread-sheets-tablesheet'],
  121. spreadSheetsDesignerVue: ['@grapecity-software/spread-sheets-designer-vue'],
  122. }
  123. },
  124. plugins: shouldObfuscate ? [
  125. obfuscator({
  126. // 混淆选项(详细见下文)
  127. options: {
  128. compact: true, // 紧凑输出
  129. controlFlowFlattening: false, // 控制流扁平化(影响性能)
  130. deadCodeInjection: false, // 注入死代码(增加体积)
  131. debugProtection: false, // 调试保护(会导致 devtools 卡顿)
  132. debugProtectionInterval: 0,
  133. disableConsoleOutput: false,
  134. identifierNamesGenerator: 'hexadecimal', // 标识符命名方式
  135. log: false,
  136. renameGlobals: false, // 是否重命名全局变量
  137. selfDefending: true, // 自我防御,防格式化调试
  138. stringArray: true, // 字符串加密存储
  139. stringArrayEncoding: ['base64'], // 编码方式
  140. stringArrayIndexShift: true,
  141. stringArrayRotate: true,
  142. stringArrayShuffle: true,
  143. stringArrayWrappersCount: 1,
  144. stringArrayWrappersChainedCalls: true,
  145. stringArrayThreshold: 0.75,
  146. transformObjectKeys: false,
  147. unicodeEscapeSequence: false, // 使用 \u 编码字符
  148. },
  149. // 指定需要混淆的 chunk 名称或正则匹配
  150. include: [
  151. 'chunk-[a-zA-Z0-9]+\\.js$', // 只混淆 chunks
  152. 'index\\.[a-zA-Z0-9]+\\.js$' // 入口文件
  153. ],
  154. exclude: [
  155. 'assets/locales-*.js', // 排除 locales 分包
  156. 'vendors-*.js',
  157. 'node_modules/**'
  158. ]
  159. })
  160. ]
  161. : []
  162. },
  163. },
  164. optimizeDeps: { include, exclude }
  165. }
  166. }