From 83684b4c7b560d2c0fa9c0fd0a63294fad7e47ea Mon Sep 17 00:00:00 2001 From: plum <40649341+plum-k@users.noreply.github.com> Date: Fri, 10 Apr 2026 11:22:28 +0800 Subject: [PATCH] fix(sdk): fix loader lifecycle for consecutive offline pack imports --- packages/sdk/lib/core/loader/Package.ts | 47 ++++++++++++++++++++++--- 1 file changed, 42 insertions(+), 5 deletions(-) diff --git a/packages/sdk/lib/core/loader/Package.ts b/packages/sdk/lib/core/loader/Package.ts index 89ffcf9..63b6da6 100644 --- a/packages/sdk/lib/core/loader/Package.ts +++ b/packages/sdk/lib/core/loader/Package.ts @@ -964,6 +964,11 @@ export class Package { unpackConfig.onProgress && unpackConfig.onProgress(0); let totalZipNumber = 0, progress = 0; + // 每次解包前确保 loader 可用 + if (!this.loader) { + this.loader = new ObjectLoader(); + } + await this.initOfflineSource(unpackConfig); if (!this.offlineZipMap && !this.offlineFlatPackages) { @@ -998,8 +1003,7 @@ export class Package { that.offlineFlatPackages = null; that.offlineFlatEntryBase = null; that.dataComponentMap = null; - // @ts-ignore 清除loader - that.loader = undefined; + // 不清除 loader,避免连续导入时被上一轮异步收尾误清理 } const complete = () => { @@ -1436,8 +1440,26 @@ export class Package { const parse = (json) => { if (check(json.object, json)) { - if (!loader) return; - loader.parse(json, (group) => { + if (!loader) { + // 生产环境定位: 打印关键上下文和调用栈 + console.error("[Package.unpackGroup] loader is undefined before parse", { + uuid, + rootGroupUuid, + parent, + callFunNum: this.callFunNum?.value, + hasJson: Boolean(json), + childCount: json?.object?.children?.length, + currentLoader: this.loader, + capturedLoader: loader, + stack: new Error("[Package.unpackGroup] missing loader").stack + }); + + // 防止早退导致 callFunNum 无法归零,进度卡住 + this.callFunNum.value--; + return; + } + try { + loader.parse(json, (group) => { const bones: Bone[] = []; group.getObjectsByProperty("type", "Bone", bones); if (bones.length > 0) { @@ -1469,7 +1491,22 @@ export class Package { funcMap.forEach((func, uuid) => { func.call(this, uuid, group, rootGroupUuid); }) - }) + }) + } catch (err) { + console.error("[Package.unpackGroup] loader.parse threw", { + uuid, + rootGroupUuid, + parent, + callFunNum: this.callFunNum?.value, + hasJson: Boolean(json), + childCount: json?.object?.children?.length, + currentLoader: this.loader, + capturedLoader: loader, + err, + stack: err instanceof Error ? err.stack : new Error("[Package.unpackGroup] parse error").stack + }); + throw err; + } } else { const timer = setTimeout(() => { clearTimeout(timer);