91 lines
2.7 KiB
JavaScript
Raw Normal View History

/**
* module-lifecycle.js
* 模块生命周期管理 - 让模块知道自己何时加载/卸载/收到消息
* 配合事件总线使用
*/
const ModuleLifecycle = (function() {
// 存储每个模块的钩子函数
const hooks = {};
// 注册模块的生命周期钩子
function register(moduleId, lifecycles) {
if (!moduleId) return;
hooks[moduleId] = {
onLoad: lifecycles.onLoad || null,
onUnload: lifecycles.onUnload || null,
onMessage: lifecycles.onMessage || null
};
console.log(`[lifecycle] 注册模块: ${moduleId}`, lifecycles);
// 如果已经加载比如页面初始化时自动触发onLoad
// 这里留给loader去调用
}
// 触发模块加载
function triggerLoad(moduleId, params) {
const moduleHooks = hooks[moduleId];
if (moduleHooks && moduleHooks.onLoad) {
try {
moduleHooks.onLoad(params);
console.log(`[lifecycle] onLoad 模块: ${moduleId}`);
} catch (e) {
console.error(`[lifecycle] onLoad 模块 ${moduleId} 出错:`, e);
}
}
}
// 触发模块卸载
function triggerUnload(moduleId) {
const moduleHooks = hooks[moduleId];
if (moduleHooks && moduleHooks.onUnload) {
try {
moduleHooks.onUnload();
console.log(`[lifecycle] onUnload 模块: ${moduleId}`);
} catch (e) {
console.error(`[lifecycle] onUnload 模块 ${moduleId} 出错:`, e);
}
}
// 卸载时自动取消该模块的所有事件订阅
// 这里简单使用事件总线的off但需要知道该模块订阅了哪些事件
// 我们约定模块在订阅时使用带命名空间的事件名,比如 moduleA:click
// 或者在onUnload里手动取消。为了简化我们不清除订阅但可以在onUnload里做。
// 更完善的做法是记录每个模块的订阅列表,但这里先不实现。
}
// 触发模块收到消息(由事件总线转发时调用)
function triggerMessage(moduleId, message, data) {
const moduleHooks = hooks[moduleId];
if (moduleHooks && moduleHooks.onMessage) {
try {
moduleHooks.onMessage(message, data);
console.log(`[lifecycle] onMessage 模块: ${moduleId} 消息: ${message}`);
} catch (e) {
console.error(`[lifecycle] onMessage 模块 ${moduleId} 出错:`, e);
}
}
}
// 获取模块的钩子(用于调试)
function getHooks(moduleId) {
return hooks[moduleId] || null;
}
return {
register,
triggerLoad,
triggerUnload,
triggerMessage,
getHooks
};
})();
window.ModuleLifecycle = ModuleLifecycle;
if (typeof module !== 'undefined' && module.exports) {
module.exports = ModuleLifecycle;
}