2021-12-05 23:09:33 +08:00

199 lines
3.6 KiB
TypeScript

import { modules as mods } from "/@/cool/modules";
import store from "/@/store";
import router from "/@/router";
import { deepMerge, isFunction, isObject, isEmpty } from "../utils";
import { deepFiles } from "../service";
// 模块列表
const modules: any[] = [...mods];
function useModule(app: any) {
// 安装模块
function install(mod: any) {
const { store: _store, service, directives, components, pages, views, name } = mod;
try {
// 注册vuex模块
if (_store) {
for (const i in _store) {
store.registerModule(`${name}-${i}`, _store[i]);
}
}
// 注册请求服务
if (service) {
// @ts-ignore
deepMerge(store.service, service);
}
// 注册组件
if (components) {
for (const i in components) {
if (components[i]) {
if (components[i].cool?.global || i.indexOf("cl-") === 0) {
app.component(components[i].name, components[i]);
}
}
}
}
// 注册指令
if (directives) {
for (const i in directives) {
app.directive(i, directives[i]);
}
}
// 注册页面
if (pages) {
pages.forEach((e: any) => {
router.addRoute(e);
});
}
// 注册视图
if (views) {
views.forEach((e: any) => {
if (!e.meta) {
e.meta = {};
}
if (e.path) {
router.$plugin?.addViews([e]);
} else {
console.error(`[${name}-views]:缺少 path 参数`);
}
});
}
} catch (e) {
console.error(`模块 ${name} 异常`, e);
}
}
// 扫描文件
const files = import.meta.globEager("/src/cool/modules/**/*");
for (const i in files) {
const [, , , , name, fn, cname] = i.split("/");
const value: any = files[i].default;
const fname: string = (cname || "").split(".")[0];
if (name == "index.ts") {
continue;
}
function next(d: any) {
// 配置参数入口
if (fn == "config.ts") {
d.options = value || {};
}
// 模块入口
if (fn == "index.ts") {
if (value) {
// 阻止往下加载
d.isLoaded = true;
// 之前
d._beforeFn = (e: any) => {
if (e.components) {
for (const i in e.components) {
// 全局注册
e.components[i].cool = {
global: true
};
}
}
};
d.value = value;
return d;
}
}
// 其他功能
switch (fn) {
case "service":
d._services.push({
path: i.replace(`/src/cool/modules/${name}/service`, `${name}`),
value: new value()
});
break;
case "pages":
case "views":
if (value.cool) {
d[fn].push({
...value.cool.route,
component: value
});
}
break;
case "components":
d.components[value.name] = value;
break;
case "store":
d.store[fname] = value;
break;
case "directives":
d.directives[fname] = value;
break;
}
return d;
}
const item: any = modules.find((e) => e.name === name);
if (item) {
if (!item.isLoaded) {
next(item);
}
} else {
modules.push(
next({
name,
options: {},
directives: {},
components: {},
pages: [],
views: [],
store: {},
_services: [],
_local: true
})
);
}
}
// 模块安装
modules.forEach((e: any) => {
if (!isEmpty(e._services)) {
e.service = deepFiles(e._services);
}
if (isObject(e.value)) {
if (isFunction(e.value.install)) {
Object.assign(e, e.value.install(app, e.options));
} else {
Object.assign(e, e.value);
}
}
if (e._beforeFn) {
e._beforeFn(e);
}
install(e);
});
// 缓存模块
store.commit("SET_MODULE", modules);
}
export { useModule };