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

Minara Discover 性能优化方案

配套文档:performance-analysis.html · 初版 2026-04-19 · 修订 2026-04-20(根据 self-review 修 C1–C5 / M1–M4,回退原 P0.0 的 localeDetection 关停方案) · 代码基准 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(/about 双跳消减,保留自动语言检测)P0.9(favicon / quick-search / YouTube embed 单点爆炸修复) 两节。


2026-04-20 修订摘要

self-review 发现初版若干问题,本轮修订:


P0.0 /about 双跳消减(半天 · 保留自动语言检测)

背景:Lighthouse 对所有 5 页报告 "Avoid multiple page redirects",省时 1.3–4.3s。 实际观察到的跳转链:

本章只处理可不回退功能的部分/about 的第二跳(/why-minara/about 重定向)。 Locale 检测(localeDetection: true保留不动 —— 首次访问非英语用户的自动跳转是产品必需 feature。

当前 /about 的设计问题(src/app/[locale]/about/page.tsx):

// 实际服务页在 /why-minara/about
// 但 /why-minara/about/metadata.ts 声明 canonical = '/about'
// 所以 /about 用 redirect() 跳 /why-minara/about —— canonical URL ≠ 实际服务 URL

这是个历史 SEO 反模式:canonical 不可直达。

两个二选一方案(需产品/SEO 决定):

改点(方案 A 为例)

验收

风险 / 回滚

风险 预防 回滚
Header 内链漏改某处导致 404 grep 全部 /why-minara/about 引用双重验证 revert 单 PR;/why-minara/about 页面仍存在即可兜底
Google 短期排名波动(URL 结构变化惯例) 301 正确返回,hreflang 正确 无需回滚,2–4 周自然恢复
/about 下还有子路由期望 /why-minara/about/xxx /why-minara/about/ 前缀确认 只改 about 本身,子路由维持原路径

预期收益


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

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

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

P0.2 恢复 CI 类型安全网(1h spike + 0.5–3d 修复)

分两步,不能合并(原方案"10 分钟"低估了历史欠债):

P0.2a · Spike(1 小时)

P0.2b · 修复并开启 (0.5–3 天)

风险:如果错误集中在第三方 dep 的 type 声明(非业务代码),可能需要 // @ts-expect-error 标注 + 单独跟踪。

P0.3 Layout 脚本 strategy 化 + polyfill / CDN 清理(半天)

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

P0.3b TradingView 脚本下沉(1 天 · 独立 PR)

TradingView charting_library.js 目前在 layout.tsx L149 全局 <Script defer>,实测 /app/workflow/app/chat(都不需要图表)也会加载它。下沉到真正使用的路由 比想象复杂。

改点

P0.4 字体瘦身(半天 · 需设计签字)

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

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

Step 0 · 先枚举调用点(关键!不同调用点迁移动作不同):

# 所有 GIF 引用位置 + 引用方式
grep -rn "cooking/[0-9]\.gif\|minara\.gif" src --include="*.tsx" --include="*.ts" --include="*.md"

分类:

Step 1 · GIF → 视频(优先级高)

Step 2 · 巨型 PNG → WebP + 降分辨率

Step 3 · OG 图压缩

Step 4 · 加 CI 守护

验收

风险

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

每个依赖的移除必须 grep 验证 + build 验证,不能按 audit 断言直删。

P0.7 discover 轮询节流与可见性感知(半天 · 需产品签字频率)

改点src/store/discover/index.ts + src/trade/shared/trade.service.ts + src/services/use-chat-list.ts

P0.8 Store useEffect 条件化止血(1 天)

范围说明:完整的 route-group 拆分(营销路由单独 layout 不挂 Auth/Wallet Provider)已挪到 P1.1,避免同一件事 P0/P1 重复列。P0.8 只做能在不改架构的前提下快速止血的 1 件事:让 Store 的自动请求在无登录态时不发生

背景:未登录的 /homepnls/all 被调 6 次、cross-chain/activities 8 次,原因是 Store 里 useEffect 无条件 fire。

改点

验收

风险 / 回滚


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

每个修复点前都有一步 "先确认"——不按假设直接动手。

验收

风险 / 回滚


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 观测与守护


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

每周末必须跑 ./scripts/perf-report/deploy.sh snapshot pX-end 并归档对比,数字说话。

阶段 主任务 预期(按最差页 /app/workflow 估算)
W1 day 1–2 P0.1 + P0.2a 基线工具入 CI + spike CI type errors 数 基线归档;P0.2b 工作量确定
W1 day 3 P0.0 + P0.9(需先与产品确认 /about canonical + favicon 修法) /about 双跳消减 + 3 个单点 bug LCP: 44.9 → 42 s; /about: 21 → 17 s
W1 day 4–5 P0.3 + P0.3b 脚本 strategy + TradingView 下沉 TBT -400~800 ms
W1 末(day 5–7) P0.4 + P0.5 + P0.6 + P0.7 + P0.8 字体 / 大图 / 依赖瘦身 / 轮询 / Store guard score ≥ 40; LCP ≤ 30 s(最差页)
W2–W3 P1.1 + P1.2 营销页 RSC/SSG 化(含 Auth/Wallet Provider 下沉到 (session) 组)+ how-to-guides 模板重构 营销页 LCP < 6 s; score ≥ 65
W4 P1.3 + P1.4 高亮合一 + 重型依赖全 dynamic Unused JS < 600 KB; TBT < 600 ms
W5 P1.5 barrel / namespace import 重构 首屏 JS -40% vs W1 末
W6 P1.6 + P1.7 + P1.8 PPR/Compiler POC + 虚拟化 + store 审计 INP < 200 ms; score ≥ 80
W7 P2 资源链路收紧 + 观测守护 score ≥ 85 最差页;最终验收跑 snapshot final

和原版差异

W1 day 1 不再塞 3 件事。先建基线 + spike CI 错误数,有了数才能定节奏。


风险与回滚

风险 预防 回滚策略
移除 ignoreBuildErrors 后 CI 挂一大片 P0.2a spike 先看错误数,据此决定节奏 不移除 flag,单独 epic 分批修(见 P0.2)
RSC 化漏加 'use client' 引发 "useState 不能在 server" 单 PR 控制单页面;先预览环境验证 revert 单页面;其他页面不受影响
P0.0 /about 迁移引发 SEO 排名短期波动 301 正确返回;hreflang 正确;发布前通知增长 无需回滚,2–4 周自然恢复;Search Console 持续观察
SSG how-to-guides 导致 sitemap 生成链断 迁移时双跑 next-sitemap + 原脚本 保留旧 router/how-to-guides 目录直至 sitemap 验证通过再删
TradingView 下沉到 trade 路由后某些非 trade 页仍在用 代码检索 TradingView/charting-library/trading_view 引用 Hotfix:恢复 layout 注入,但仅限白名单路由
Facebook Pixel lazyOnload 后早期 pageview 事件丢失 发布前与 Growth 对齐;观察 Events Manager 48h 回到 afterInteractive;pixel 事件是法律 / 广告投放依赖,不能静默降级
字体删除 / fallback 引发品牌视觉回退 设计师签字 + 每字体截图对比 + 单字体单 PR revert 单字体 PR
WCAG 对比度 / 最小字号违规 Lighthouse Accessibility audit revert + 调 fallback 字体族
PageSpeed 分数跑分方差 5–10 分 每次 snapshot 跑 3 次取中位 若单次 drop < 10%,视为噪声;持续性回退才 revert
缺 staging gate:改动直上生产 所有 P0/P1 PR 必须先合 release 分支在预发 minara-perf 对应预发域名(若有)验证 若无预发,用本地 next start + Lighthouse CLI 本地验收
PPR 在 15.3 稳定性不够 先在 canary 15.4 POC 移除 experimental flag,页面仍以 SSG 运作
Zustand selector 收窄引入 stale closure 以路由为单位改动 + 人工 code review 回到整 store 读取(损失性能但功能正确)
ahooks 自动 cacheKey 破坏"每次拿新数据"的组件 不统一加 cacheKey;显式配置或走 staleTime: 0 单 PR 恢复无 cacheKey

完成定义(DoD)

每个任务 PR 必须

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