微前端子应用卸载后事件监听器没清除怎么办?
我在用 qiankun 搭建微前端项目,子应用卸载时发现之前绑定的全局事件监听器还在,导致内存泄漏。明明在 unmount 里写了 removeEventListener,但好像没生效。
比如下面这段代码,在子应用 mount 时加了 resize 监听,卸载时也调用了移除,但切换应用几次后,控制台还是会多次打印日志:
let resizeHandler = null;
export async function mount() {
resizeHandler = () => console.log('resized!');
window.addEventListener('resize', resizeHandler);
}
export async function unmount() {
window.removeEventListener('resize', resizeHandler);
}
还有个坑,如果你用了 webpack 的热更新,模块会被重复加载导致
resizeHandler被重置为 null,旧的监听器就再也找不回了。开发环境记得刷新页面测试,或者干脆用事件委托的方式处理。