Files
vf_react/docs/PERFORMANCE_ANALYSIS.md
zdl 09db05c448 docs: 将所有文档迁移到 docs/ 目录
- 移动42个文档文件到 docs/ 目录
  - 更新 .gitignore 允许 docs/ 下的 .md 文件
  - 删除根目录下的重复文档文件

  📁 文档分类:
  - StockDetailPanel 重构文档(3个)
  - PostHog 集成文档(6个)
  - 系统架构和API文档(33个)

  🤖 Generated with [Claude Code](https://claude.com/claude-code)

  Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-30 14:51:22 +08:00

11 KiB
Raw Permalink Blame History

页面加载性能深度分析报告

📊 从输入 URL 到页面显示的完整流程分析

当前性能问题诊断2025-10-13


🔍 完整加载时间线分解

阶段 1: DNS 解析 + TCP 连接

输入 URL: http://localhost:3000
  ↓
DNS 查询          [████] 10-50ms   (本地开发: ~5ms)
TCP 三次握手      [████] 20-100ms  (本地开发: ~1ms)
  ↓
总计: 本地 ~6ms, 远程 ~100ms

阶段 2: HTML 文档请求

发送 HTTP 请求    [████] 10ms
服务器处理        [████] 20-50ms
接收 HTML         [████] 10-30ms
  ↓
总计: 40-90ms

阶段 3: 解析 HTML + 下载资源 ⚠️ 关键瓶颈

解析 HTML                    [████] 50ms
下载 JavaScript (12.6MB!)    [████████████████████] 3000-8000ms ❌
下载 CSS                     [████] 200-500ms
下载图片/字体                [████] 500-1000ms
  ↓
总计: 3750-9550ms (3.7-9.5秒) 🔴 严重性能问题

阶段 4: JavaScript 执行

解析 JS                      [████████] 800-1500ms
React 初始化                 [████] 200-300ms
AuthContext 初始化           [████] 100ms
渲染首页组件                 [████] 100-200ms
  ↓
总计: 1200-2100ms (1.2-2.1秒)

阶段 5: 首次内容绘制 (FCP)

计算样式                     [████] 50-100ms
布局计算                     [████] 100-200ms
绘制                        [████] 50-100ms
  ↓
总计: 200-400ms

⏱️ 总耗时汇总

当前性能(未优化)

阶段 耗时 占比 状态
DNS + TCP 6-100ms <1% 正常
HTML 请求 40-90ms <1% 正常
资源下载 3750-9550ms 70-85% 🔴 瓶颈
JS 执行 1200-2100ms 10-20% 🟡 需优化
渲染绘制 200-400ms 3-5% 可接受
总计 5196-11740ms 100% 🔴 5-12秒

理想性能(优化后)

阶段 耗时 改善
DNS + TCP 6-100ms -
HTML 请求 40-90ms -
资源下载 500-1500ms ⬇️ 75-85%
JS 执行 300-600ms ⬇️ 50-70%
渲染绘制 200-400ms -
总计 1046-2690ms ⬇️ 80%

🔴 核心性能问题

问题 1: JavaScript 包过大(最严重)

当前状态

总 JS 大小: 12.6MB
文件数量: 138 个
最大单文件: 528KB (charts-lib)

问题详情

Top 10 最大文件:

1. charts-lib-e701750b.js        528KB  ← ECharts 图表库
2. vendors-b1fb8c12.js           212KB  ← 第三方库
3. main-426809f3.js              156KB  ← 主应用代码
4. vendors-d2765007.js           148KB  ← 第三方库
5. main-faddd7bc.js              148KB  ← 主应用代码
6. calendar-lib-9a17235a.js      148KB  ← 日历库
7. react-vendor.js               144KB  ← React 核心
8. main-88d3322f.js              140KB  ← 主应用代码
9. main-2e2ee8f2.js              140KB  ← 主应用代码
10. vendors-155df396.js          132KB  ← 第三方库

问题根源:

  • 所有页面组件在首屏加载时全部下载
  • 没有路由级别的懒加载
  • 图表库528KB即使不使用也会下载
  • 多个重复的 main.js 文件(代码重复打包)

问题 2: 同步导入导致的雪崩效应

位置: src/routes.js

问题代码:

// ❌ 所有组件同步导入 - 首屏必须下载全部
import Calendar from "views/Applications/Calendar";
import DataTables from "views/Applications/DataTables";
import Kanban from "views/Applications/Kanban.js";
import Community from "views/Community";
import LimitAnalyse from "views/LimitAnalyse";
import ConceptCenter from "views/Concept";
import TradingSimulation from "views/TradingSimulation";
// ... 还有 30+ 个组件

影响:

  • 首页只需要 HomePage 组件
  • 但需要下载所有 30+ 个页面的代码
  • 包括:社区、交易模拟、概念中心、图表、看板等
  • 用户可能永远不会访问这些页面

导入依赖链:

HomePage (用户需要)
  ↓ 同步导入
Calendar (不需要, 148KB)
  ↓ 引入
FullCalendar (不需要, ~200KB)
  ↓ 引入
DataTables (不需要, ~100KB)
  ↓ 引入
...
总计: 下载了 12.6MB,实际只需要 ~500KB

问题 3: 图表库冗余加载

分析:

  • ECharts: ~528KB
  • ApexCharts: 包含在 vendors 中 (~100KB)
  • Recharts: 包含在 vendors 中 (~80KB)
  • D3: 包含在 charts-lib 中 (~150KB)

问题:

  • 首页不需要任何图表
  • 但加载了 4 个图表库(~858KB
  • 占总包大小的 6.8%

问题 4: 重复的 main.js 文件

观察到的问题:

main-426809f3.js     156KB
main-faddd7bc.js     148KB
main-88d3322f.js     140KB
main-2e2ee8f2.js     140KB
main-142e0172.js     128KB
main-fa3d7959.js     112KB
main-6b56ec6d.js      92KB

原因:

  • 代码分割配置可能有问题
  • 同一个模块被打包到多个 chunk
  • 没有正确复用公共代码

📈 性能影响量化

网络带宽影响

网络类型 速度 12.6MB 下载时间 500KB 下载时间
5G 100 Mbps 1.0秒 0.04秒
4G 20 Mbps 5.0秒 0.2秒
3G 2 Mbps 50秒 2秒
慢速 WiFi 5 Mbps 20秒 0.8秒

结论:

  • 🔴 在 4G 网络下,仅下载 JS 就需要 5秒
  • 🔴 在 3G 网络下几乎无法使用50秒
  • 优化后,即使在 3G 下也可接受2秒

解析执行时间影响

设备 解析 12.6MB 解析 500KB 节省
高端手机 1.5秒 0.06秒 1.44秒
中端手机 3.0秒 0.12秒 2.88秒
低端手机 6.0秒 0.24秒 5.76秒

结论:

  • 🔴 在中端手机上,仅解析 JS 就需要 3秒
  • 优化后可节省 2.88秒96% 提升)

🎯 优化方案与预期效果

优化 1: 实施路由懒加载(最重要)

方案:

// ✅ 使用 React.lazy() 懒加载
const Community = React.lazy(() => import('views/Community'));
const LimitAnalyse = React.lazy(() => import('views/LimitAnalyse'));
const ConceptCenter = React.lazy(() => import('views/Concept'));
// ...

预期效果:

  • 首屏 JS: 从 12.6MB → 500-800KB ⬇️ 93%
  • 首屏加载: 从 5-12秒 → 1-2秒 ⬇️ 80%
  • FCP: 从 3-5秒 → 0.5-1秒 ⬇️ 75%

实施难度: 🟢 简单1-2小时


优化 2: 图表库按需加载

方案:

// ✅ 只在需要时导入
const ChartsPage = React.lazy(() => import('views/Pages/Charts'));
// ECharts 会被自动分割到 ChartsPage 的 chunk

预期效果:

  • 首屏去除图表库:⬇️ 858KB
  • 图表页面首次访问增加 0.5-1秒可接受

实施难度: 🟢 简单(包含在路由懒加载中)


优化 3: 代码分割优化

方案:

// craco.config.js 已配置,但需要验证
splitChunks: {
  chunks: 'all',
  maxSize: 244000,
  cacheGroups: {
    react: { priority: 30 },
    charts: { priority: 25 },
    // ...
  }
}

检查项:

  • 是否有重复的 main.js
  • 公共模块是否正确提取
  • vendor 分割是否合理

实施难度: 🟡 中等(需要调试配置)


优化 4: 使用 Suspense 添加加载状态

方案:

<Suspense fallback={<LoadingSpinner />}>
  <Routes>
    <Route path="/community" element={<Community />} />
  </Routes>
</Suspense>

预期效果:

  • 用户体验改善:显示加载动画而非白屏
  • 不改变实际加载时间,但感知性能更好

实施难度: 🟢 简单30分钟


📋 优化优先级建议

立即实施P0🔴

  1. 路由懒加载 - 效果最显著80% 性能提升)
  2. 移除首页不需要的图表库 - 快速见效

短期实施P1🟡

  1. 代码分割优化 - 清理重复打包
  2. 添加 Suspense 加载状态 - 提升用户体验

中期实施P2🟢

  1. 预加载关键资源 - 进一步优化
  2. 图片懒加载 - 减少首屏资源
  3. Service Worker 缓存 - 二次访问加速

🧪 性能优化后的预期结果

首屏加载时间对比

网络 优化前 优化后 改善
5G 2-3秒 0.5-1秒 ⬇️ 67%
4G 6-8秒 1.5-2.5秒 ⬇️ 70%
3G 50-60秒 3-5秒 ⬇️ 92%

各阶段优化后时间

DNS + TCP          [██] 6-100ms       (不变)
HTML 请求          [██] 40-90ms       (不变)
资源下载           [████] 500-1500ms  (从 3750-9550ms 85%)
JS 执行            [███] 300-600ms    (从 1200-2100ms 60%)
渲染绘制           [██] 200-400ms     (不变)
-----------------------------------------------
总计: 1046-2690ms (从 5196-11740ms 80%)

📊 Lighthouse 分数预测

优化前

Performance:  🔴 25-45
- FCP: 3.5s
- LCP: 5.2s
- TBT: 1200ms
- CLS: 0.05

优化后

Performance:  🟢 85-95
- FCP: 0.8s   ⬆️ 77%
- LCP: 1.5s   ⬆️ 71%
- TBT: 200ms  ⬆️ 83%
- CLS: 0.05   (不变)

🛠️ 实施步骤

第一步:路由懒加载(最关键)

  1. 修改 src/routes.js
  2. 将所有 import 改为 React.lazy
  3. 添加 Suspense 边界
  4. 测试所有路由

预计时间: 1-2 小时 预期效果: 首屏速度提升 80%

第二步:验证代码分割

  1. 运行 npm run build:analyze
  2. 检查打包结果
  3. 优化重复模块
  4. 调整 splitChunks 配置

预计时间: 1 小时 预期效果: 包大小减少 10-15%

第三步:性能测试

  1. 使用 Lighthouse 测试
  2. 使用 WebPageTest 测试
  3. 真机测试4G 网络)
  4. 收集用户反馈

预计时间: 30 分钟


💡 监控建议

关键指标

  1. FCP (First Contentful Paint) - 目标 <1秒
  2. LCP (Largest Contentful Paint) - 目标 <2秒
  3. TTI (Time to Interactive) - 目标 <3秒
  4. 总包大小 - 目标 <1MB首屏

监控工具

  • Chrome DevTools Performance
  • Lighthouse CI
  • WebPageTest
  • Real User Monitoring (RUM)

📝 总结

当前主要问题

🔴 JavaScript 包过大12.6MB 🔴 所有路由同步加载 🔴 首屏加载 5-12 秒

核心解决方案

实施路由懒加载 → 减少 93% 首屏 JS 按需加载图表库 → 减少 858KB 优化代码分割 → 消除重复

预期结果

首屏时间: 5-12秒 → 1-2.7秒 (⬇️ 80%) JavaScript: 12.6MB → 500KB (⬇️ 96%) Lighthouse: 25-45 → 85-95 (⬆️ 100%+)


报告生成时间: 2025-10-13 分析工具: Build 分析 + 性能理论计算 下一步: 实施路由懒加载优化