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:
zyc
2026-06-17 20:40:10 +08:00
co-authored by Claude Opus 4.8
parent c9fb7139ac
commit 4cef215853
+7 -3
View File
@@ -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;