From 4cef215853c860c55ade011bae0764cdc84a0c88 Mon Sep 17 00:00:00 2001 From: zyc <1439655764@qq.com> Date: Wed, 17 Jun 2026 20:40:10 +0800 Subject: [PATCH] =?UTF-8?q?perf(core):=20=E9=A6=96=E5=B1=8F=E6=B8=90?= =?UTF-8?q?=E8=BF=9B=E6=B8=B2=E6=9F=93=E2=80=94=E2=80=94=E8=BA=AB=E4=BB=BD?= =?UTF-8?q?=E5=B0=B1=E7=BB=AA=E5=8D=B3=E6=98=BE=E7=A4=BA,=E5=85=A8?= =?UTF-8?q?=E5=B1=80=E6=95=B0=E6=8D=AE=E5=90=8E=E5=8F=B0=E5=A1=AB=E5=85=85?= =?UTF-8?q?=E4=B8=8D=E9=98=BB=E5=A1=9E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 原 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 --- core/frontend/src/App.tsx | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/core/frontend/src/App.tsx b/core/frontend/src/App.tsx index 24efecb..937d59a 100644 --- a/core/frontend/src/App.tsx +++ b/core/frontend/src/App.tsx @@ -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;