123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233 |
- import type { PluginOption } from 'vite';
- import type {
- ApplicationPluginOptions,
- CommonPluginOptions,
- ConditionPlugin,
- LibraryPluginOptions,
- } from '../typing';
- import viteVueI18nPlugin from '@intlify/unplugin-vue-i18n/vite';
- 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';
- import { VitePWA } from 'vite-plugin-pwa';
- import viteVueDevTools from 'vite-plugin-vue-devtools';
- import { viteExtraAppConfigPlugin } from './extra-app-config';
- import { viteImportMapPlugin } from './importmap';
- import { viteInjectAppLoadingPlugin } from './inject-app-loading';
- import { viteMetadataPlugin } from './inject-metadata';
- import { viteLicensePlugin } from './license';
- import { viteNitroMockPlugin } from './nitor-mock';
- import { vitePrintPlugin } from './print';
- /**
- * 获取条件成立的 vite 插件
- * @param conditionPlugins
- */
- async function loadConditionPlugins(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 loadCommonPlugins(
- options: CommonPluginOptions,
- ): Promise<ConditionPlugin[]> {
- const { devtools, injectMetadata, isBuild, visualizer } = options;
- return [
- {
- condition: true,
- plugins: () => [
- viteVue({
- script: {
- defineModel: true,
- // propsDestructure: true,
- },
- }),
- viteVueJsx(),
- ],
- },
- {
- condition: !isBuild && devtools,
- plugins: () => [viteVueDevTools()],
- },
- {
- condition: injectMetadata,
- plugins: async () => [await viteMetadataPlugin()],
- },
- {
- condition: isBuild && !!visualizer,
- plugins: () => [<PluginOption>viteVisualizerPlugin({
- filename: './node_modules/.cache/visualizer/stats.html',
- gzipSize: true,
- open: true,
- })],
- },
- ];
- }
- /**
- * 根据条件获取应用类型的vite插件
- */
- async function loadApplicationPlugins(
- options: ApplicationPluginOptions,
- ): Promise<PluginOption[]> {
- // 单独取,否则commonOptions拿不到
- const isBuild = options.isBuild;
- const env = options.env;
- const {
- compress,
- compressTypes,
- extraAppConfig,
- html,
- i18n,
- importmap,
- importmapOptions,
- injectAppLoading,
- license,
- nitroMock,
- nitroMockOptions,
- print,
- printInfoMap,
- pwa,
- pwaOptions,
- ...commonOptions
- } = options;
- const commonPlugins = await loadCommonPlugins(commonOptions);
- return await loadConditionPlugins([
- ...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)];
- },
- },
- {
- condition: injectAppLoading,
- plugins: async () => [await viteInjectAppLoadingPlugin(!!isBuild, env)],
- },
- {
- condition: license,
- plugins: async () => [await viteLicensePlugin()],
- },
- {
- condition: pwa,
- plugins: () =>
- VitePWA({
- injectRegister: false,
- workbox: {
- globPatterns: [],
- },
- ...pwaOptions,
- manifest: {
- display: 'standalone',
- start_url: '/',
- theme_color: '#ffffff',
- ...pwaOptions?.manifest,
- },
- }),
- },
- {
- 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(
- options: LibraryPluginOptions,
- ): Promise<PluginOption[]> {
- // 单独取,否则commonOptions拿不到
- const isBuild = options.isBuild;
- const { dts, injectLibCss, ...commonOptions } = options;
- const commonPlugins = await loadCommonPlugins(commonOptions);
- return await loadConditionPlugins([
- ...commonPlugins,
- {
- condition: isBuild && !!dts,
- plugins: () => [viteDtsPlugin({ logLevel: 'error' })],
- },
- {
- condition: injectLibCss,
- plugins: () => [viteLibInjectCss()],
- },
- ]);
- }
- export {
- loadApplicationPlugins,
- loadLibraryPlugins,
- viteCompressPlugin,
- viteDtsPlugin,
- viteHtmlPlugin,
- viteVisualizerPlugin,
- };
|