import { initialize, ITree } from "./initialize"; interface IMozzieOptions { virtualModuleName?: string; config?: any; } export interface IMeta { name: string; required: boolean; type: string; [key: string]: any; } export interface IRoute { name: string; path: string; active: boolean; } export interface IConfigs { config: { title: string; // document title subTitle: string; // 文档标题 }; } export default function Bolt(options: IMozzieOptions) { const { config = {} } = options; const virtualModuleId = "virtual:@vite/plugin-bolt"; const resolvedVirtualModuleId = "\0" + virtualModuleId; const TREE: ITree = { compoTree: {}, fileTree: {}, routerList: [], config: {}, }; return { name: "@vite/plugin-bolt", enforce: "pre", resolveId(id: string) { if (id === virtualModuleId) { return resolvedVirtualModuleId; } }, load(id: string) { if (id === resolvedVirtualModuleId) { const { compoTree, fileTree, routerList } = initialize(); TREE.fileTree = fileTree; TREE.compoTree = compoTree; TREE.routerList = routerList; TREE.config = config; // build 后也存在 config return `export const TREE = ${JSON.stringify(TREE)}`; } }, handleHotUpdate(ctx: any) { const { file, server } = ctx; //! 开发阶段: //* 由于 上面load方法 只会触发一次,导致写到前端的 TREE 对象,无法更改 //* 当动态增减 components 组件,默认会先使用 TREE,然后触发 client:refresh 方法,获取到最新的 compoTree //* 导致左侧菜单会变化,目前采用 loading 遮住这个跳变的过程 server.ws.send("server:fullUpdate", initialize()); //! return [] 会让 mdx-plugin 不更新 }, configureServer(server) { server.ws.on("client:refresh", (data, client) => { client.send("client:refresh:response", initialize()); }); }, transformIndexHtml(html) { const { title } = config; return html.replace(/(.*?)<\/title>/, `<title>${title}`); }, }; }