// src/components/PerformancePanel.tsx // 性能监控可视化面板 - 仅开发环境显示 import React, { useState, useEffect } from 'react'; import { Box, VStack, HStack, Text, Badge, Button, IconButton, Stat, StatLabel, StatNumber, StatHelpText, Accordion, AccordionItem, AccordionButton, AccordionPanel, AccordionIcon, useDisclosure, Drawer, DrawerBody, DrawerHeader, DrawerOverlay, DrawerContent, DrawerCloseButton, } from '@chakra-ui/react'; import { MdSpeed, MdClose, MdRefresh, MdFileDownload } from 'react-icons/md'; import { performanceMonitor } from '@/utils/performanceMonitor'; /** * 性能评分颜色映射 */ const getScoreColor = (score: string): string => { switch (score) { case 'excellent': return 'green'; case 'good': return 'blue'; case 'needs improvement': return 'yellow'; case 'poor': return 'red'; default: return 'gray'; } }; /** * 格式化毫秒数 */ const formatMs = (ms: number | undefined): string => { if (ms === undefined) return 'N/A'; return `${ms.toFixed(0)}ms`; }; /** * 性能面板组件 */ export const PerformancePanel: React.FC = () => { const { isOpen, onOpen, onClose } = useDisclosure(); const [report, setReport] = useState(null); // 刷新性能数据 const refreshData = () => { const newReport = performanceMonitor.getReport(); setReport(newReport); }; // 导出 JSON const exportJSON = () => { const json = performanceMonitor.exportJSON(); const blob = new Blob([json], { type: 'application/json' }); const url = URL.createObjectURL(blob); const a = document.createElement('a'); a.href = url; a.download = `performance-report-${Date.now()}.json`; document.body.appendChild(a); a.click(); document.body.removeChild(a); URL.revokeObjectURL(url); }; // 初始加载 useEffect(() => { refreshData(); }, []); // 仅在开发环境显示 if (process.env.NODE_ENV !== 'development') { return null; } return ( <> {/* 浮动按钮 */} } position="fixed" bottom="100px" right="20px" colorScheme="blue" size="lg" borderRadius="full" boxShadow="lg" zIndex={9999} onClick={onOpen} /> {/* 抽屉面板 */} 性能监控面板 {report ? ( {/* 操作按钮 */} {/* 总览 */} 性能评分 {report.summary.performanceScore.toUpperCase()} 性能标记: {report.summary.totalMarks} 性能测量: {report.summary.totalMeasures} {/* 网络指标 */} 网络指标 {/* 渲染指标 */} 渲染指标 {/* React 指标 */} React 指标 {/* 总白屏时间 */} 总白屏时间 {formatMs(report.metrics.totalWhiteScreen)} {report.metrics.totalWhiteScreen && report.metrics.totalWhiteScreen < 1500 ? '✅ 优秀' : report.metrics.totalWhiteScreen && report.metrics.totalWhiteScreen < 2000 ? '⚠️ 良好' : '❌ 需要优化'} {/* 优化建议 */}

优化建议 ({report.recommendations.length})

{report.recommendations.map((rec: string, index: number) => ( {rec} ))}
{/* 性能标记 */}

性能标记 ({report.marks.length})

{report.marks.map((mark: any, index: number) => ( {mark.name} {mark.time.toFixed(2)}ms ))}
{/* 性能测量 */}

性能测量 ({report.measures.length})

{report.measures.map((measure: any, index: number) => ( {measure.name} {measure.duration.toFixed(2)}ms {measure.startMark} → {measure.endMark} ))}
) : ( 加载中... )}
); }; /** * 指标统计组件 */ interface MetricStatProps { label: string; value: string; threshold: number; actualValue?: number; } const MetricStat: React.FC = ({ label, value, threshold, actualValue }) => { const isGood = actualValue !== undefined && actualValue < threshold; return ( {label} {value} {actualValue !== undefined && ( {isGood ? '✅' : '⚠️'} )} ); }; export default PerformancePanel;