Sfoglia il codice sorgente

[Fix SEC-20260913] 恢复 qiankun 卸载竞态修复(防旧实例与新实例并存)

lizuo 1 settimana fa
parent
commit
d8c0419b64
1 ha cambiato i file con 14 aggiunte e 8 eliminazioni
  1. 14 8
      src/qiankun/index.ts

+ 14 - 8
src/qiankun/index.ts

@@ -35,17 +35,23 @@ const mountMicroApp = (name, isReFresh = false) => {
   }
 };
 
+// 卸载app的方法
 const unmountMicroApps = async (multipleApp) => {
-  if (JSON.stringify(activeApps) !== '{}' && multipleApp.some) {
-    for (const key in activeApps) {
-      multipleApp.filter(async (name) => {
-        if (name.includes(key)) {
-          await activeApps[key].unmount();
-        }
-      });
+  // [fix-subapp-loading] 修复卸载竞态:原实现用 multipleApp.filter(async (name) => { await …unmount() })
+  // —— async 回调使 filter 立即返回、await 不被任何方等待,卸载是"发射后不管";
+  // 且判断条件 multipleApp.some 是函数引用(恒真)。改为顺序 await 逐个卸载,完成后清理注册表,
+  // 避免旧实例与新实例并存争抢容器/共享状态(子应用切页互清场景)。
+  if (!multipleApp || multipleApp.length === 0) return;
+  for (const key of Object.keys(activeApps)) {
+    if (multipleApp.some((name) => name.includes(key))) {
+      try {
+        await activeApps[key].unmount();
+      } catch (e) {
+        console.error('[fix-subapp-loading] 微应用卸载失败:', key, e);
+      }
+      delete activeApps[key];
     }
   }
-  if (!multipleApp || multipleApp.length === 0) return;
 };
 
 export { mountMicroApp, unmountMicroApps, activeApps };