feat: support pwa

This commit is contained in:
vben
2024-06-16 15:45:15 +08:00
parent 222c73963d
commit 382652e0f4
24 changed files with 1787 additions and 128 deletions

View File

@@ -57,6 +57,10 @@ export default {
'collapsible-up': 'collapsible-up 0.2s ease-in-out',
float: 'float 5s linear 0ms infinite',
},
animationDuration: {
'2000': '2000ms',
'3000': '3000ms',
},
borderRadius: {
lg: 'var(--radius-base)',
md: 'calc(var(--radius-base) - 2px)',

View File

@@ -36,6 +36,7 @@
"html-minifier-terser": "^7.2.0",
"resolve.exports": "^2.0.2",
"vite-plugin-lib-inject-css": "^2.1.1",
"vite-plugin-pwa": "^0.20.0",
"vite-plugin-vue-devtools": "^7.2.1"
},
"devDependencies": {

View File

@@ -10,7 +10,8 @@ import { getApplicationConditionPlugins } from '../plugins';
import { getCommonConfig } from './common';
function defineApplicationConfig(options: DefineApplicationOptions = {}) {
return defineConfig(async ({ command, mode }) => {
return defineConfig(async (config) => {
const { command, mode } = config;
const { application = {}, vite = {} } = options;
const root = process.cwd();
const isBuild = command === 'build';
@@ -28,8 +29,11 @@ function defineApplicationConfig(options: DefineApplicationOptions = {}) {
isBuild,
mock: true,
mode,
pwa: true,
turboConsole: false,
...application,
...(typeof application === 'function'
? application(config)
: application),
});
const applicationConfig: UserConfig = {
@@ -91,7 +95,10 @@ function defineApplicationConfig(options: DefineApplicationOptions = {}) {
await getCommonConfig(),
applicationConfig,
);
return mergeConfig(mergedConfig, vite);
return mergeConfig(
mergedConfig,
typeof vite === 'function' ? vite(config) : vite,
);
});
}

View File

@@ -10,7 +10,8 @@ import { getLibraryConditionPlugins } from '../plugins';
import { getCommonConfig } from './common';
function defineLibraryConfig(options: DefineLibraryOptions = {}) {
return defineConfig(async ({ command, mode }) => {
return defineConfig(async (config) => {
const { command, mode } = config;
const root = process.cwd();
const { library = {}, vite = {} } = options;
const isBuild = command === 'build';
@@ -20,7 +21,7 @@ function defineLibraryConfig(options: DefineLibraryOptions = {}) {
injectLibCss: true,
isBuild,
mode,
...library,
...(typeof library === 'function' ? library(config) : library),
});
const { dependencies = {}, peerDependencies = {} } =
@@ -45,7 +46,10 @@ function defineLibraryConfig(options: DefineLibraryOptions = {}) {
};
const commonConfig = await getCommonConfig();
const mergedConfig = mergeConfig(commonConfig, packageConfig);
return mergeConfig(mergedConfig, vite);
return mergeConfig(
mergedConfig,
typeof vite === 'function' ? vite(config) : vite,
);
});
}

View File

@@ -21,6 +21,7 @@ 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';
import { VitePWA } from 'vite-plugin-pwa';
import viteVueDevTools from 'vite-plugin-vue-devtools';
import { viteExtraAppConfigPlugin } from './extra-app-config';
@@ -100,6 +101,8 @@ async function getApplicationConditionPlugins(
importmapOptions,
injectAppLoading,
mock,
pwa,
pwaOptions,
turboConsole,
...commonOptions
} = options;
@@ -125,7 +128,24 @@ async function getApplicationConditionPlugins(
},
{
condition: injectAppLoading,
plugins: async () => [await viteInjectAppLoadingPlugin(isBuild, env)],
plugins: async () => [await viteInjectAppLoadingPlugin(!!isBuild, env)],
},
{
condition: pwa,
plugins: () =>
VitePWA({
injectRegister: false,
workbox: {
globPatterns: [],
},
...pwaOptions,
manifest: {
display: 'standalone',
start_url: '/',
theme_color: '#ffffff',
...pwaOptions?.manifest,
},
}),
},
{
condition: isBuild && !!compress,

View File

@@ -10,8 +10,8 @@ import { type PluginOption } from 'vite';
* 为多app提供loading样式无需在每个 app -> index.html单独引入
*/
async function viteInjectAppLoadingPlugin(
isBuild: string,
env: Record<string, any>,
isBuild: boolean,
env: Record<string, any> = {},
): Promise<PluginOption | undefined> {
const loadingHtml = await getLoadingRawByHtmlTemplate();
const envRaw = isBuild ? 'prod' : 'dev';

View File

@@ -1,6 +1,7 @@
import type { PluginVisualizerOptions } from 'rollup-plugin-visualizer';
import type { PluginOption, UserConfig } from 'vite';
import type { ConfigEnv, PluginOption, UserConfig } from 'vite';
import type { PluginOptions } from 'vite-plugin-dts';
import type { Options as PwaPluginOptions } from 'vite-plugin-pwa';
import viteTurboConsolePlugin from 'unplugin-turbo-console/vite';
@@ -68,6 +69,10 @@ interface ApplicationPluginOptions extends CommonPluginOptions {
injectAppLoading?: boolean;
/** mock 插件配置 */
mock?: boolean;
/** 是否开启pwa */
pwa?: boolean;
/** pwa 插件配置 */
pwaOptions?: Partial<PwaPluginOptions>;
/** turbo-console 插件配置 */
turboConsole?: Parameters<typeof viteTurboConsolePlugin>[0] | boolean;
}
@@ -85,13 +90,15 @@ interface ApplicationOptions extends ApplicationPluginOptions {}
interface LibraryOptions extends LibraryPluginOptions {}
interface DefineApplicationOptions {
application?: ApplicationOptions;
vite?: UserConfig;
application?:
| ((config: ConfigEnv) => ApplicationOptions)
| ApplicationOptions;
vite?: ((config: ConfigEnv) => UserConfig) | UserConfig;
}
interface DefineLibraryOptions {
library?: LibraryOptions;
vite?: UserConfig;
library?: ((config: ConfigEnv) => LibraryOptions) | LibraryOptions;
vite?: ((config: ConfigEnv) => UserConfig) | UserConfig;
}
type DefineConfig = {