📊 Minara 性能专题首页 📄 原始分析报告 · 优化方案(本页)

Minara Discover 性能优化方案

配套文档:performance-analysis.html · 生成日期 2026-04-19 · 代码基准 release@3f254fd71


指导原则

  1. 先立基线,再动手。所有"效果"必须有 before/after 数字。没有基线的性能工作是盲修。
  2. 按影响 / 工作量矩阵排序。优先做"高影响 + 小工作量"(P0 快赢),然后是"高影响 + 大工作量"(P1 结构),最后是"中影响 + 大工作量"(P2 收尾)。
  3. 小步快跑,独立可回滚。每个任务一条分支、一条 PR、一个验收指标;禁止多项混合提交。
  4. 用户侧视角。关注 LCP / INP / CLS 而非"构建大小"这种开发侧幻觉指标;最终交付看 PageSpeed 真实数据。
  5. 保护与进度同步。移除 ignoreBuildErrors / ignoreDuringBuilds 放在 P0,避免一边优化一边引入回归。

指标与验收门槛

基线:Lighthouse 2026-04-19 实测 · 8 个页面 · 最差页取值

指标 基线实测 最差页 P0 末目标 P1 末目标 最终目标 如何测
Performance Score 25–46 /app/workflow ≥ 50 ≥ 80 ≥ 90 Lighthouse CLI
LCP (移动 Slow 4G) 44.9 s /app/workflow < 15 s < 5 s < 2.5 s Lighthouse × 3 取中位
FCP 9.7 s /app/workflow < 4 s < 2 s < 1.8 s Lighthouse
TBT 2.4 s /app/workflow < 1 s < 0.4 s < 0.2 s Lighthouse
TTI 45.2 s /app/workflow < 18 s < 7 s < 3.8 s Lighthouse
CLS 0.145 /app/strategy-studio < 0.1 < 0.08 < 0.05 strategy-studio 专题修
主线程工作 45.8 s /app/strategy-studio < 18 s < 6 s < 2 s Lighthouse main-thread-tasks
Unused JS 1.6 MB /home < 1 MB < 400 KB < 200 KB Lighthouse unused-javascript
单页面下载 11.0 MB /app/strategy-studio < 6 MB < 3 MB < 1.5 MB Lighthouse network-requests
重定向链 (P0.0) 7.8 s /app/workflow 0 s 0 s 0 s Lighthouse redirects audit
INP(真实用户) 未测,估 > 500 ms < 300 ms < 200 ms < 100 ms Cloudflare Web Analytics P75
public/ 总体积 138 MB < 95 MB < 60 MB < 40 MB du -sh public/

全局硬性门槛(P1 起):首页、/about/use-case/how-to-guides/[slug] 必须全部为 SSG;对应路由不能出现 'use client'


测试页面列表(每阶段末必测,与基线对齐)

URL 类型 基线 Score 基线 LCP 关注指标
/home 产品首页(匿名) 28 20.8 s LCP, TBT
/about 关于页 29 21.0 s LCP(大 SVG + YouTube)
/use-cases use-cases 列表页 33 17.1 s LCP, 路由包体
/how-to-guides/btc-eth-trading-strategy-complete-battle-plan 重型模板页 46 4.0 s 路由包体(30 份复制)
/app/chat App shell 28 20.6 s 下载总量 · 10.7 MB
/app/trade/perps/BTC 交易页(perps) 26 28.3 s TradingView 加载、CLS
/app/strategy-studio 策略工作室 29 29.4 s 主线程 46s · 下载 11 MB
/app/workflow workflow 画布 25 44.9 s 最差页,重定向 7.8 s

🔥 Lighthouse 实测复盘(2026-04-19)

详见 performance-analysis.html §🚨 Lighthouse 实测。关键回校:

Chrome MCP 实测补充(同一报告 §⚡):

P0 据此增补了 P0.0(locale 重定向根治)P0.9(favicon / quick-search / YouTube embed 单点爆炸修复) 两节。


P0.0 Locale 重定向链根治(<1 h · 最廉价大收益)

背景:Lighthouse 对所有 5 个页面都报告 "Avoid multiple page redirects",省时 1.3–4.3s。最终 URL 全部带 /zh/ 前缀:

原因next-intl 的 middleware 在无 locale 前缀时会做默认 locale 检测与跳转,当前默认指向 zh。Lighthouse 的 Accept-Language 头让它决定 zh;真实非中文用户同样被跳。

改点

验收:Lighthouse 重跑:Redirect 诊断完全消失;LCP 至少下降 1.3s(对应 redirect savings)。


阶段 P0 · 快赢止血(预计 1 周)

目标:立刻回收最大流量、解除最明显的主线程阻塞、建立指标闭环;不改变任何架构。 全阶段应可在 5–7 个工作日内由 1 名工程师完成。

P0.1 建立性能基线(第一件事)

P0.2 恢复 CI 类型安全网(10 分钟)

P0.3 Layout 第三方脚本策略化(半天)

改点src/app/[locale]/layout.tsx

P0.4 字体瘦身(半天)

改点src/app/[locale]/layout.tsx L152–166 + src/app/[locale]/globals.css

P0.5 巨型静态资源换格式(2 天)

P0.6 删除未用的依赖(半天)

P0.7 discover 轮询节流与可见性感知(半天)

改点src/store/discover/index.ts

P0.8 Provider 下沉止血(紧急,1 天)

背景:Chrome 实测发现未登录的 /homepnls/all 被调 6 次、cross-chain/activities 8 次。 原因是 src/app/[locale]/layout.tsx 里的 CustodialWalletStoreProviderUserAuthStoreProvider 对所有路由都生效, 且这些 Store 的 useService/useEffect 在无登录态时也会"先查一下"。

改点

验收

风险:如果某些 UI 组件依赖 store 的 "总是有数据" 假设,可能显示空态。逐一验收 UI 状态。


P0.9 单点爆炸修复(半天 · 一组"检查报告直接发现的 bug")

Lighthouse 抓到的三个可独立修复的点,不涉及架构变更:

验收


P0.10 CoinGecko widget 下沉 + Unused CSS 清理(半天)

Lighthouse 显示 CoinGecko widget(213 KB、28–30 ms 主线程)在所有 5 个页面加载;同时 Unused CSS 约 30 KB。

验收/home/about/use-cases/how-to-guides/[slug] 均不再加载 gecko-coin-price-chart-widget.js。


阶段 P1 · 结构性重构(预计 3 周)

目标:真正把架构从"全部 client SSR on-demand"拉回"静态优先 + 按需 client";这个阶段改动大但收益最持久。

P1.1 营销页 RSC 化 + SSG(1 周)

范围//home/about/use-case/faq/pricing(评估)

P1.2 how-to-guides 30 份模板重构(3 天)

P1.3 语法高亮合一(1 天)

P1.4 重型依赖按需化(1 周,多 PR)

批量把以下依赖改成 next/dynamic({ ssr: false, loading })

依赖 建议承载点
Monaco editor ✅ 已做
@xyflow/react(workflow 画布) /app/workflow 动态导入
echarts + echarts-for-react 仅 strategy studio 图表组件
canvas-datagrid spreadsheet section 内部 dynamic
cropperjs + react-cropper 头像上传 modal 打开时 dynamic
dom-to-image / @zumer/snapdom share 截图功能触发时 dynamic
canvas-confetti 胜利动画触发时 dynamic
@lexical/*(编辑器) 聊天输入框 focus 后再加载(可选)
TradingView charting library P0 已下沉到交易/策略路由;这里确认最终只在 trade/strategy bundle

P1.5 Namespace import + barrel 重构(1 周,多 PR)

P1.6 启用 PPR + 评估 React Compiler(3 天)

P1.7 discover news feed 虚拟化(半天)

P1.8 Zustand / constate 细粒度化(3 天)


阶段 P2 · 收尾与运维(预计 1 周,可与 P1 并行)

P2.1 资源链路收紧

P2.2 细节运行时优化

P2.3 观测与守护


里程碑与排期(单人估算)

阶段 主任务 预期指标提升
W1 day 1 P0.0 + P0.9 + P0.2 locale 重定向、favicon/quick-search/YouTube 修 bug、CI 类型保护 LCP < 17 s(-4 s)· score +5
W1 P0.1 + P0.3–P0.8 基线、脚本策略、字体、大图、依赖瘦身、轮询、Provider 下沉 LCP < 10 s · score ≥ 50
W2 P1.1 + P1.2 营销页 RSC/SSG + how-to-guides 重构 LCP < 6 s · TTI < 10 s · score ≥ 70
W3 P1.3 + P1.4 高亮合一 + 重型依赖 dynamic Unused JS < 600 KB · TBT < 600 ms
W4 P1.5 barrel / import * 重构 首屏 JS -40% 对比 W1
W5 P1.6 + P1.7 + P1.8 PPR/Compiler + 虚拟化 + store 审计 INP < 200 ms · score ≥ 85
W6 P2 资源收紧 + 守护 score ≥ 90 · CI 加 size-limit 告警

两人并行可压到 3 周。第一天的 P0.0 + P0.9 合计工作量 < 1 天,收益约 LCP -4 s,强烈建议作为立项 kickoff 的 quick win


风险与回滚

风险 预防 回滚策略
移除 ignoreBuildErrors 后 CI 挂一大片 P0 第一件事,预留半天批量修 若无法一次修完,先 revert 保功能,单独 PR 分批修
RSC 化漏加 'use client' 引发 "useState 不能在 server" 单 PR 控制单页面;先预览环境验证 revert 单页面;其他页面不受影响
SSG how-to-guides 导致 sitemap 生成链断 迁移时双跑 next-sitemap + 原脚本 保留旧 router/how-to-guides 目录直至 sitemap 验证通过再删
TradingView 下沉到 trade 路由后某些非 trade 页仍在用 代码检索 TradingView/charting-library/trading_view 引用 Hotfix:恢复 layout 注入,但仅限白名单路由
PPR 在 15.3 稳定性不够 先在 canary 15.4 POC 移除 experimental flag,页面仍以 SSG 运作
Zustand selector 收窄引入 stale closure 以路由为单位改动 + 人工 code review 回到整 store 读取(损失性能但功能正确)

完成定义(DoD)

每个任务 PR 必须

阶段完成


附录 · 关键文件速查

问题 文件
脚本/字体堆叠 src/app/[locale]/layout.tsx
构建配置 next.config.mjs
模板复制 src/router/how-to-guides/<slug>/index.tsx
轮询源头 src/store/discover/index.ts, src/trade/shared/trade.service.ts, src/services/use-chat-list.ts
状态管理 src/store/trade-store/index.ts, src/store/chat/index.tsx
流式渲染(保持) src/features/chat-base/core/xhr-stream-utils.ts, src/features/chat-base/message-view/section/create-streaming-markdown.tsx
巨型资源 public/images/guide/minara.gif, public/images/share/*, public/images/copilot/hero-bg.png, public/images/og/*
Barrel 文件 src/components/primitive/index.ts, src/features/chat-base/index.ts, src/utils/date/index.ts, src/utils/number/index.ts