# PostHog Redux 集成完成总结 ## ✅ 已完成的工作 PostHog 已成功从 **React Context** 迁移到 **Redux** 进行全局状态管理! ### 1. 创建的核心文件 #### 📦 Redux Slice (`src/store/slices/posthogSlice.js`) 完整的 PostHog 状态管理: - **State 管理**: 初始化状态、用户信息、事件队列、Feature Flags - **Async Thunks**: - `initializePostHog()` - 初始化 SDK - `identifyUser()` - 识别用户 - `resetUser()` - 重置会话 - `trackEvent()` - 追踪事件 - `flushCachedEvents()` - 刷新离线事件 - **Selectors**: 提供便捷的状态选择器 #### ⚡ Redux Middleware (`src/store/middleware/posthogMiddleware.js`) 自动追踪中间件: - **自动拦截 Actions**: 当特定 Redux actions 被 dispatch 时自动追踪 - **路由追踪**: 自动识别页面类型并追踪浏览 - **离线事件缓存**: 网络恢复时自动刷新缓存事件 - **性能追踪**: 追踪耗时较长的操作 **自动追踪的 Actions**: ```javascript 'auth/login/fulfilled' → USER_LOGGED_IN 'auth/logout' → USER_LOGGED_OUT 'communityData/fetchHotEvents/fulfilled' → NEWS_LIST_VIEWED 'payment/success' → PAYMENT_SUCCESSFUL // ... 更多 ``` #### 🪝 React Hooks (`src/hooks/usePostHogRedux.js`) 提供便捷的 API: - `usePostHogRedux()` - 完整功能 Hook - `usePostHogTrack()` - 仅追踪功能(性能优化) - `usePostHogFlags()` - 仅 Feature Flags(性能优化) - `usePostHogUser()` - 仅用户管理(性能优化) ### 2. 修改的文件 #### Redux Store (`src/store/index.js`) ```javascript import posthogReducer from './slices/posthogSlice'; import posthogMiddleware from './middleware/posthogMiddleware'; export const store = configureStore({ reducer: { communityData: communityDataReducer, posthog: posthogReducer, // ✅ 新增 }, middleware: (getDefaultMiddleware) => getDefaultMiddleware({...}) .concat(posthogMiddleware), // ✅ 新增 }); ``` #### App.js - ❌ 移除了 `` 包装 - ✅ 在 `AppContent` 中添加 Redux 初始化: ```javascript useEffect(() => { dispatch(initializePostHog()); }, [dispatch]); ``` ### 3. 保留的文件(仍然需要) - ✅ `src/lib/posthog.js` - PostHog SDK 封装 - ✅ `src/lib/constants.js` - 事件常量(AARRR 框架) - ✅ `src/hooks/usePostHog.js` - 原 Hook(可选保留,兼容旧代码) ### 4. 可以删除的文件(不再需要) - ❌ `src/components/PostHogProvider.js` - 改用 Redux 管理 - ❌ `src/hooks/usePageTracking.js` - 改由 Middleware 处理 --- ## 🎯 Redux 方案的优势 ### 1. **集中式状态管理** PostHog 状态与其他应用状态统一管理,便于维护和调试。 ### 2. **自动追踪** 通过 Middleware 自动拦截 Redux actions,无需手动调用追踪。 ```javascript // 旧方案(手动追踪) const handleLogin = () => { // ... 登录逻辑 track(ACTIVATION_EVENTS.USER_LOGGED_IN, { ... }); }; // 新方案(自动追踪) const handleLogin = () => { dispatch(loginUser({ ... })); // ✅ Middleware 自动追踪 }; ``` ### 3. **Redux DevTools 集成** 可以在 Redux DevTools 中查看所有 PostHog 事件: ``` Action: posthog/trackEvent/fulfilled Payload: { eventName: "News Article Clicked", properties: { article_id: "123" } } ``` ### 4. **离线事件缓存** 自动缓存离线时的事件,网络恢复后批量发送。 ### 5. **时间旅行调试** 可以回放和调试用户行为,定位问题更容易。 --- ## 📚 使用指南 ### 1. 基础用法 - 追踪自定义事件 ```jsx import { usePostHogRedux } from 'hooks/usePostHogRedux'; import { RETENTION_EVENTS } from 'lib/constants'; function NewsArticle({ article }) { const { track } = usePostHogRedux(); const handleClick = () => { track(RETENTION_EVENTS.NEWS_ARTICLE_CLICKED, { article_id: article.id, article_title: article.title, source: 'community_page', }); }; return
{article.title}
; } ``` ### 2. 用户识别(登录时) 在 `AuthContext` 或登录成功回调中: ```jsx import { usePostHogRedux } from 'hooks/usePostHogRedux'; function AuthContext() { const { identify, reset } = usePostHogRedux(); const handleLoginSuccess = (user) => { // 识别用户 identify(user.id, { email: user.email, username: user.username, subscription_tier: user.subscription_type || 'free', registration_date: user.created_at, }); }; const handleLogout = () => { // 重置用户会话 reset(); }; return { handleLoginSuccess, handleLogout }; } ``` ### 3. Feature Flags(A/B 测试) ```jsx import { usePostHogFlags } from 'hooks/usePostHogRedux'; function Dashboard() { const { isEnabled } = usePostHogFlags(); if (isEnabled('new_dashboard_design')) { return ; } return ; } ``` ### 4. 自动追踪(推荐) **无需手动追踪**,只需 dispatch Redux action,Middleware 会自动处理: ```jsx // ✅ 登录时自动追踪 dispatch(loginUser({ email, password })); // → Middleware 自动追踪 USER_LOGGED_IN // ✅ 获取新闻时自动追踪 dispatch(fetchHotEvents()); // → Middleware 自动追踪 NEWS_LIST_VIEWED // ✅ 支付成功时自动追踪 dispatch(paymentSuccess({ amount, transactionId })); // → Middleware 自动追踪 PAYMENT_SUCCESSFUL ``` ### 5. 性能优化 Hook 如果只需要追踪功能,使用轻量级 Hook: ```jsx import { usePostHogTrack } from 'hooks/usePostHogRedux'; function MyComponent() { const { track } = usePostHogTrack(); // ✅ 只订阅追踪功能 // 不会因为 PostHog 状态变化而重新渲染 return ; } ``` --- ## 🔧 配置自动追踪规则 在 `src/store/middleware/posthogMiddleware.js` 中添加新规则: ```javascript const ACTION_TO_EVENT_MAP = { // 添加你的 action 'myFeature/actionName': { event: RETENTION_EVENTS.MY_EVENT, getProperties: (action) => ({ property1: action.payload?.value1, property2: action.payload?.value2, }), }, }; ``` --- ## 🧪 调试技巧 ### 1. Redux DevTools 打开 Redux DevTools,筛选 `posthog/` actions: ``` posthog/initializePostHog/fulfilled posthog/identifyUser/fulfilled posthog/trackEvent/fulfilled ``` ### 2. 查看 PostHog 状态 ```jsx import { useSelector } from 'react-redux'; import { selectPostHog } from 'store/slices/posthogSlice'; function DebugPanel() { const posthog = useSelector(selectPostHog); return (
{JSON.stringify(posthog, null, 2)}
); } ``` ### 3. 控制台日志 开发环境下会自动输出日志: ``` [PostHog Middleware] 自动追踪事件: User Logged In { user_id: 123 } [PostHog] 📍 Event tracked: News Article Clicked ``` --- ## 📊 State 结构 ```javascript { posthog: { // 初始化状态 isInitialized: true, initError: null, // 用户信息 user: { userId: "123", email: "user@example.com", subscription_tier: "pro" }, // 事件队列(离线缓存) eventQueue: [ { eventName: "...", properties: {...}, timestamp: "..." } ], // Feature Flags featureFlags: { new_dashboard_design: true, beta_feature: false }, // 配置 config: { apiKey: "phc_...", apiHost: "https://app.posthog.com", sessionRecording: false }, // 统计 stats: { totalEvents: 150, lastEventTime: "2025-10-28T12:00:00Z" } } } ``` --- ## 🚀 高级功能 ### 1. 手动触发页面浏览 ```jsx import { trackModalView, trackTabChange } from 'store/middleware/posthogMiddleware'; // Modal 打开时 dispatch(trackModalView('User Settings Modal', { source: 'nav_bar' })); // Tab 切换时 dispatch(trackTabChange('Related Stocks', { from_tab: 'Overview' })); ``` ### 2. 刷新离线事件 ```jsx import { flushCachedEvents } from 'store/slices/posthogSlice'; // 网络恢复时自动触发,也可以手动触发 dispatch(flushCachedEvents()); ``` ### 3. 性能追踪 给 action 添加时间戳: ```jsx import { withTiming } from 'store/middleware/posthogMiddleware'; // 追踪耗时操作 dispatch(withTiming(fetchBigData())); // → 如果超过 1 秒,会自动追踪性能事件 ``` --- ## ⚠️ 注意事项 ### 1. **环境变量** 确保 `.env` 文件中配置了 PostHog API Key: ```bash REACT_APP_POSTHOG_KEY=phc_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx REACT_APP_POSTHOG_HOST=https://app.posthog.com REACT_APP_ENABLE_SESSION_RECORDING=false ``` ### 2. **Redux Middleware 顺序** PostHog Middleware 应该在其他 middleware 之后: ```javascript .concat(otherMiddleware) .concat(posthogMiddleware) // ✅ 最后添加 ``` ### 3. **避免循环依赖** 不要在 Middleware 中 dispatch 会触发 Middleware 的 action。 ### 4. **序列化检查** 已经在 store 配置中忽略了 PostHog actions 的序列化检查。 --- ## 🔄 从旧版本迁移 如果你的代码中使用了旧的 `usePostHog` Hook: ```jsx // 旧代码 import { usePostHog } from 'hooks/usePostHog'; const { track } = usePostHog(); // 新代码(推荐) import { usePostHogRedux } from 'hooks/usePostHogRedux'; const { track } = usePostHogRedux(); ``` **兼容性**: 旧的 `usePostHog` Hook 仍然可用,但推荐迁移到 Redux 版本。 --- ## 📚 参考资料 - [PostHog 官方文档](https://posthog.com/docs) - [Redux Toolkit 文档](https://redux-toolkit.js.org/) - [Redux Middleware 文档](https://redux.js.org/tutorials/fundamentals/part-4-store#middleware) - [AARRR 框架](https://www.productplan.com/glossary/aarrr-framework/) --- ## 🎉 总结 PostHog 已成功集成到 Redux!主要优势: 1. ✅ **自动追踪**: Middleware 自动拦截 actions 2. ✅ **集中管理**: 统一的 Redux 状态管理 3. ✅ **调试友好**: Redux DevTools 支持 4. ✅ **离线支持**: 自动缓存和刷新事件 5. ✅ **性能优化**: 提供多个轻量级 Hooks 现在你可以: 1. 启动应用:`npm start` 2. 打开 Redux DevTools 查看 PostHog 状态 3. 执行操作(登录、浏览页面、点击按钮) 4. 观察自动追踪的事件 Have fun tracking! 🚀