vite-bolt/plugin/vite-plugin-bolt.ts
2023-02-01 17:52:53 +08:00

78 lines
2.1 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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>`);
},
};
}