wangzhibo
2026-07-16 b57020623cf0c946706573bf102e548c3a544423
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
import { type App, type Directive } from 'vue';
import { assign, isFunction, orderBy, mergeWith } from 'lodash-es';
import { filename } from '../utils';
import { module } from '../module';
import { hmr } from '../hooks';
import { config } from '/@/config';
 
// 扫描文件
const files = import.meta.glob('/src/{modules,plugins}/*/{config.ts,service/**,directives/**}', {
    eager: true,
    import: 'default'
});
 
// 模块列表
module.list = hmr.getData('modules', []);
 
// 解析
for (const i in files) {
    // 分割
    const [, , type, name, action] = i.split('/');
 
    // 文件名
    const n = filename(i);
 
    // 文件内容
    const v = files[i];
 
    // 模块是否存在
    const m = module.get(name);
 
    // 数据
    const d = m || {
        name,
        type,
        value: null,
        services: [],
        directives: []
    };
 
    // 配置
    if (action == 'config.ts') {
        d.value = v;
    }
    // 服务
    else if (action == 'service') {
        const s = new (v as any)();
 
        if (s) {
            d.services?.push({
                path: s.namespace,
                value: s
            });
        }
    }
    // 指令
    else if (action == 'directives') {
        d.directives?.push({ name: n, value: v as Directive });
    }
 
    if (!m) {
        module.add(d);
    }
}
 
// 创建
export function createModule(app: App) {
    // 排序
    module.list.forEach(e => {
        const d = isFunction(e.value) ? e.value(app) : e.value;
 
        if (d) {
            assign(e, d);
        }
 
        if (!d.order) {
            e.order = 0;
        }
    });
 
    const list = orderBy(module.list, 'order', 'desc').map(e => {
        if (e.enable !== false) {
            // 初始化
            e.install?.(app, e.options);
 
            // 注册组件
            e.components?.forEach(async (c: any) => {
                const v = await (isFunction(c) ? c() : c);
                const n = v.default || v;
 
                if (n.name) {
                    app.component(n.name, n);
                }
            });
 
            // 注册指令
            e.directives?.forEach(v => {
                app.directive(v.name, v.value);
            });
 
            // 合并忽略配置
            config.ignore = mergeWith({}, config.ignore, e.ignore, (a, b) => a?.concat(b));
        }
 
        // 附加值
        e.pages?.forEach(v => {
            v.isPage = true;
        });
 
        return e;
    });
 
    return {
        // 模块列表
        list,
        // 事件加载
        async eventLoop() {
            const events: any = {};
 
            for (let i = 0; i < list.length; i++) {
                if (list[i].onLoad) {
                    assign(events, await list[i]?.onLoad?.(events));
                }
            }
        }
    };
}