wangzhibo
昨天 5e756b5a69bcd957f8eafc5f99a4f6413691d6dd
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
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
import type { Plugin } from "vite";
import { createEps } from "./eps";
import { createCtx } from "./ctx";
import { createSvg } from "./svg";
 
export async function virtual(): Promise<Plugin> {
    const virtualModuleIds: string[] = [
        "virtual:eps",
        "virtual:ctx",
        "virtual:svg-register",
        "virtual:svg-icons",
    ];
 
    createEps();
 
    return {
        name: "vite-cool-virtual",
        enforce: "pre",
        configureServer(server) {
            server.middlewares.use(async (req, res, next) => {
                // 页面刷新时触发
                if (req.url == "/@vite/client") {
                    // 重新加载虚拟模块
                    virtualModuleIds.forEach((vm) => {
                        const mod = server.moduleGraph.getModuleById(`\0${vm}`);
 
                        if (mod) {
                            server.moduleGraph.invalidateModule(mod);
                        }
                    });
                }
 
                next();
            });
        },
        handleHotUpdate({ file, server }) {
            // 文件修改时触发
            if (
                !["pages.json", "dist", "build/cool", "eps.json", "eps.d.ts"].some((e) =>
                    file.includes(e),
                )
            ) {
                createCtx();
                createEps().then((data) => {
                    if (data.isUpdate) {
                        // 通知客户端刷新
                        (server.hot || server.ws).send({
                            type: "custom",
                            event: "eps-update",
                            data,
                        });
                    }
                });
            }
        },
        resolveId(id) {
            if (virtualModuleIds.includes(id)) {
                return "\0" + id;
            }
        },
        async load(id) {
            if (id === "\0virtual:eps") {
                const eps = await createEps();
 
                return `
                    export const eps = ${JSON.stringify(eps)}
                `;
            }
            if (id === "\0virtual:ctx") {
                const ctx = await createCtx();
 
                return `
                    export const ctx = ${JSON.stringify(ctx)}
                `;
            }
 
            if (id == "\0virtual:svg-register") {
                const { code } = await createSvg();
 
                return code;
            }
 
            if (id == "\0virtual:svg-icons") {
                const { svgIcons } = await createSvg();
 
                return `
                    export const svgIcons = ${JSON.stringify(svgIcons)}
                `;
            }
        },
    };
}