Merge branch 'feature_2025/251209_stock_pref' into feature_bugfix/251217_stock

* feature_2025/251209_stock_pref:
  feat(性能监控): 补全 T0 标记 + PostHog 上报
  fix(MSW): Bytedesk 添加 mock 数据响应
  fix(NotificationContext): Mock 模式下跳过 Socket 连接
This commit is contained in:
zdl
2025-12-17 18:34:12 +08:00
4 changed files with 38 additions and 5 deletions

View File

@@ -661,6 +661,12 @@ export const NotificationProvider = ({ children }) => {
// ========== 连接到 Socket 服务(⚡ 异步初始化,不阻塞首屏) ========== // ========== 连接到 Socket 服务(⚡ 异步初始化,不阻塞首屏) ==========
useEffect(() => { useEffect(() => {
// ⚡ Mock 模式下跳过 Socket 连接(避免连接生产服务器失败的错误)
if (process.env.REACT_APP_ENABLE_MOCK === 'true') {
logger.debug('NotificationContext', 'Mock 模式,跳过 Socket 连接');
return;
}
// ⚡ 防止 React Strict Mode 导致的重复初始化 // ⚡ 防止 React Strict Mode 导致的重复初始化
if (socketInitialized) { if (socketInitialized) {
logger.debug('NotificationContext', 'Socket 已初始化跳过重复执行Strict Mode 保护)'); logger.debug('NotificationContext', 'Socket 已初始化跳过重复执行Strict Mode 保护)');

View File

@@ -5,6 +5,17 @@ import { BrowserRouter as Router } from 'react-router-dom';
// ⚡ 性能监控:在应用启动时尽早标记 // ⚡ 性能监控:在应用启动时尽早标记
import { performanceMonitor } from './utils/performanceMonitor'; import { performanceMonitor } from './utils/performanceMonitor';
// T0: HTML 加载完成时间点
if (document.readyState === 'complete') {
performanceMonitor.mark('html-loaded');
} else {
window.addEventListener('load', () => {
performanceMonitor.mark('html-loaded');
});
}
// T1: React 开始初始化
performanceMonitor.mark('app-start'); performanceMonitor.mark('app-start');
// ⚡ 已删除 brainwave.css项目未安装 Tailwind CSS该文件无效 // ⚡ 已删除 brainwave.css项目未安装 Tailwind CSS该文件无效

View File

@@ -1,16 +1,28 @@
// src/mocks/handlers/bytedesk.js // src/mocks/handlers/bytedesk.js
/** /**
* Bytedesk 客服 Widget MSW Handler * Bytedesk 客服 Widget MSW Handler
* 使用 passthrough 让请求通过到真实服务器,消除 MSW 警告 * Mock 模式下返回模拟数据
*/ */
import { http, passthrough } from 'msw'; import { http, HttpResponse, passthrough } from 'msw';
export const bytedeskHandlers = [ export const bytedeskHandlers = [
// Bytedesk API 请求 - 直接 passthrough // 未读消息数量
// 匹配 /bytedesk/* 路径(通过代理访问后端) http.get('/bytedesk/visitor/api/v1/message/unread/count', () => {
return HttpResponse.json({
code: 200,
message: 'success',
data: { count: 0 },
});
}),
// 其他 Bytedesk API - 返回通用成功响应
http.all('/bytedesk/*', () => { http.all('/bytedesk/*', () => {
return passthrough(); return HttpResponse.json({
code: 200,
message: 'success',
data: null,
});
}), }),
// Bytedesk 外部 CDN/服务请求 // Bytedesk 外部 CDN/服务请求

View File

@@ -2,6 +2,7 @@
// 性能监控工具 - 统计白屏时间和性能指标 // 性能监控工具 - 统计白屏时间和性能指标
import { logger } from './logger'; import { logger } from './logger';
import { reportPerformanceMetrics } from '../lib/posthog';
/** /**
* 性能指标接口 * 性能指标接口
@@ -208,6 +209,9 @@ class PerformanceMonitor {
// 性能分析建议 // 性能分析建议
this.analyzePerformance(); this.analyzePerformance();
// 上报性能指标到 PostHog
reportPerformanceMetrics(this.metrics);
return this.metrics; return this.metrics;
} }