perf(core): 首屏渐进渲染——身份就绪即显示,全局数据后台填充不阻塞
原 boot 在 me() 后 await loadDataWithRetry() 才 setBooting(false),整屏「加载中…」要等齐 全部全局接口(products/projects/billing/models/未读)中最慢的那个才消失。 改为:me() 校验身份成功即 setBooting(false) 渲染外壳;商品/项目/余额/未读 后台并行填充, 页面骨架先出来、数据到了再补。数据加载失败只记录,不阻塞渲染、不踢登录(token 已验证)。 各页本就处理空初始态;深链(pipeline/商品详情)按 route 独立取详情,不依赖全局列表。 实测:外壳 ~1.3s(me 返回即出)显示,products/projects ~1.7-1.9s 在其后填充—— 任何全局接口变慢不再卡住首屏。 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -228,14 +228,18 @@ export function App() {
|
|||||||
if (cancelled || !identity) return;
|
if (cancelled || !identity) return;
|
||||||
setUser(identity.user);
|
setUser(identity.user);
|
||||||
setTeam(identity.team);
|
setTeam(identity.team);
|
||||||
await loadDataWithRetry();
|
|
||||||
} catch (bootError) {
|
} catch (bootError) {
|
||||||
console.error("[boot] failed:", bootError);
|
// 仅「身份校验失败」才登出;me() 成功后的数据加载失败不在此处
|
||||||
|
console.error("[boot] identity failed:", bootError);
|
||||||
setToken(null);
|
setToken(null);
|
||||||
if (!cancelled) setAuthed(false);
|
if (!cancelled) setAuthed(false);
|
||||||
} finally {
|
|
||||||
if (!cancelled) setBooting(false);
|
if (!cancelled) setBooting(false);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
// ★ 身份就绪即渲染外壳,不等全局数据 —— 商品/项目/余额/未读 后台并行填充,页面骨架先出来。
|
||||||
|
if (!cancelled) setBooting(false);
|
||||||
|
// 全局数据后台加载;失败只记录(token 已验证有效,不踢登录、不阻塞渲染)
|
||||||
|
loadDataWithRetry().catch((dataError) => console.error("[boot] data load failed:", dataError));
|
||||||
})();
|
})();
|
||||||
return () => {
|
return () => {
|
||||||
cancelled = true;
|
cancelled = true;
|
||||||
|
|||||||
Reference in New Issue
Block a user