import type { Plugin } from "vite"; import { createEps } from "./eps"; import { createCtx } from "./ctx"; import { createSvg } from "./svg"; export async function virtual(): Promise { 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)} `; } }, }; }