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;
|
||||
setUser(identity.user);
|
||||
setTeam(identity.team);
|
||||
await loadDataWithRetry();
|
||||
} catch (bootError) {
|
||||
console.error("[boot] failed:", bootError);
|
||||
// 仅「身份校验失败」才登出;me() 成功后的数据加载失败不在此处
|
||||
console.error("[boot] identity failed:", bootError);
|
||||
setToken(null);
|
||||
if (!cancelled) setAuthed(false);
|
||||
} finally {
|
||||
if (!cancelled) setBooting(false);
|
||||
return;
|
||||
}
|
||||
// ★ 身份就绪即渲染外壳,不等全局数据 —— 商品/项目/余额/未读 后台并行填充,页面骨架先出来。
|
||||
if (!cancelled) setBooting(false);
|
||||
// 全局数据后台加载;失败只记录(token 已验证有效,不踢登录、不阻塞渲染)
|
||||
loadDataWithRetry().catch((dataError) => console.error("[boot] data load failed:", dataError));
|
||||
})();
|
||||
return () => {
|
||||
cancelled = true;
|
||||
|
||||
Reference in New Issue
Block a user