vue-vben-admin/vite.config.ts

200 lines
4.3 KiB
TypeScript
Raw Normal View History

2020-09-28 20:19:10 +08:00
import { resolve } from 'path';
import type { UserConfig, Plugin as VitePlugin } from 'vite';
import visualizer from 'rollup-plugin-visualizer';
import { modifyVars } from './build/config/glob/lessModifyVars';
import {
// externals,
cdnConf,
} from './build/config/vite/cdn';
2020-09-28 20:19:10 +08:00
import { createProxy } from './build/config/vite/proxy';
import { createMockServer } from 'vite-plugin-mock';
import PurgeIcons from 'vite-plugin-purge-icons';
2020-10-16 22:03:44 +08:00
import gzipPlugin from './build/plugin/gzip/index';
2020-10-18 21:55:21 +08:00
import globbyTransform from './build/plugin/vite-plugin-context/transform';
2020-10-16 22:03:44 +08:00
import { isDevFn, isReportMode, isProdFn, loadEnv, isBuildGzip, isSiteMode } from './build/utils';
const pkg = require('./package.json');
2020-09-28 20:19:10 +08:00
const {
VITE_USE_MOCK,
VITE_PORT,
VITE_PUBLIC_PATH,
VITE_PROXY,
VITE_GLOB_APP_TITLE,
2020-10-16 22:03:44 +08:00
VITE_DROP_CONSOLE,
// VITE_USE_CDN,
} = loadEnv();
2020-09-28 20:19:10 +08:00
function pathResolve(dir: string) {
return resolve(__dirname, '.', dir);
}
2020-10-10 21:28:43 +08:00
const rollupPlugins: any[] = [];
2020-09-28 20:19:10 +08:00
const vitePlugins: VitePlugin[] = [];
(() => {
2020-10-16 22:03:44 +08:00
if (isProdFn()) {
if (isReportMode()) {
// report
rollupPlugins.push(
2020-10-16 23:36:52 +08:00
visualizer({ filename: './build/.cache/stats.html', open: true }) as Plugin
2020-10-16 22:03:44 +08:00
);
}
if (isBuildGzip() || isSiteMode()) {
rollupPlugins.push(gzipPlugin());
}
2020-09-28 20:19:10 +08:00
}
2020-10-16 22:03:44 +08:00
2020-10-10 21:28:43 +08:00
if (isDevFn() && VITE_USE_MOCK) {
2020-09-28 20:19:10 +08:00
// open mock
vitePlugins.push(
createMockServer({
ignore: /^\_/,
mockPath: 'mock',
})
);
}
})();
const viteConfig: UserConfig = {
2020-10-10 21:28:43 +08:00
/**
*
* @default '3000'
*/
port: VITE_PORT,
2020-09-28 20:19:10 +08:00
/**
*
* @default 'localhost'
*/
hostname: 'localhost',
/**
2020-10-01 00:24:14 +08:00
* ·
2020-09-28 20:19:10 +08:00
* @default 'false'
*/
open: false,
/**
*
* boolean | 'terser' | 'esbuild'
* @default 'terser'
*/
2020-10-21 21:44:57 +08:00
minify: isDevFn() ? 'esbuild' : 'terser',
2020-09-28 20:19:10 +08:00
/**
2020-10-10 21:28:43 +08:00
*
2020-09-28 20:19:10 +08:00
* @default '/'
*/
2020-10-10 21:28:43 +08:00
base: VITE_PUBLIC_PATH,
2020-09-28 20:19:10 +08:00
/**
*
* @default 'dist'
*/
outDir: 'dist',
/**
* @default 'false'
*/
sourcemap: false,
/**
*
* @default '_assets'
*/
assetsDir: '_assets',
/**
* 4096kb
* @default '4096'
*/
assetsInlineLimit: 4096,
/**
* esbuild转换目标
2020-10-16 22:03:44 +08:00
* @default 'es2020'
2020-09-28 20:19:10 +08:00
*/
2020-10-16 22:03:44 +08:00
esbuildTarget: 'es2020',
2020-10-10 21:28:43 +08:00
silent: false,
2020-09-28 20:19:10 +08:00
// 别名
alias: {
'/@/': pathResolve('src'),
},
2020-10-16 22:03:44 +08:00
// terser配置
2020-10-24 01:46:29 +08:00
terserOptions: {
2020-10-16 22:03:44 +08:00
compress: {
// 是否删除console
drop_console: VITE_DROP_CONSOLE,
},
},
define: {
__VERSION__: pkg.version,
},
2020-09-28 20:19:10 +08:00
// css预处理
cssPreprocessOptions: {
less: {
modifyVars: modifyVars,
javascriptEnabled: true,
},
},
// 会使用 rollup 对 包重新编译,将编译成符合 esm 模块规范的新的包放入 node_modules/.vite_opt_cache
2020-09-28 20:19:10 +08:00
optimizeDeps: {
include: [
'echarts',
'echarts/map/js/china',
'ant-design-vue/es/locale/zh_CN',
'@ant-design/icons-vue',
'moment/locale/zh-cn',
],
2020-09-28 20:19:10 +08:00
},
2020-10-16 22:03:44 +08:00
2020-09-28 20:19:10 +08:00
// 本地跨域代理
2020-10-10 21:28:43 +08:00
proxy: createProxy(VITE_PROXY),
2020-09-28 20:19:10 +08:00
plugins: [PurgeIcons(), ...vitePlugins],
rollupOutputOptions: {},
rollupInputOptions: {
// TODO
// external: VITE_USE_CDN ? externals : [],
2020-09-28 20:19:10 +08:00
plugins: rollupPlugins,
},
};
// 扩展配置, 往打包后的html注入内容
// 只针对生产环境
// TODO 目前只是简单手动注入实现后续vite应该会提供配置项
export const htmlConfig: {
title: string;
addHm?: boolean;
cdnConf?: {
css?: string[];
js?: string[];
};
useCdn: boolean;
2020-10-13 23:52:01 +08:00
minify: {
enable: boolean;
removeComments: boolean;
collapseWhitespace: boolean;
minifyJS: boolean;
minifyCSS: boolean;
};
} = {
// html title
title: VITE_GLOB_APP_TITLE,
// 百度统计,不需要可以删除
2020-10-16 22:03:44 +08:00
// 用于打包部署站点使用。实际项目可以删除
addHm: isSiteMode(),
// 使用cdn打包
// TODO Cdn esm使用方式需要只能支持google暂时关闭后续查询更好的方式
useCdn: false,
// useCdn: VITE_USE_CDN,
// cdn列表
cdnConf,
2020-10-13 23:52:01 +08:00
minify: {
enable: true,
removeComments: true,
collapseWhitespace: true,
minifyJS: true,
minifyCSS: true,
},
};
2020-10-16 22:03:44 +08:00
export default {
...viteConfig,
transforms: [globbyTransform(viteConfig)],
} as UserConfig;