本报告基于对构建配置、依赖体积、渲染策略、数据链路、静态资源和运行时模式的静态审计(未跑 Lighthouse 实测; Lighthouse 复测列为优化方案第 0 阶段任务)。每项问题带有严重级别、证据文件路径和量化影响估计。
🚨 Lighthouse 移动端实测(Slow 4G Throttling · 8 个页面 · 2026-04-19):
Performance Score 分布 25 / 26 / 28 / 28 / 29 / 29 / 33 / 46(满分 100,Good ≥ 90),全数不及格。
最差页 /app/workflow:LCP 44.9 s、TTI 45.2 s、下载 9.8 MB、主线程 35.2 s、重定向链 7.8 s。
最大单资源:/quick-search/all-assets JSON 2.5 MB,icon0.svg 1.2–1.5 MB(favicon bug),cooking GIF 单张 1.5 MB。
所有页面被重定向到 /zh/,浪费 1.3–7.8 秒。
当前瓶颈并非业务代码,而是三条结构性失衡:
① 首屏「万物 client」:412/1,652 个 TSX 标记 'use client'(25%),首页、use-case、about 全部客户端渲染;
generateStaticParams 用量为 0,<Suspense> 用量为 0,整个站点退化为纯 SSR on-demand;
营销页无法享受 SSG / 流式渲染。
② 138 MB 公共资源 + 10+ 无策略第三方脚本:单张 GIF 27 MB、hero 背景 PNG 13–14 MB、OG 图每张 3 MB;
<head> 中同时加载 GA/GTM/Facebook Pixel ×3 ID/CoinGecko/TradingView 库/canvas-datagrid (unpkg)/7 套 Google Fonts,
其中 markdown-it-fix 以 beforeInteractive 阻塞水合。
③ 依赖与路由双重冗余:highlight.js + react-syntax-highlighter + prismjs 三套高亮库并存;
echarts 与 TradingView charting_library(2.7 MB bundle)双图表栈;
how-to-guides 目录 30 个 1,909 行模板复制粘贴共 ~57K 重复 LOC;
ignoreBuildErrors + ignoreDuringBuilds 关闭了类型与 lint 的 CI 保护。
保守可回收:JS 初始包 ~2.5 MB · 静态资源 ~60 MB · 首屏第三方脚本 6 个。 预计修复后 LCP 改善 1.5–3 s,TBT 下降 40–70%,月度流量成本同比下降 ≥30%。
🔥 Chrome 实测补充(见下方「线上实测」节):
未登录的营销页 /home 冷加载 37 个 fetch 请求,其中 cross-chain/activities 被调 8 次、
pnls/all 被调 6 次、arbitrum/batch 被调 6 次 —— Root Layout 里的 Auth/Wallet Provider 在无条件拉用户数据。
同一个 757 KB 大 chunk(1476-*.js)在所有路由都加载。/app/chat 冷启动 73 个 fetch · 4.5 MB。
'use client'、dynamic()、generateStaticParams、useRequest、setInterval、namespace import、memo 等模式。package.json 与实际导入,识别重复库、未 lazy 的重型包。src/app/[locale]/、src/router/ 目录抽样读 layout/page 文件。find public -size +1M、按扩展名统计、定位引用点。src/app/[locale]/layout.tsx 全文 (220 行) 提取 Provider 树、Script 树、字体链。未执行:next build --profile 生成真实 bundle 图、火焰图采集(Chrome DevTools Performance 面板)。
下节的 Lighthouse 实测已经覆盖了 CWV 基线。
| 页面 | Score | LCP | FCP | TBT | TTI | SI | CLS | TTFB | Bytes | Unused JS | Main Thread |
|---|---|---|---|---|---|---|---|---|---|---|---|
/home |
28 | 20.8 s | 4.2 s | 2.3 s | 33.6 s | 22.1 s | 0.000 | 194 ms | 5.5 MB | 1.6 MB | 34.6 s |
/about |
29 | 21.0 s | 6.3 s | 1.5 s | 42.6 s | 21.3 s | 0.000 | 180 ms | 5.4 MB | 0.8 MB | 20.9 s |
/use-cases |
33 | 17.1 s | 3.2 s | 2.0 s | 24.4 s | 8.4 s | 0.000 | 205 ms | 3.8 MB | 1.1 MB | 15.9 s |
/how-to-guides/[slug] |
46 | 4.0 s | 3.6 s | 1.7 s | 23.1 s | 7.7 s | 0.000 | 195 ms | 3.7 MB | 0.8 MB | 11.5 s |
/app/chat |
28 | 20.6 s | 3.4 s | 2.3 s | 31.3 s | 15.3 s | 0.099 | 189 ms | 10.7 MB | 1.5 MB | 36.4 s |
/app/trade/perps/BTC |
26 | 28.3 s | 4.8 s | 2.1 s | 34.5 s | 14.7 s | 0.102 | 188 ms | 7.3 MB | 1.5 MB | 19.9 s |
/app/strategy-studio |
29 | 29.4 s | 4.0 s | 1.1 s | 33.8 s | 25.7 s | 0.145 | 511 ms | 11.0 MB | 1.5 MB | 45.8 s |
/app/workflow 🏆 最差 |
25 | 44.9 s | 9.7 s | 2.4 s | 45.2 s | 26.1 s | 0.077 | 199 ms | 9.8 MB | 1.5 MB | 35.2 s |
| Good 阈值 | ≥ 90 | < 2.5 s | < 1.8 s | < 0.2 s | < 3.8 s | < 3.4 s | < 0.1 | < 0.8 s | - | - | < 2 s |
/app/workflow 44.9 s · /app/strategy-studio 29.4 s · /app/trade/perps/BTC 28.3 s
· /about 21.0 s · /home 20.8 s · /app/chat 20.6 s · /use-cases 17.1 s
· /how-to-guides/[slug] 4.0 s(唯一接近 Poor 边界的)。
Good 阈值是 2.5 s,当前大部分值是阈值的 7–18 倍。| 页面 | Main Thread | TTI | TBT |
|---|---|---|---|
/app/chat | 36.4 s | 31.3 s | 2.3 s |
/home | 34.6 s | 33.6 s | 2.3 s |
/about | 20.9 s | 42.6 s | 1.5 s |
/use-cases | 15.9 s | 24.4 s | 2.0 s |
/how-to-guides/[slug] | 11.5 s | 23.1 s | 1.7 s |
'use client' + 40+ 重型依赖 + 无 code splitting 的共同结果。/_next/static/chunks/1476-96a798bef671f884.js 757 KB 在所有路由加载。next/dynamic)+ P1.5(barrel / namespace import 重构)。/zh/,白白耗 1.3–4.3 秒/zh/ 前缀(例:/about → /zh/why-minara/about 实际是 两跳 重定向)。
这源于 next-intl 无法根据 Lighthouse 的 Accept-Language 正确判定 locale 后重定向;
真实用户中非中文地区用户也会遇到同样路由链问题。/about 的 4.3 秒 意味着单个重定向问题占其 FCP 6.3s 的 68%。| 资源 | /chat | /perps/BTC | /strategy-studio | /workflow |
|---|---|---|---|---|
api.minara.ai/quick-search/all-assets (JSON) | 2,563 KB | 1,699 KB | 2,564 KB | 2,563 KB |
minara.ai/zh/icon0.svg (favicon!) | 1,210 KB | – | 1,466 KB | – |
images/cooking/*.gif (2 个) | ~2,500 KB | ~1,024 KB | ~2,495 KB | ~2,501 KB |
/charting-library/charting_library.js | – | 15 KB* | 15 KB* | 14 KB* |
_next/static/chunks/1476-*.js (大共享) | 757 KB | 757 KB | 757 KB | 757 KB |
_next/static/chunks/5728-*.js | 290 KB | 290 KB | 290 KB | 290 KB |
widgets.coingecko.com/...widget.js | 213 KB | 213 KB | 213 KB | 213 KB |
| 页面总下载 | 10.7 MB | 7.3 MB | 11.0 MB | 9.8 MB |
/quick-search/all-assets 每次都返回 1.7–2.6 MB JSON — 应该分页或按字段缩减icon0.svg 1.2–1.5 MB 是明显 bug(正常 SVG favicon < 5 KB)/app/workflow 加载毫无必要,应下沉到 /app/trade/** + /app/strategy-studio 两个分组/app/strategy-studio、/app/workflow 的 Lighthouse 首屏网络请求里没有 Monaco editor(vs/editor)、
echarts、@xyflow/react 相关 chunk —— 说明这几个库都是用户触发(点按钮、打开画布)才加载。| Entity | Transfer | Main Thread | 备注 |
|---|---|---|---|
| Facebook Pixel | 269–270 KB | 89–120 ms | 3 个 pixel ID + Privacy Sandbox register × 3 |
| CoinGecko widget | 213 KB | 28–30 ms | 所有 5 个页面都加载,仅需在特定路由 |
| Google OAuth SDK | 96 KB | 7–8 ms | Root Layout 无条件挂载 |
| unpkg canvas-datagrid | 62 KB | 5–6 ms | 未固定版本的 CDN,非必需 |
| Google Fonts | 174–423 KB | 0 ms | 7 套字体,Noto Serif SC 对所有语言加载 |
| YouTube embed | 451 KB(仅 /about) | - | 新发现:about 页嵌入了 YouTube 播放器 |
/token/* 或 /app/* 路由内;
YouTube embed 应换 lite-youtube-embed 方案(把 451 KB 延迟到 user click)。| 指标 | 原静态估算 | Lighthouse 实测(最差页) | 修正后认知 |
|---|---|---|---|
| LCP | 4.0–6.5 s | 21.0 s | 严重低估,实际是阈值 8 倍 |
| TBT | 0.6–1.4 s | 2.3 s | 低估约 60% |
| TTI | 5–9 s | 42.6 s | 严重低估,实际是估算 5–8 倍 |
| 首屏 Bytes | 3.3 MB | 10.7 MB(/app/chat) | /app/chat 实际更重 |
| Unused JS | - | 1.6 MB | 新发现可救 1.6 MB 死代码 |
| CLS | 0.15–0.25 | 0–0.099 | 高估 · CLS 实际已 Good |
结论: 原静态审计对 CWV 的量级判断偏乐观。LCP / TTI 实际是估算的 5–8 倍。 CLS 原以为是问题,实际已 pass(字体 display=swap 起作用)。 优化方案 P0.X "重定向链根治" 从未列入,现在必须补到 P0.0 作为紧急任务(收益 1.3–4.3 s,工作量 < 1 小时)。
| 页面 | TTFB | DCL | Load | 下载总量 | 脚本量 | 资源数 | 长任务 | fetch 数 |
|---|---|---|---|---|---|---|---|---|
/app/chat 首次 |
- | 4515 ms | 6305 ms | 3.3 MB | 3.1 MB | 193 | 7 / 1081 ms | - |
/home(营销) |
184 ms | 677 ms | 3124 ms | 2.4 MB | 2.2 MB | 119 | 4 / 701 ms | - |
/home?cb=cold1 (SW 卸) |
551 ms | 1208 ms | 1373 ms | 4.0 MB | 3.2 MB | 152 | 6 / 752 ms | 37 |
/about → 跳 /why-minara/about |
710 ms | 1198 ms | 6266 ms | 3.3 MB | 1.9 MB | 113 | 4 / 773 ms | 23 |
/use-cases |
478 ms | 738 ms | 1355 ms | 2.3 MB | 1.9 MB | 95 | 2 / 167 ms | 23 |
/how-to-guides/btc-eth-... |
244 ms | 724 ms | 2152 ms | 2.7 MB | 1.9 MB | 112 | 2 / 405 ms | 26 |
/app/chat?cb=cold1 |
209 ms | 761 ms | 1078 ms | 4.5 MB | 3.2 MB | 178 | 4 / 580 ms | 73 |
| URL | /home 冷 | /app/chat 冷 | /use-cases |
|---|---|---|---|
api.minara.ai/v1/tx/cross-chain/activities | 8 | 8 | 4 |
api.minara.ai/users/pnls/all | 6 | 4 | 4 |
outpost.minara.ai/api/v1/prices/arbitrum/batch | 6 | 4 | 4 |
outpost.minara.ai/api/v1/prices/ethereum/batch | - | 5 | - |
token.minara.ai/api/v1/public/token/info/0x2260…(WBTC) | - | 4 | - |
api.minara.ai/v1/fully-managed/futures-grid/positions | - | 4 | - |
api.minara.ai/discover/events | - | 4 | - |
api.minara.ai/limit-order-bot | 3 | - | 2 |
static.minara.ai/demo/chat-demo.mp4 | 3 | - | - |
api.hyperliquid.xyz/info | - | 3 | - |
fonts.googleapis.com/css2 | - | 7 | - |
facebook.com/tr + privacy_sandbox/pixel/register | - | 3 + 3 | - |
/home、/use-cases)都在调用 pnls/all、cross-chain/activities 之类的用户态接口 —— 大概率是 Root Layout 的 CustodialWalletStoreProvider / UserAuthStoreProvider 在挂载时无条件触发;
ahooks.useRequest 没配 cacheKey,多个组件并行请求同一资源时不会去重;
chat-demo.mp4 被请求 3 次暗示视频组件多次挂载或有 bug;
Facebook Pixel 3 ID 各自触发一次 tr + 一次 Privacy Sandbox 注册,6 个额外请求纯浪费;
fonts.googleapis.com/css2 一次加载发 7 个请求,直接印证静态审计结论。/_next/static/chunks/1476-96a798bef671f884.js
= 757 KB,在 /home、/about、/use-cases、/how-to-guides/[slug]、/app/chat 每个页面都出现。
首次下载冷加载耗时 3.6 s;后续走缓存 0 ms。'use client' 根层级蔓延 + 重型依赖未 dynamic 的后果;该 chunk 本身应拆为 5–10 个路由级 chunk。
是"单页 JS 首屏 3 MB"的根本成因。/app/chat 冷加载 73 个 fetch · 4.5 MB/app/chat?cb=cold1:178 resources,73 个 fetch/XHR,4.5 MB 总下载,3.2 MB 脚本;
cooking/2.gif 1,000 KB(实际测到);
api.minara.ai 单机打中 21 次(含 8 次同接口重复)。/home 184 ms、/use-cases 478 ms、/about 710 ms、/how-to-guides/[slug] 244 ms。/sw/navigator.serviceWorker.getRegistrations() 返回 1 个 SW,scope https://minara.ai/sw/;
cache storage 空(说明 SW 还未缓存业务资源或使用 runtime 策略)。
minara.ai/cdn-cgi/rum 出现在网络面板 → Cloudflare RUM 已部署,意味着线上已经有真实 CWV 数据,建议查看 Cloudflare 控制台 Web Analytics。connect.facebook.net/en_US/fbevents.js (96 KB)、unpkg.com/canvas-datagrid、ipapi.co、
fonts.googleapis.com × 7、mpc2-prod-25-...a.run.app(MPC 钱包服务)全页面加载。| 审计断言 | 静态推断 | 实测验证 |
|---|---|---|
| 营销页无 SSG | 代码侧 generateStaticParams = 0 | ✅ 印证 · TTFB 波动 184–710 ms |
| 未登录页也跑 Auth/Wallet Provider | Root Layout 无条件挂载 | ✅ 印证 · pnls/all 在 /home 被调 6 次 |
useRequest 缺 cacheKey | discover/trade store 静态扫描 | ✅ 印证 · 同一接口 4–8 次重复 |
| 7 套 Web 字体 | layout.tsx <link> 清点 | ✅ 印证 · fonts.googleapis.com 被请求 7 次 |
| FB Pixel 3 ID 冗余 | layout.tsx 静态字符串 | ✅ 印证 · facebook.com/tr 3 次 + Privacy Sandbox 3 次 |
| unpkg.com canvas-datagrid 全站加载 | layout.tsx 全局 <Script> | ✅ 印证 · 每个页面都出现 |
| 单个大 chunk 拖垮所有页面 | barrel + 'use client' 蔓延推测 | ✅ 印证 · 757 KB 的 1476-*.js 在所有路由 |
| 3+ MB 图片在首屏 | public/ 目录扫描 | ⚠️ 部分 · cooking/2.gif 1 MB 实测加载,大 hero PNG 尚未在测过页面触发,需在实机上滚动确认 |
| 长任务主线程阻塞 | React 重型库 + Provider 堆叠推测 | ✅ 印证 · 首次访问 7 次长任务 / 1081 ms |
本节尚未测到的关键实测项: LCP、FCP、CLS、INP(需前台 tab)、单个用户路径的 CPU 火焰图、实际渲染延迟。 建议配合 PageSpeed Insights 和 Cloudflare Web Analytics 的 P75 数据补齐。
package.json 同时声明 highlight.js、react-syntax-highlighter、prismjs。
实际导入仅分布在 5 个文件(markdown render、code viewer、openclaw-skill entry、layout css),
但三个库均被打入 bundle。src/router/how-to-guides/ 下 30+ 目录,每个 index.tsx 恰为 1,909 行;
对比 btc-eth-trading-strategy-complete-battle-plan 与 estimate-roi-virtual-genesis-launches-expected-returns,
骨架 100% 一致,仅内嵌 JSON 文案不同。app/[locale]/how-to-guides/[slug]/page.tsx + 每 slug 的 content.json)。ignoreBuildErrors + ignoreDuringBuilds 关闭 CI 保护next.config.mjs L15–19:eslint.ignoreDuringBuilds: true、
typescript.ignoreBuildErrors: true。src/ 下 20+ 文件使用 import * as X;
components/primitive/index.ts、features/chat-base/index.ts、utils/date/index.ts 等 barrel 用
export * 再导出;lodash 有 41 处以 from 'lodash' 整包引入(optimizePackageImports 只能救部分,顶层 namespace 仍打全包)。import * 彻底禁用 shaking。单次页面跳转额外拉 200–600 KB 不等。echarts + echarts-for-react 已在 optimize 列表;
public/charting-library/charting_library/bundles/library.8fdacc60e5256d6fcc84.js 单文件 2.7 MB;
TradingView 在 layout.tsx L149 <Script defer> 全局加载,不止交易路由。jotai / jotai-immer 用途未说明。jotai 实际用量,
若仅分散几处建议统一到 zustand。next/dynamic 仅见于 spreadsheet 的 canvas-grid 与 Monaco editor modal。
cropperjs、dom-to-image、@zumer/snapdom、@xyflow/react、
canvas-datagrid、katex、react-syntax-highlighter、@lexical/*
等均为静态 import。next build,非缺陷,待 15.4+ 再评估。'use client'src/router/homepage/index.tsx 及其 11 个同级文件(action/content/footer/trusted/voices/capability/layout/header/powered/download-app-modal)均 'use client'。src/router/use-case/index.tsx、src/router/about/index.tsx 同样 client。generateStaticParams 零使用 · <Suspense> 零使用 · 无 loading.tsxgenerateStaticParams 结果为 0;Suspense 结果为 0;find src/app -name loading.tsx 无命中。仅一个 force-dynamic(api/proxy-favicon)。src/app/[locale]/layout.tsx L188–215,嵌套:
NextIntlClientProvider → ThemeStoreProvider → FloatLayerProvider → LayoutStoreProvider → GoogleOAuthProvider → UserAuthStoreProvider → ShareChatImageStore → MaybeUserStoreProvider → CustodialWalletStoreProvider。
UserAuthStoreProvider 在挂载时读 credential、解析 device info,
CustodialWalletStoreProvider 挂载时绑定 emitter。/about 也要跑完整登录态初始化;
水合时间包含每层 Provider 的首次 effect。react: ^19、next: 15.3.6;
next.config.mjs experimental 仅 optimizePackageImports,无 ppr、无 reactCompiler;
package.json 未见 babel-plugin-react-compiler。src/trade/shared/trade.service.ts L304/326/419/447:仓位、订单、账户概览 3 / 4 / 5–30 / 10 s 轮询。src/store/discover/index.ts L147/181–191:恐慌/贪婪、BTC、全局市场指标 30 s 轮询,均无 cacheKey。src/services/use-chat-list.ts L27:运行中 3 s 轮询聊天列表。src/components/swap/use-simulate-swap.ts、token-window stock、spreadsheet 均 5–10 s 轮询。setInterval/setTimeout;抽样 12 个未见 cleanup。useRequest 全无 cacheKey;
src/request/service.ts 原生 fetch 不带 cache / next.revalidate 选项;
src/features/chat-base/message-view/section/schema/token-link-base.tsx L65–66 设 cacheTime: -1, staleTime: -1(反模式)。src/store/trade-store/index.ts 导出 41 个 selector;
src/store/chat/index.tsx L286 constate(useChatService, s => s) 暴露整个 state;
抽样消费点多为整 store 读取而非细粒度 selector。src/features/chat-base/core/xhr-stream-utils.ts L152–332:RAF 节流、连接复用、429 识别都到位。
流式 markdown(create-streaming-markdown.tsx)采用段落级哈希 memo,完成段落不再重算。| 文件 | 大小 | 建议动作 |
|---|---|---|
public/images/guide/minara.gif | 27 MB | 转 MP4/WebM,预计 1–2 MB |
public/images/share/dark/background.png | 14 MB | 转 WebP + 降分辨率 |
public/images/copilot/hero-bg.png | 13 MB | 转 WebP + 降分辨率 |
public/images/share/light/background.png | 7.1 MB | 转 WebP + 降分辨率 |
korea-trading-competition/hero.png | 4.9 MB | 转 WebP |
og/image-0.png · image-1.png · image-2.png | 3 × ~3 MB | OG 规范 < 500 KB,WebP/JPEG 85q |
cooking/1.gif – 4.gif | ~4 MB 合计 | 转 WebM,< 200 KB/个 |
<head> 中 6 个第三方脚本无 lazy 策略src/app/[locale]/layout.tsx
gtag.js + 内联 config(两条 <Script>)markdown-it-fix 显式 strategy="beforeInteractive",阻塞水合unpkg.com/canvas-datagrid(无 SRI、无版本锁)<Script> 默认 afterInteractive,但放 <head> 里仍会与 HTML 解析竞争主线程。
unpkg 未固定版本存在供应链风险。next/font/google 加载 Roboto 3 档;layout.tsx L154–166 另加 6 个 <link>:
DM Serif Text、Pixelify Sans、Jost、Righteous、Noto Serif、Noto Serif SC。<img> 绕过 next/image<img> 24 处 vs next/image 35 处;
其中 WrappedImage(内部 <img>)被用于 27 MB GIF、13 MB hero PNG。minara-logo-with-text-light.svg、minara-logo-with-text-dark.svg 各 618 KB,
且同时存在于 public/svgs/ 与 public/images/;about/blockchain.svg 959 KB;
chain/base.svg 793 KB。next.config 允许任意远程图片来源images.remotePatterns 通配 * 的 http/https。src/router/session/discover/news-page/index.tsx L60–68 直接对 eventsList 做 .map() 渲染 NewsCard;
NewsCard 本身是 framer-motion 动画组件;feed 可能长达 100+ 条。useMemo / useCallback 使用分散在 424 文件,但父组件未 memo 的情况下效果大减;
create-markdown-render.tsx L198–227 存在 5 条串联预处理 useMemo 可合并。app/[locale]/campaign/trading-competition/leaderboard.tsx L36/228/231 循环内 style={{ ... }};
chat message view 16 处 onClick={() => ...} 未抽出。console.warnfeatures/chat-base/message-view/section/create-markdown-render.tsx L53/159/224;
生产构建已开 compiler.removeConsole,但仅对非 dev 环境。getTranslationssrc/app/[locale]/share/chat/[id]/layout.tsx L15/46/53 同请求周期 3 次调用。| # | 问题 | 影响面 | 估计收益 | 工作量 | 级别 |
|---|---|---|---|---|---|
| 1 | 第三方脚本策略化 + 下沉 TradingView/CoinGecko 至对应路由 | TBT / LCP / TTI | -400 ~ -1200 ms TBT | S | Critical |
| 2 | 27 MB GIF 转 WebM + 13/14 MB hero PNG 转 WebP | 流量 / LCP | -45 MB 流量, -1~2 s LCP | S | Critical |
| 3 | how-to-guides 30 模板重构为单路由 + 内容 metadata | 构建 / 维护 / 包体 | -57K LOC | M | Critical |
| 4 | 首页 / about / use-case 切 RSC + 启用 SSG | LCP / SEO / CDN 缓存 | -1.5~3 s LCP | M | Critical |
| 5 | 语法高亮三合一:保留 react-syntax-highlighter 或改 Shiki SSR | 包体 | -1.0 MB | S | Critical |
| 6 | 移除 ignoreBuildErrors + ignoreDuringBuilds | 可靠性 | 防止回归 | S | Critical |
| 7 | namespace import + barrel re-export 重构 | 包体 / tree-shake | -200~600 KB/页 | M | Critical |
| 8 | 字体瘦身:删除 Jost/Righteous/Pixelify;Noto Serif SC 仅 zh locale | LCP / CLS | -150~300 ms | S | High |
| 9 | 重型库按 next/dynamic + ssr:false 切分 | 包体 / 初始 JS | -30~50%/页 初始 JS | M | High |
| 10 | 引入 Suspense + loading.tsx + 启用 PPR / React Compiler | TTI / 体验 | 感知更快 | M | High |
| 11 | discover 轮询加 cacheKey / 指数退避 / visibilitychange 暂停 | CPU / 带宽 / 成本 | 后台 CPU -70% | S | High |
| 12 | discover news feed 虚拟化 | 滚动 FPS | > 55 FPS | S | High |
| 13 | echarts vs TradingView 选型统一,或严格路由级分包 | 包体 | -600 KB | M | High |
| 14 | 3 张 OG PNG 压缩 + SVG 去重 + 24 处 <img> 替换 next/image | 流量 / 体验 | -10 MB | S | Medium |
| 15 | Root layout Provider 下沉:Auth/Wallet 挪到 session 分组 | 水合时间 / SSG 可行性 | -100~200 ms TTI | M | Medium |
| 16 | zustand/constate 细粒度 selector + 审计 jotai 实际用量 | 再渲染次数 | 减少无效 render | M | Medium |
| 17 | Share layout 合并 getTranslations + 删 console.warn 热路径 | SSR 时延 | -10~30 ms SSR | S | Low |
| 指标 | 基线(最差页) | P0 末 | P1 末 | 最终 | 主要拉动修复项 |
|---|---|---|---|---|---|
| Performance Score | 28 | ≥ 50 | ≥ 80 | ≥ 90 | — |
| LCP | 44.9 s | < 15 s | < 5 s | < 2.5 s | 重定向根治、大资源修、SSG、脚本策略 |
| FCP | 9.7 s | < 4 s | < 2 s | < 1.8 s | 重定向、字体瘦身、脚本下沉 |
| TBT | 2.4 s | < 1 s | < 0.4 s | < 0.2 s | 大 chunk 分包、unused JS 清除、高亮库合一 |
| TTI | 45.2 s | < 18 s | < 7 s | < 3.8 s | Provider 下沉、SSG、动态分包 |
| CLS | 0.145 | < 0.1 | < 0.08 | < 0.05 | strategy-studio 有布局抖动,需查字体 swap / 图片尺寸 |
| 主线程工作 | 45.8 s | < 18 s | < 6 s | < 2 s | 同 TBT;strategy-studio 主线程 46s 最严重 |
| Unused JS | 1.6 MB | < 1 MB | < 400 KB | < 200 KB | 路由级分包、barrel 重构、tree-shake |
| 页面下载(最差页 /strategy-studio) | 11.0 MB | < 6 MB | < 3 MB | < 1.5 MB | favicon 修、quick-search 分页、GIF→WebM、TradingView 下沉 |
| TTFB | 205 ms | < 200 ms | < 150 ms | < 100 ms | 启用 SSG + 边缘缓存(现为原站 SSR) |
验证方式:每阶段完成后 用同一条 Lighthouse 命令重跑 5 个页面(docs/perf-baseline/$(date +%Y-%m-%d)/lh-*.json),
JSON 入库并与本基线 diff。任何指标回归 > 10% 阻塞该阶段收尾。
next build --profile + @next/bundle-analyzer 到 CI。