Blame view

Yi.Vben5.Vue3/internal/vite-config/src/plugins/inject-app-loading/index.ts 1.92 KB
515fceeb   “wangming”   框架初始化
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
  import type { PluginOption } from 'vite';
  
  import fs from 'node:fs';
  import fsp from 'node:fs/promises';
  import { join } from 'node:path';
  import { fileURLToPath } from 'node:url';
  
  import { readPackageJSON } from '@vben/node-utils';
  
  /**
   * 用于生成将loading样式注入到项目中
   * 为多app提供loading样式,无需在每个 app -> index.html单独引入
   */
  async function viteInjectAppLoadingPlugin(
    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>
  `;
  
    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}`);
          return html;
        },
        order: 'pre',
      },
    };
  }
  
  /**
   * 用于获取loading的html模板
   */
  async function getLoadingRawByHtmlTemplate(loadingTemplate: string) {
    // 支持在app内自定义loading模板,模版参考default-loading.html即可
    let appLoadingPath = join(process.cwd(), loadingTemplate);
  
    if (!fs.existsSync(appLoadingPath)) {
      const __dirname = fileURLToPath(new URL('.', import.meta.url));
      appLoadingPath = join(__dirname, './default-loading.html');
    }
  
    return await fsp.readFile(appLoadingPath, 'utf8');
  }
  
  export { viteInjectAppLoadingPlugin };