vite.config.ts 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. import { resolve } from 'path';
  2. import type { UserConfig, Plugin as VitePlugin } from 'vite';
  3. import visualizer from 'rollup-plugin-visualizer';
  4. import { modifyVars } from './build/config/glob/lessModifyVars';
  5. import {
  6. // externals,
  7. cdnConf,
  8. } from './build/config/vite/cdn';
  9. import { createProxy } from './build/config/vite/proxy';
  10. import { createMockServer } from 'vite-plugin-mock';
  11. import PurgeIcons from 'vite-plugin-purge-icons';
  12. import { isDevFn, isReportMode, isProdFn, loadEnv } from './build/utils';
  13. const pkg = require('./package.json');
  14. const {
  15. VITE_USE_MOCK,
  16. VITE_PORT,
  17. VITE_PUBLIC_PATH,
  18. VITE_PROXY,
  19. VITE_GLOB_APP_TITLE,
  20. // VITE_USE_CDN,
  21. } = loadEnv();
  22. function pathResolve(dir: string) {
  23. return resolve(__dirname, '.', dir);
  24. }
  25. const rollupPlugins: any[] = [];
  26. const vitePlugins: VitePlugin[] = [];
  27. (() => {
  28. if (isReportMode() && isProdFn()) {
  29. // report
  30. rollupPlugins.push(
  31. visualizer({ filename: './node_modules/.cache/stats.html', open: true }) as Plugin
  32. );
  33. }
  34. if (isDevFn() && VITE_USE_MOCK) {
  35. // open mock
  36. vitePlugins.push(
  37. createMockServer({
  38. ignore: /^\_/,
  39. mockPath: 'mock',
  40. })
  41. );
  42. }
  43. })();
  44. const viteConfig: UserConfig = {
  45. /**
  46. * 端口号
  47. * @default '3000'
  48. */
  49. port: VITE_PORT,
  50. /**
  51. * 服务地址
  52. * @default 'localhost'
  53. */
  54. hostname: 'localhost',
  55. /**
  56. * 运行自动打开浏览器·
  57. * @default 'false'
  58. */
  59. open: false,
  60. /**
  61. * 压缩代码
  62. * boolean | 'terser' | 'esbuild'
  63. * @default 'terser'
  64. */
  65. minify: 'terser',
  66. /**
  67. * 基本公共路径
  68. * @default '/'
  69. */
  70. base: VITE_PUBLIC_PATH,
  71. /**
  72. * 打包输入路径
  73. * @default 'dist'
  74. */
  75. outDir: 'dist',
  76. /**
  77. * @default 'false'
  78. */
  79. sourcemap: false,
  80. /**
  81. * 资源输出路径
  82. * @default '_assets'
  83. */
  84. assetsDir: '_assets',
  85. /**
  86. * 静态资源小于该大小将会内联,默认4096kb
  87. * @default '4096'
  88. */
  89. assetsInlineLimit: 4096,
  90. /**
  91. * esbuild转换目标。
  92. * @default 'es2019'
  93. */
  94. esbuildTarget: 'es2019',
  95. silent: false,
  96. // 别名
  97. alias: {
  98. '/@/': pathResolve('src'),
  99. },
  100. define: {
  101. __VERSION__: pkg.version,
  102. },
  103. // css预处理
  104. cssPreprocessOptions: {
  105. less: {
  106. modifyVars: modifyVars,
  107. javascriptEnabled: true,
  108. },
  109. },
  110. // 配置Dep优化行为
  111. // 会使用 rollup 对 包重新编译,将编译成符合 esm 模块规范的新的包放入 node_modules 下的 .
  112. optimizeDeps: {
  113. include: [
  114. 'echarts',
  115. 'echarts/map/js/china',
  116. 'ant-design-vue/es/locale/zh_CN',
  117. '@ant-design/icons-vue',
  118. 'moment/locale/zh-cn',
  119. ],
  120. },
  121. // 本地跨域代理
  122. proxy: createProxy(VITE_PROXY),
  123. plugins: [PurgeIcons(), ...vitePlugins],
  124. rollupOutputOptions: {},
  125. rollupInputOptions: {
  126. // TODO
  127. // external: VITE_USE_CDN ? externals : [],
  128. plugins: rollupPlugins,
  129. },
  130. };
  131. // 用于打包部署站点使用。实际项目可以删除
  132. const isSite = process.env.SITE === 'true';
  133. // 扩展配置, 往打包后的html注入内容
  134. // 只针对生产环境
  135. // TODO 目前只是简单手动注入实现,后续vite应该会提供配置项
  136. export const htmlConfig: {
  137. title: string;
  138. addHm?: boolean;
  139. cdnConf?: {
  140. css?: string[];
  141. js?: string[];
  142. };
  143. useCdn: boolean;
  144. minify: {
  145. enable: boolean;
  146. removeComments: boolean;
  147. collapseWhitespace: boolean;
  148. minifyJS: boolean;
  149. minifyCSS: boolean;
  150. };
  151. } = {
  152. // html title
  153. title: VITE_GLOB_APP_TITLE,
  154. // 百度统计,不需要可以删除
  155. addHm: isSite,
  156. // 使用cdn打包
  157. // TODO Cdn esm使用方式需要只能支持google,暂时关闭,后续查询更好的方式
  158. useCdn: false,
  159. // useCdn: VITE_USE_CDN,
  160. // cdn列表
  161. cdnConf,
  162. minify: {
  163. enable: true,
  164. removeComments: true,
  165. collapseWhitespace: true,
  166. minifyJS: true,
  167. minifyCSS: true,
  168. },
  169. };
  170. export default viteConfig;