ruoyi-plus-vben5/internal/vite-config/src/plugins/inject-app-loading/index.ts

71 lines
2.0 KiB
TypeScript
Raw Normal View History

import fs from 'node:fs';
2024-08-03 10:12:45 +08:00
import fsp from 'node:fs/promises';
2024-05-19 21:20:42 +08:00
import { join } from 'node:path';
import { fileURLToPath } from 'node:url';
import { readPackageJSON } from '@vben/node-utils';
2024-06-08 19:49:06 +08:00
2024-05-19 21:20:42 +08:00
import { type PluginOption } from 'vite';
/**
* loading样式注入到项目中
* app提供loading样式 app -> index.html单独引入
*/
async function viteInjectAppLoadingPlugin(
2024-06-16 15:45:15 +08:00
isBuild: boolean,
env: Record<string, any> = {},
loadingTemplate = 'loading.html',
): Promise<PluginOption | undefined> {
const loadingHtml = await getLoadingRawByHtmlTemplate(loadingTemplate);
const { version } = await readPackageJSON(process.cwd());
const envRaw = isBuild ? 'prod' : 'dev';
const cacheName = `'${env.VITE_APP_NAMESPACE}-${version}-${envRaw}-preferences-theme'`;
// 获取缓存的主题
// 保证黑暗主题下刷新页面时loading也是黑暗主题
const injectScript = `
<script data-app-loading="inject-js">
var theme = localStorage.getItem(${cacheName});
document.documentElement.classList.toggle('dark', /dark/.test(theme));
</script>
`;
2024-05-19 21:20:42 +08:00
if (!loadingHtml) {
return;
}
return {
enforce: 'pre',
name: 'vite:inject-app-loading',
transformIndexHtml: {
handler(html) {
const re = /<body\s*>/;
html = html.replace(re, `<body>${injectScript}${loadingHtml}`);
2024-05-19 21:20:42 +08:00
return html;
},
order: 'pre',
},
};
}
/**
* loading的html模板
*/
async function getLoadingRawByHtmlTemplate(loadingTemplate: string) {
2024-05-19 21:20:42 +08:00
const __dirname = fileURLToPath(new URL('.', import.meta.url));
const defaultLoadingPath = join(__dirname, './default-loading.html');
// 支持在app内自定义loading模板模版参考default-loading.html即可
const appLoadingPath = join(process.cwd(), loadingTemplate);
let loadingPath = defaultLoadingPath;
if (fs.existsSync(appLoadingPath)) {
loadingPath = appLoadingPath;
2024-05-19 21:20:42 +08:00
return;
}
2024-08-03 10:12:45 +08:00
const htmlRaw = await fsp.readFile(loadingPath, 'utf8');
2024-05-19 21:20:42 +08:00
return htmlRaw;
}
export { viteInjectAppLoadingPlugin };