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

249 lines
6.3 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';
2024-05-19 21:20:42 +08:00
import { join } from 'node:path';
import { getPackage } from '@vben/node-utils';
2024-06-08 19:49:06 +08:00
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 viteTurboConsolePlugin from 'unplugin-turbo-console/vite';
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';
import { viteMockServe as viteMockPlugin } from 'vite-plugin-mock';
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';
2024-05-19 21:20:42 +08:00
/**
* vite
* @param conditionPlugins
*/
async function getConditionEstablishedPlugins(
conditionPlugins: ConditionPlugin[],
) {
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 getCommonConditionPlugins(
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 getApplicationConditionPlugins(
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,
2024-05-19 21:20:42 +08:00
mock,
2024-06-16 15:45:15 +08:00
pwa,
pwaOptions,
2024-05-19 21:20:42 +08:00
turboConsole,
...commonOptions
} = options;
const commonPlugins = await getCommonConditionPlugins(commonOptions);
return await getConditionEstablishedPlugins([
...commonPlugins,
{
condition: i18n,
plugins: async () => {
const pkg = await getPackage('@vben/locales');
const include = `${join(pkg?.dir ?? '', isBuild ? 'dist' : 'src', 'langs')}/*.yaml`;
return [
viteVueI18nPlugin({
compositionOnly: true,
fullInstall: true,
include,
runtimeOnly: true,
}),
];
},
},
{
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({
devOptions: {
enabled: true,
type: 'module',
},
2024-06-16 15:45:15 +08:00
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() }),
],
},
{
condition: !isBuild && !!turboConsole,
plugins: () => [viteTurboConsolePlugin()],
},
{
condition: !!mock,
plugins: () => [
viteMockPlugin({
enable: true,
ignore: /^_/,
mockPath: 'mock',
}),
],
},
]);
}
/**
* vite插件
*/
async function getLibraryConditionPlugins(
options: LibraryPluginOptions,
): Promise<PluginOption[]> {
// 单独取否则commonOptions拿不到
const isBuild = options.isBuild;
const { dts, injectLibCss, ...commonOptions } = options;
const commonPlugins = await getCommonConditionPlugins(commonOptions);
return await getConditionEstablishedPlugins([
...commonPlugins,
{
condition: isBuild && !!dts,
plugins: () => [viteDtsPlugin({ logLevel: 'error' })],
},
{
condition: injectLibCss,
plugins: () => [viteLibInjectCss()],
},
]);
}
export {
getApplicationConditionPlugins,
getLibraryConditionPlugins,
viteCompressPlugin,
viteDtsPlugin,
viteHtmlPlugin,
viteMockPlugin,
viteTurboConsolePlugin,
viteVisualizerPlugin,
};