248 lines
8.5 KiB
JavaScript
248 lines
8.5 KiB
JavaScript
// src/debug/index.js
|
||
/**
|
||
* 调试工具统一入口
|
||
*
|
||
* 使用方法:
|
||
* 1. 开启调试: 在 .env.production 中设置 REACT_APP_ENABLE_DEBUG=true
|
||
* 2. 使用控制台命令: window.__DEBUG__.api.getLogs()
|
||
* 3. 后期移除: 删除整个 src/debug/ 目录 + 从 src/index.js 移除导入
|
||
*
|
||
* 全局 API:
|
||
* - window.__DEBUG__ - 调试 API 主对象
|
||
* - window.__DEBUG__.api - API 调试工具
|
||
* - window.__DEBUG__.socket - Socket 调试工具
|
||
* - window.__DEBUG__.help() - 显示帮助信息
|
||
* - window.__DEBUG__.exportAll() - 导出所有日志
|
||
*/
|
||
|
||
import { apiDebugger } from './apiDebugger';
|
||
import { socketDebugger } from './socketDebugger';
|
||
|
||
class DebugToolkit {
|
||
constructor() {
|
||
this.api = apiDebugger;
|
||
this.socket = socketDebugger;
|
||
}
|
||
|
||
/**
|
||
* 初始化所有调试工具
|
||
*/
|
||
init() {
|
||
console.log(
|
||
'%c╔════════════════════════════════════════════════════════════════╗',
|
||
'color: #FF9800; font-weight: bold;'
|
||
);
|
||
console.log(
|
||
'%c║ 🔧 调试模式已启用 (Debug Mode Enabled) ║',
|
||
'color: #FF9800; font-weight: bold;'
|
||
);
|
||
console.log(
|
||
'%c╚════════════════════════════════════════════════════════════════╝',
|
||
'color: #FF9800; font-weight: bold;'
|
||
);
|
||
console.log('');
|
||
|
||
// 初始化各个调试工具
|
||
this.api.init();
|
||
this.socket.init();
|
||
|
||
// 暴露到全局
|
||
window.__DEBUG__ = this;
|
||
|
||
// 打印帮助信息
|
||
this._printWelcome();
|
||
}
|
||
|
||
/**
|
||
* 打印欢迎信息
|
||
*/
|
||
_printWelcome() {
|
||
console.log('%c📚 调试工具使用指南:', 'color: #2196F3; font-weight: bold; font-size: 14px;');
|
||
console.log('');
|
||
console.log('%c1️⃣ API 调试:', 'color: #2196F3; font-weight: bold;');
|
||
console.log(' __DEBUG__.api.getLogs() - 获取所有 API 日志');
|
||
console.log(' __DEBUG__.api.getRecentErrors() - 获取最近的错误');
|
||
console.log(' __DEBUG__.api.exportLogs() - 导出 API 日志');
|
||
console.log(' __DEBUG__.api.testRequest(method, endpoint, data) - 测试 API 请求');
|
||
console.log('');
|
||
console.log('%c2️⃣ Socket 调试:', 'color: #00BCD4; font-weight: bold;');
|
||
console.log(' __DEBUG__.socket.getLogs() - 获取所有 Socket 日志');
|
||
console.log(' __DEBUG__.socket.getStatus() - 获取连接状态');
|
||
console.log(' __DEBUG__.socket.reconnect() - 手动重连');
|
||
console.log(' __DEBUG__.socket.exportLogs() - 导出 Socket 日志');
|
||
console.log('');
|
||
console.log('%c3️⃣ 通用命令:', 'color: #4CAF50; font-weight: bold;');
|
||
console.log(' __DEBUG__.help() - 显示帮助信息');
|
||
console.log(' __DEBUG__.exportAll() - 导出所有日志');
|
||
console.log(' __DEBUG__.printStats() - 打印所有统计信息');
|
||
console.log(' __DEBUG__.clearAll() - 清空所有日志');
|
||
console.log('');
|
||
console.log(
|
||
'%c⚠️ 警告: 调试模式会记录所有 API 请求和响应,请勿在生产环境长期开启!',
|
||
'color: #F44336; font-weight: bold;'
|
||
);
|
||
console.log('');
|
||
}
|
||
|
||
/**
|
||
* 显示帮助信息
|
||
*/
|
||
help() {
|
||
this._printWelcome();
|
||
}
|
||
|
||
/**
|
||
* 导出所有日志
|
||
*/
|
||
exportAll() {
|
||
console.log('[Debug Toolkit] Exporting all logs...');
|
||
|
||
const allLogs = {
|
||
timestamp: new Date().toISOString(),
|
||
api: this.api.getLogs(),
|
||
socket: this.socket.getLogs(),
|
||
};
|
||
|
||
const blob = new Blob([JSON.stringify(allLogs, null, 2)], {
|
||
type: 'application/json',
|
||
});
|
||
const url = URL.createObjectURL(blob);
|
||
const a = document.createElement('a');
|
||
a.href = url;
|
||
a.download = `debug-all-logs-${Date.now()}.json`;
|
||
a.click();
|
||
URL.revokeObjectURL(url);
|
||
|
||
console.log('[Debug Toolkit] ✅ All logs exported');
|
||
}
|
||
|
||
/**
|
||
* 打印所有统计信息
|
||
*/
|
||
printStats() {
|
||
console.log('\n%c=== 📊 调试统计信息 ===', 'color: #FF9800; font-weight: bold; font-size: 16px;');
|
||
console.log('\n%c[API 统计]', 'color: #2196F3; font-weight: bold;');
|
||
const apiStats = this.api.printStats();
|
||
|
||
console.log('\n%c[Socket 统计]', 'color: #00BCD4; font-weight: bold;');
|
||
const socketStats = this.socket.printStats();
|
||
|
||
return {
|
||
api: apiStats,
|
||
socket: socketStats,
|
||
};
|
||
}
|
||
|
||
/**
|
||
* 清空所有日志
|
||
*/
|
||
clearAll() {
|
||
console.log('[Debug Toolkit] Clearing all logs...');
|
||
this.api.clearLogs();
|
||
this.socket.clearLogs();
|
||
console.log('[Debug Toolkit] ✅ All logs cleared');
|
||
}
|
||
|
||
/**
|
||
* 快速诊断(检查所有系统状态)
|
||
*/
|
||
diagnose() {
|
||
console.log('\n%c=== 🔍 系统诊断 ===', 'color: #FF9800; font-weight: bold; font-size: 16px;');
|
||
|
||
// 1. Socket 状态
|
||
console.log('\n%c[1/2] Socket 状态', 'color: #00BCD4; font-weight: bold;');
|
||
const socketStatus = this.socket.getStatus();
|
||
|
||
// 2. API 错误
|
||
console.log('\n%c[2/2] 最近的 API 错误', 'color: #F44336; font-weight: bold;');
|
||
const recentErrors = this.api.getRecentErrors(5);
|
||
if (recentErrors.length > 0) {
|
||
console.table(
|
||
recentErrors.map((err) => ({
|
||
时间: err.timestamp,
|
||
方法: err.method,
|
||
URL: err.url,
|
||
状态码: err.status,
|
||
错误信息: err.message,
|
||
}))
|
||
);
|
||
} else {
|
||
console.log('✅ 没有 API 错误');
|
||
}
|
||
|
||
// 3. 汇总报告
|
||
const report = {
|
||
timestamp: new Date().toISOString(),
|
||
socket: socketStatus,
|
||
apiErrors: recentErrors.length,
|
||
};
|
||
|
||
console.log('\n%c=== 诊断报告 ===', 'color: #4CAF50; font-weight: bold;');
|
||
console.table(report);
|
||
|
||
return report;
|
||
}
|
||
|
||
/**
|
||
* 性能监控
|
||
*/
|
||
performance() {
|
||
console.log('\n%c=== ⚡ 性能监控 ===', 'color: #FF9800; font-weight: bold; font-size: 16px;');
|
||
|
||
// 计算 API 平均响应时间
|
||
const apiLogs = this.api.getLogs();
|
||
const responseTimes = [];
|
||
|
||
for (let i = 0; i < apiLogs.length - 1; i++) {
|
||
const log = apiLogs[i];
|
||
const prevLog = apiLogs[i + 1];
|
||
|
||
if (
|
||
log.type === 'response' &&
|
||
prevLog.type === 'request' &&
|
||
log.url === prevLog.url
|
||
) {
|
||
const responseTime =
|
||
new Date(log.timestamp).getTime() - new Date(prevLog.timestamp).getTime();
|
||
responseTimes.push({
|
||
url: log.url,
|
||
method: log.method,
|
||
time: responseTime,
|
||
});
|
||
}
|
||
}
|
||
|
||
if (responseTimes.length > 0) {
|
||
const avgTime =
|
||
responseTimes.reduce((sum, item) => sum + item.time, 0) / responseTimes.length;
|
||
const maxTime = Math.max(...responseTimes.map((item) => item.time));
|
||
const minTime = Math.min(...responseTimes.map((item) => item.time));
|
||
|
||
console.log('API 响应时间统计:');
|
||
console.table({
|
||
平均响应时间: `${avgTime.toFixed(2)}ms`,
|
||
最快响应: `${minTime}ms`,
|
||
最慢响应: `${maxTime}ms`,
|
||
请求总数: responseTimes.length,
|
||
});
|
||
|
||
// 显示最慢的 5 个请求
|
||
console.log('\n最慢的 5 个请求:');
|
||
const slowest = responseTimes.sort((a, b) => b.time - a.time).slice(0, 5);
|
||
console.table(
|
||
slowest.map((item) => ({
|
||
方法: item.method,
|
||
URL: item.url,
|
||
响应时间: `${item.time}ms`,
|
||
}))
|
||
);
|
||
} else {
|
||
console.log('暂无性能数据');
|
||
}
|
||
}
|
||
}
|
||
|
||
// 导出单例
|
||
export const debugToolkit = new DebugToolkit();
|
||
export default debugToolkit;
|