admin-vben5/internal/vite-config/src/plugins/index.ts

234 lines
5.8 KiB
TypeScript
Raw Normal View History

2024-05-19 21:20:42 +08:00
import type { PluginOption } from 'vite';
2024-06-08 19:49:06 +08:00
import type {
ApplicationPluginOptions,
CommonPluginOptions,
ConditionPlugin,
LibraryPluginOptions,
} from '../typing';
import viteVueI18nPlugin from '@intlify/unplugin-vue-i18n/vite';
2024-05-19 21:20:42 +08:00
import viteVue from '@vitejs/plugin-vue';
import viteVueJsx from '@vitejs/plugin-vue-jsx';
import { visualizer as viteVisualizerPlugin } from 'rollup-plugin-visualizer';
import viteCompressPlugin from 'vite-plugin-compression';
import viteDtsPlugin from 'vite-plugin-dts';
import { createHtmlPlugin as viteHtmlPlugin } from 'vite-plugin-html';
import { libInjectCss as viteLibInjectCss } from 'vite-plugin-lib-inject-css';
2024-06-16 15:45:15 +08:00
import { VitePWA } from 'vite-plugin-pwa';
2024-05-19 21:20:42 +08:00
import viteVueDevTools from 'vite-plugin-vue-devtools';
import { viteExtraAppConfigPlugin } from './extra-app-config';
import { viteImportMapPlugin } from './importmap';
import { viteInjectAppLoadingPlugin } from './inject-app-loading';
2024-06-23 20:05:22 +08:00
import { viteMetadataPlugin } from './inject-metadata';
2024-06-23 19:45:40 +08:00
import { viteLicensePlugin } from './license';
import { viteNitroMockPlugin } from './nitor-mock';
import { vitePrintPlugin } from './print';
2024-05-19 21:20:42 +08:00
/**
* vite
* @param conditionPlugins
*/
async function loadConditionPlugins(conditionPlugins: ConditionPlugin[]) {
2024-05-19 21:20:42 +08:00
const plugins: PluginOption[] = [];
for (const conditionPlugin of conditionPlugins) {
if (conditionPlugin.condition) {
const realPlugins = await conditionPlugin.plugins();
plugins.push(...realPlugins);
}
}
return plugins.flat();
}
/**
* vite插件
*/
async function loadCommonPlugins(
2024-05-19 21:20:42 +08:00
options: CommonPluginOptions,
): Promise<ConditionPlugin[]> {
2024-06-23 20:05:22 +08:00
const { devtools, injectMetadata, isBuild, visualizer } = options;
2024-05-19 21:20:42 +08:00
return [
{
condition: true,
plugins: () => [
viteVue({
script: {
defineModel: true,
// propsDestructure: true,
},
}),
viteVueJsx(),
],
},
2024-06-23 20:05:22 +08:00
2024-05-19 21:20:42 +08:00
{
condition: !isBuild && devtools,
plugins: () => [viteVueDevTools()],
},
{
2024-06-23 20:05:22 +08:00
condition: injectMetadata,
plugins: async () => [await viteMetadataPlugin()],
},
{
2024-05-19 21:20:42 +08:00
condition: isBuild && !!visualizer,
plugins: () => [<PluginOption>viteVisualizerPlugin({
filename: './node_modules/.cache/visualizer/stats.html',
gzipSize: true,
open: true,
})],
},
];
}
/**
* vite插件
*/
async function loadApplicationPlugins(
options: ApplicationPluginOptions,
2024-05-19 21:20:42 +08:00
): Promise<PluginOption[]> {
// 单独取否则commonOptions拿不到
const isBuild = options.isBuild;
const env = options.env;
2024-05-19 21:20:42 +08:00
const {
compress,
compressTypes,
extraAppConfig,
html,
i18n,
importmap,
importmapOptions,
injectAppLoading,
2024-06-23 19:45:40 +08:00
license,
nitroMock,
nitroMockOptions,
print,
printInfoMap,
2024-06-16 15:45:15 +08:00
pwa,
pwaOptions,
2024-05-19 21:20:42 +08:00
...commonOptions
} = options;
const commonPlugins = await loadCommonPlugins(commonOptions);
2024-05-19 21:20:42 +08:00
return await loadConditionPlugins([
2024-05-19 21:20:42 +08:00
...commonPlugins,
{
condition: i18n,
plugins: async () => {
return [
viteVueI18nPlugin({
compositionOnly: true,
fullInstall: true,
runtimeOnly: true,
}),
];
},
},
{
condition: print,
plugins: async () => {
return [await vitePrintPlugin({ infoMap: printInfoMap })];
},
},
{
condition: nitroMock,
plugins: async () => {
return [await viteNitroMockPlugin(nitroMockOptions)];
},
},
2024-05-19 21:20:42 +08:00
{
condition: injectAppLoading,
2024-06-16 15:45:15 +08:00
plugins: async () => [await viteInjectAppLoadingPlugin(!!isBuild, env)],
},
2024-06-23 19:45:40 +08:00
{
condition: license,
plugins: async () => [await viteLicensePlugin()],
},
2024-06-16 15:45:15 +08:00
{
condition: pwa,
plugins: () =>
VitePWA({
injectRegister: false,
workbox: {
globPatterns: [],
},
...pwaOptions,
manifest: {
display: 'standalone',
start_url: '/',
theme_color: '#ffffff',
...pwaOptions?.manifest,
},
}),
2024-05-19 21:20:42 +08:00
},
{
condition: isBuild && !!compress,
plugins: () => {
const compressPlugins: PluginOption[] = [];
if (compressTypes?.includes('brotli')) {
compressPlugins.push(
viteCompressPlugin({ deleteOriginFile: false, ext: '.br' }),
);
}
if (compressTypes?.includes('gzip')) {
compressPlugins.push(
viteCompressPlugin({ deleteOriginFile: false, ext: '.gz' }),
);
}
return compressPlugins;
},
},
{
condition: !!html,
plugins: () => [viteHtmlPlugin({ minify: true })],
},
{
condition: isBuild && importmap,
plugins: () => {
return [viteImportMapPlugin(importmapOptions)];
},
},
{
condition: isBuild && extraAppConfig,
plugins: async () => [
await viteExtraAppConfigPlugin({ isBuild: true, root: process.cwd() }),
],
},
]);
}
/**
* vite插件
*/
async function loadLibraryPlugins(
2024-05-19 21:20:42 +08:00
options: LibraryPluginOptions,
): Promise<PluginOption[]> {
// 单独取否则commonOptions拿不到
const isBuild = options.isBuild;
const { dts, injectLibCss, ...commonOptions } = options;
const commonPlugins = await loadCommonPlugins(commonOptions);
return await loadConditionPlugins([
2024-05-19 21:20:42 +08:00
...commonPlugins,
{
condition: isBuild && !!dts,
plugins: () => [viteDtsPlugin({ logLevel: 'error' })],
},
{
condition: injectLibCss,
plugins: () => [viteLibInjectCss()],
},
]);
}
export {
loadApplicationPlugins,
loadLibraryPlugins,
2024-05-19 21:20:42 +08:00
viteCompressPlugin,
viteDtsPlugin,
viteHtmlPlugin,
viteVisualizerPlugin,
};