UNPKG

perfor-monitor

Version:

性能监控工具库

342 lines (334 loc) 8.9 kB
interface IMonitorWarning { FCP?: number; LCP: number; TTI?: number; FID?: number; INP?: number; CLS?: number; } interface PerformanceMonitorMetrics extends Required<IMonitorWarning> { DNS?: number; TCP?: number; SSL?: number; TTFB?: number; FMP?: number; DCL?: number; LCPElement?: string; networkType?: string; deviceType?: string; memory?: number; cpuCores?: number; } interface PerformanceMonitorOps { warnings: IMonitorWarning; reportUrl: string; appId: string; debug?: boolean; isDev?: boolean; maxTime?: number; deviceType?: 'mobile' | 'desktop' | 'auto'; networkType?: 'unknown' | '2g' | '3g' | '4g' | '5g' | 'slow-2g' | 'wifi' | 'ethernet'; pageInfo?: { pageUrl: string; pageTitle: string; routeId?: string; }; } interface IReportData { appId: string; timestamp: string; metrics: PerformanceMonitorMetrics; userAgent: string; pageInfo?: { pageUrl: string; pageTitle: string; routeId?: string; }; warnings: string[]; environment: { networkType?: string; deviceType?: string; memory?: number; cpuCores?: number; }; } interface PerformancePanelJank { /** 小卡顿 */ small: number; /** 中卡顿 */ medium: number; /** 大卡顿 */ large: number; /** 卡顿率 */ stutterRate: number; /** 严重卡顿率 */ severeJankRate: number; } /** * 事件计时指标 */ interface EventTimingMetrics { /** 平均事件处理延迟时间(ms) */ avgDelay: number; /** 最大事件处理延迟时间(ms) */ maxDelay: number; } interface PerformancePanelMetrics { /** FPS */ fps: number; /** 卡顿 */ jank: PerformancePanelJank; /** 帧耗时 */ frameTimes: number[]; /** 事件计时 (可选,仅在支持 Event Timing API 时提供) */ eventTiming?: EventTimingMetrics; } declare class PerformanceMonitor { private readonly config; private metrics; private isStarted; isReported: boolean; private isStopped; private observers; private reportTimer; private lcpEntries; private inpEntries; private clsValue; private ttiResolve?; constructor(options?: PerformanceMonitorOps); private detectDeviceType; private detectNetworkType; private getDeviceMemory; private getCPUCores; private initPerfTiming; private logDebug; start(): void; private resetForNextRoute; report(): void; private checkWarnings; private renderReport; private sendReport; dispose(): void; } /** * RadarReport - Enhanced frontend monitoring data reporting class * Handles reliable data transmission with queue management, batching, and retry mechanisms */ declare class RadarReport<T extends unknown = {}> { private queue; private sending; private retryQueue; private retryAttempts; private maxRetries; private maxQueueSize; private maxRetryQueueSize; private batchSize; private processingTimeout; private readonly STORAGE_KEY; reportUrl: string; constructor(config?: { reportUrl?: string; maxRetries?: number; maxQueueSize?: number; maxRetryQueueSize?: number; batchSize?: number; }); /** * Public method to report monitoring data * @param data The data to report * @param priority Optional priority level (higher = more important) */ report(data: T, priority?: number): void; /** * Schedule queue processing with debounce to avoid frequent processing */ private scheduleQueueProcessing; /** * Process the queue in chunks to avoid blocking the main thread */ private processQueue; /** * Process a chunk of the queue to avoid long-running operations */ private processQueueChunk; /** * Send a batch of data with error handling */ private sendBatch; /** * Handle send errors with progressive retry and fallback strategies */ private handleSendError; /** * Store data offline when network requests fail permanently */ private storeOfflineData; /** * Get offline data from localStorage */ private getOfflineData; /** * Recover offline data on initialization */ private recoverOfflineData; /** * Persist any pending data when page unloads */ private persistOfflineData; /** * Find the index of the lowest priority item in the queue */ private findLowestPriorityItemIndex; /** * Generate a truly unique ID for batch tracking */ private generateUniqueId; /** * Get current queue statistics for monitoring */ getQueueStats(): { mainQueue: number; retryQueue: number; activeSending: boolean; offlineData: number; configuration: { batchSize: number; maxQueueSize: number; maxRetryQueueSize: number; maxRetries: number; }; }; /** * Get count of offline data items */ private getOfflineDataCount; /** * Manually flush all queues (useful for testing or before page unload) */ flush(): Promise<void>; /** * Clear all queues and offline data (useful for testing or user opt-out) */ clear(): void; } declare abstract class PerformanceBase<T extends unknown = {}> { protected readonly worker: Worker | null; protected metrics: Record<string, number | string>; private radarPlugin; onUpdate?: (data: T) => void; constructor(); use(plugin: RadarReport<T>): this; protected abstract startMonitoring(): void; protected abstract stopMonitoring(): void; private handleWorkerMessage; protected postToWorker(message: object): void; destroy(): void; } interface PanelJankOps { title?: string; left?: number; width?: number; height?: number; isExpanded?: boolean; } declare class PanelJank { private panel; /** 是否展开 */ private isExpanded; private metrics; private panelInfo?; constructor(ops?: PanelJankOps); initPanel(): void; bindEvents(): void; updateMetrics(data: PerformancePanelMetrics): void; render(): void; destroy(): void; } declare function initPanelJank(): PanelJank; interface JankStutterOptions { /** * 帧率 * 默认16.67,单位:ms */ frame?: number; /** * 设备刷新率 * 默认60,单位:Hz */ deviceRefreshRate?: number; /** * 事件处理延迟阈值(小卡顿) * 默认50ms */ minJankThreshold?: number; /** * 事件处理延迟阈值(大卡顿) * 默认100ms */ largeJankThreshold?: number; /** * 数据更新间隔 * 默认1000ms */ updateInterval?: number; } declare class PerformanceJankStutter extends PerformanceBase { private frameTimes; private jankCounts; /** 帧率 */ frame: number; /** 设备刷新率 */ deviceRefreshRate: number; /** 事件延迟阈值(小卡顿)*/ minJankThreshold: number; /** 事件延迟阈值(大卡顿)*/ largeJankThreshold: number; /** 数据更新间隔 */ updateInterval: number; /** 性能观察器 */ private performanceObserver; /** 定时更新器 */ private updateTimer; /** 收集的事件数据 */ private eventEntries; /** RAF ID */ private rafId; constructor(ops?: JankStutterOptions); startMonitoring(): void; /** * 启动基于 PerformanceObserver 的事件计时监测 */ private startEventTimingMonitor; /** * 启动基于 RAF 的帧率监测 */ private startFrameRateMonitor; /** * 传统的卡顿监测方式(兼容性保障) */ private startLegacyMonitor; /** * 更新并发送性能指标 */ private updateMetrics; stopMonitoring(): void; } declare function useJankStutter(opsJank?: JankStutterOptions, opsPanel?: PanelJankOps): { panelJank: PanelJank; }; declare class PanelJankPerformance { private panel; private content; private isExpanded; private isDragging; private dragOffset; private metrics; constructor(); private createPanel; private enableDrag; updateMetrics(data: PerformancePanelJank): void; private render; private drawFrameTimeChart; } export { PanelJank, PanelJankPerformance, PerformanceBase, PerformanceJankStutter, PerformanceMonitor, RadarReport, initPanelJank, useJankStutter }; export type { EventTimingMetrics, IMonitorWarning, IReportData, JankStutterOptions, PanelJankOps, PerformanceMonitorMetrics, PerformanceMonitorOps, PerformancePanelJank, PerformancePanelMetrics };