From dfdd2f41346003c5951fe290dc5b48abe549c816 Mon Sep 17 00:00:00 2001 From: zdl <3489966805@qq.com> Date: Thu, 20 Nov 2025 13:19:04 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20posthog=20=E9=85=8D=E7=BD=AE=E8=B0=83?= =?UTF-8?q?=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .env.development | 4 --- src/lib/posthog.js | 89 ++++++++++++++++++---------------------------- 2 files changed, 35 insertions(+), 58 deletions(-) diff --git a/.env.development b/.env.development index 613332a0..d17b1104 100644 --- a/.env.development +++ b/.env.development @@ -18,7 +18,3 @@ REACT_APP_ENABLE_MOCK=false # 开发环境标识 REACT_APP_ENV=development - -# PostHog 配置 -# ⚠️ 开发环境下 PostHog 已被完全禁用(见 src/lib/posthog.js:14-17) -# PostHog 相关配置仅在 .env.production 中配置即可 diff --git a/src/lib/posthog.js b/src/lib/posthog.js index 5650b50f..3176a5cd 100644 --- a/src/lib/posthog.js +++ b/src/lib/posthog.js @@ -10,6 +10,11 @@ let isInitialized = false; * Should be called once when the app starts */ export const initPostHog = () => { + // 开发环境禁用 PostHog(减少日志噪音,仅生产环境启用) + if (process.env.NODE_ENV === 'development') { + return; + } + // 防止重复初始化 if (isInitializing || isInitialized) { console.log('📊 PostHog 已初始化或正在初始化中,跳过重复调用'); @@ -33,79 +38,68 @@ export const initPostHog = () => { posthog.init(apiKey, { api_host: apiHost, - // Pageview tracking - auto-capture for DAU/MAU analytics - capture_pageview: true, // Auto-capture all page views (required for DAU tracking) - capture_pageleave: true, // Auto-capture when user leaves page + // 📄 页面浏览追踪 + capture_pageview: true, // 自动捕获页面浏览事件 + capture_pageleave: true, // 自动捕获用户离开页面事件 - // Session Recording Configuration + // 📹 会话录制配置(Session Recording) session_recording: { enabled: process.env.REACT_APP_ENABLE_SESSION_RECORDING === 'true', - // Privacy: Mask sensitive input fields + // 🔒 隐私保护:遮蔽敏感输入字段(录制时会自动打码) maskInputOptions: { - password: true, - email: true, - phone: true, - 'data-sensitive': true, // Custom attribute for sensitive fields + password: true, // 遮蔽密码输入框 + email: true, // 遮蔽邮箱输入框 + phone: true, // 遮蔽手机号输入框 + 'data-sensitive': true, // 遮蔽带有 data-sensitive 属性的字段(可在 HTML 中自定义) }, - // Record canvas for charts/graphs + // 📊 录制 Canvas 画布内容(用于记录图表、图形等可视化内容) recordCanvas: true, - // Network payload capture (useful for debugging API issues) + // 🌐 网络请求数据捕获(用于调试 API 问题) networkPayloadCapture: { - recordHeaders: true, - recordBody: true, - // Don't record sensitive endpoints + recordHeaders: true, // 捕获请求头 + recordBody: true, // 捕获请求体 + // 🚫 敏感接口黑名单(不记录以下接口的数据) urlBlocklist: [ - '/api/auth/session', - '/api/auth/login', - '/api/auth/register', - '/api/payment', + '/api/auth/session', // 会话接口 + '/api/auth/login', // 登录接口 + '/api/auth/register', // 注册接口 + '/api/payment', // 支付接口 ], }, }, - // Performance optimization - batch_size: 10, // Send events in batches of 10 - batch_interval_ms: 3000, // Or every 3 seconds + // ⚡ 性能优化:批量发送事件 + batch_size: 10, // 每 10 个事件发送一次 + batch_interval_ms: 3000, // 或每 3 秒发送一次(两个条件满足其一即发送) - // Privacy settings - respect_dnt: true, // Respect Do Not Track browser setting - persistence: 'localStorage+cookie', // Use both for reliability + // 🔐 隐私设置 + respect_dnt: true, // 尊重浏览器的"禁止追踪"(Do Not Track)设置 + persistence: 'localStorage+cookie', // 同时使用 localStorage 和 Cookie 存储(提高可靠性) - // Feature flags (for A/B testing) + // 🚩 功能开关(Feature Flags)- 用于 A/B 测试和灰度发布 bootstrap: { - featureFlags: {}, + featureFlags: {}, // 初始功能开关配置(可从服务端动态加载) }, - // Autocapture settings + // 🖱️ 自动捕获设置(Autocapture) autocapture: { - // Automatically capture clicks on buttons, links, etc. + // 自动捕获用户交互事件(点击、提交、修改等) dom_event_allowlist: ['click', 'submit', 'change'], - // Capture additional element properties - capture_copied_text: false, // Don't capture copied text (privacy) - }, - - // Development debugging - loaded: (posthogInstance) => { - if (process.env.NODE_ENV === 'development') { - console.log('✅ PostHog initialized successfully'); - // posthogInstance.debug(); // 已关闭:减少控制台日志噪音 - } + // 捕获额外的元素属性 + capture_copied_text: false, // 不捕获用户复制的文本(隐私保护) }, }); isInitialized = true; - console.log('📊 PostHog Analytics initialized'); } catch (error) { // 忽略 AbortError(通常由热重载或快速导航引起) if (error.name === 'AbortError') { - console.log('⚠️ PostHog 初始化请求被中断(可能是热重载),这是正常的'); return; } - console.error('❌ PostHog initialization failed:', error); } finally { isInitializing = false; } @@ -142,8 +136,6 @@ export const identifyUser = (userId, userProperties = {}) => { last_login: new Date().toISOString(), ...userProperties, }); - - // console.log('👤 User identified:', userId); // 已关闭:减少日志 } catch (error) { console.error('❌ User identification failed:', error); } @@ -158,7 +150,6 @@ export const identifyUser = (userId, userProperties = {}) => { export const setUserProperties = (properties) => { try { posthog.people.set(properties); - // console.log('📝 User properties updated'); // 已关闭:减少日志 } catch (error) { console.error('❌ Failed to update user properties:', error); } @@ -176,10 +167,6 @@ export const trackEvent = (eventName, properties = {}) => { ...properties, timestamp: new Date().toISOString(), }); - - // if (process.env.NODE_ENV === 'development') { - // console.log('📍 Event tracked:', eventName, properties); - // } // 已关闭:减少日志 } catch (error) { console.error('❌ Event tracking failed:', error); } @@ -225,9 +212,6 @@ export const trackPageView = (pagePath, properties = {}) => { ...properties, }); - // if (process.env.NODE_ENV === 'development') { - // console.log('📄 Page view tracked:', pagePath); - // } // 已关闭:减少日志 } catch (error) { console.error('❌ Page view tracking failed:', error); } @@ -240,7 +224,6 @@ export const trackPageView = (pagePath, properties = {}) => { export const resetUser = () => { try { posthog.reset(); - // console.log('🔄 User session reset'); // 已关闭:减少日志 } catch (error) { console.error('❌ Session reset failed:', error); } @@ -252,7 +235,6 @@ export const resetUser = () => { export const optOut = () => { try { posthog.opt_out_capturing(); - // console.log('🚫 User opted out of tracking'); // 已关闭:减少日志 } catch (error) { console.error('❌ Opt-out failed:', error); } @@ -264,7 +246,6 @@ export const optOut = () => { export const optIn = () => { try { posthog.opt_in_capturing(); - // console.log('✅ User opted in to tracking'); // 已关闭:减少日志 } catch (error) { console.error('❌ Opt-in failed:', error); }