vite-bolt/plugin/vite-plugin-bolt.ts

78 lines
2.1 KiB
TypeScript
Raw Permalink Normal View History

2023-02-01 17:52:53 +08:00
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>${title}</title>`);
},
};
}