You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

229 lines
6.2 KiB

7 months ago
/** @format */
import { defineConfig, loadEnv } from 'vite';
import vue from '@vitejs/plugin-vue';
import { createSvgIconsPlugin } from 'vite-plugin-svg-icons';
import { basename, resolve } from 'path';
import dayjs from 'dayjs';
import pkg from '../package.json';
import vueJsx from '@vitejs/plugin-vue-jsx';
import legacy from '@vitejs/plugin-legacy';
import { generateModifyVars } from './less';
import { theme } from './theme';
import { visualizer } from 'rollup-plugin-visualizer';
import duration from 'dayjs/plugin/duration';
import path from 'path';
import { splitVendorChunkPlugin } from 'vite';
import { configMockPlugin } from './plugin/mock/mock';
dayjs.extend(duration);
interface Statistics {
buildStartTime: number;
outputOptionsTime: number[];
closeBundleTime: number;
}
function buildTimePlugin() {
const statistics: Statistics = {
buildStartTime: 0,
outputOptionsTime: [],
closeBundleTime: 0,
};
return {
name: 'build-time',
buildStart() {
statistics.buildStartTime = Date.now();
console.log('开始打包');
},
outputOptions() {
statistics.outputOptionsTime.push(Date.now());
if (statistics.outputOptionsTime.length === 1) {
console.log(
`分析耗时: ${dayjs
.duration(
statistics.outputOptionsTime[statistics.outputOptionsTime.length - 1] -
statistics.buildStartTime,
)
.format('m:s')}`,
);
} else {
console.log(
`上一步耗时: ${dayjs
.duration(
statistics.outputOptionsTime[statistics.outputOptionsTime.length - 1] -
statistics.outputOptionsTime[statistics.outputOptionsTime.length - 2],
)
.format('m:s')}`,
);
}
},
closeBundle() {
statistics.closeBundleTime = Date.now();
if (statistics.outputOptionsTime.length === 1) {
console.log(
`分包耗时 ${dayjs
.duration(statistics.closeBundleTime - statistics.outputOptionsTime[0])
.format('m:s')}`,
);
}
console.log(
`总耗时 ${dayjs
.duration(statistics.closeBundleTime - statistics.buildStartTime)
.format('m:s')}`,
);
},
};
}
const { dependencies, devDependencies, name, version } = pkg;
export default function nsDefineConfig(params: {
serviceMode?: 'saas' | 'paas';
dirname: string;
baseDir?: string;
proxy?: object;
manualChunks?: boolean;
mock?: boolean;
mockPath?: string;
}) {
const {
serviceMode = 'saas',
dirname,
baseDir = '../',
manualChunks = false,
mock = false,
mockPath = `${basename(dirname)}/mock`,
} = params;
function pathResolve(dir: string): string {
return resolve(dirname, '.', dir);
}
console.log('mockPath', mockPath);
// @ts-ignore
return defineConfig(({ mode, command }) => {
//运行信息
const __APP_INFO__ = {
platform: process.env.PLATFORM,
pkg: { dependencies, devDependencies, name, version },
buildTime: dayjs().format('YYYY-MM-DD HH:mm:ss'),
serviceMode,
};
const env = loadEnv(mode, dirname);
const { VITE_PORT, VITE_PROXY = '{}', VITE_LEGACY, VITE_PUBLIC_PATH } = env;
const port = Number(VITE_PORT);
const proxy = params.proxy ? params.proxy : JSON.parse(VITE_PROXY);
const isBuild = command === 'build';
const server = {
host: true,
port,
proxy,
fs: {
allow: ['..'],
},
};
const config: any = {
base: VITE_PUBLIC_PATH,
cacheDir: `${baseDir}node_modules/.vite-${basename(dirname)}`,
build: {
assetsDir: 'asset',
brotliSize: false,
target: 'es2015',
rollupOptions: {
output: {
manualChunks: (id: string) => {
const root = basename(dirname);
const fileName = path
.normalize(path.relative(root, id))
.split(path.sep)
.join(path.posix.sep);
if (fileName.includes('lib/')) {
return 'nerv-lib';
} else if (fileName.includes('src/view/')) {
return id.toString().split('src/view/')[1].split('/')[0].toString();
}
},
},
},
},
resolve: {
alias: [
{
find: 'vue-i18n',
replacement: 'vue-i18n/dist/vue-i18n.cjs.js',
},
{
find: /\/@\//,
replacement: pathResolve('src') + '/',
},
{
find: /\/nerv-lib\//,
replacement: pathResolve('../lib') + '/',
},
{
find: /\/nerv-base\//,
replacement: pathResolve(`../lib/${serviceMode}`) + '/',
},
{
find: '@antv/x6',
replacement: '@antv/x6/dist/x6.js',
},
{
find: 'flv.js',
replacement: 'flv.js/dist/flv.min.js',
},
],
},
server,
define: {
__APP_INFO__: JSON.stringify(__APP_INFO__),
},
css: {
preprocessorOptions: {
less: {
modifyVars: {
...generateModifyVars({
dark: false,
paths: [
pathResolve(`${baseDir}lib/${serviceMode}/theme/variable.less`),
pathResolve('./src/theme/variable.less'),
],
}),
},
javascriptEnabled: true,
},
},
},
plugins: [
vue(),
vueJsx(),
theme({ isProd: mode !== 'development' }),
VITE_LEGACY &&
isBuild &&
legacy({
targets: ['defaults', 'not IE 11'],
}),
createSvgIconsPlugin({
// 指定需要缓存的图标文件夹
iconDirs: [
pathResolve('src/icon'),
pathResolve(`${baseDir}lib/${serviceMode}/asset/icon`),
],
svgoOptions: isBuild,
symbolId: 'icon-[dir]-[name]',
}),
configMockPlugin({ enable: mock, mockPath }),
visualizer(),
isBuild && buildTimePlugin(),
splitVendorChunkPlugin(),
],
};
return config;
});
}