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