@deriv-com/分析
一个现代的可树摇动分析库,用于跟随RuderStack和PostHog追踪用户事件. 以高级缓存、分批和离线支持为最佳性能设计.
特征
- 📊 多服务支持: 用于事件跟踪的 RanderStack 用于分析的 PostHog 记录( S)
- 🎄 可树动: 只有捆绑您使用的东西 - 每个提供者可以独立导入
- 📡 离线第一: 离线时自动事件缓存, 重新连接时重放
- ⚡ 业绩优化: Batching, 分解, 和 SendBeacon API 用于快速跟踪
- 🔄 后向兼容: 支持更古老的React,Node.js等遗产包版本
- 💾 高级缓存: 当地集散地和内藏地,以提供强有力的活动
- 🎥 会话录音: 内建 PostHog 会话录入自定义的设置
说明:GrowthBook支持被贬值,将在未来的主要版本被去掉. 对于A/B测试和特征旗,我们建议使用PostHog的内置特征旗能力.
目录
安装
国家预防机制/也门
# Using npm
npm install @deriv-com/analytics
# Using yarn
yarn add @deriv-com/analytics
# Using pnpm
pnpm add @deriv-com/analytics
核心依赖关系 (单位:千美元)@rudderstack/analytics-js, (中文(简体) ), js-cookie,以及 posthog-js自动安装.
浏览器( CDN)
在没有构建工具的浏览器中直接使用:
<!-- Load from jsdelivr CDN -->
<script src="https://cdn.jsdelivr.net/npm/@deriv-com/analytics@latest/dist/browser/analytics.bundle.global.js"></script>
<script>
const { Analytics } = window.DerivAnalytics
Analytics.initialise({
rudderstackKey: 'YOUR_RUDDERSTACK_KEY',
posthogOptions: {
apiKey: 'YOUR_POSTHOG_KEY',
config: {
autocapture: true,
},
},
}).then(() => {
Analytics.trackEvent('page_view', { page: 'home' })
})
</script>
套装大小: ~380 KB 已修改 /~125 KB gziped (包括RanderStack + PostHog + 所有依赖性)
快速启动
基本使用量( 仅RudderStack)
import { Analytics } from '@deriv-com/analytics'
// Initialize with RudderStack
await Analytics.initialise({
rudderstackKey: 'YOUR_RUDDERSTACK_KEY',
})
// Track events
Analytics.trackEvent('ce_virtual_signup_form', {
action: 'signup_done',
signup_provider: 'email',
})
// Track page views
Analytics.pageView('/dashboard', 'Deriv App')
// Identify users
Analytics.identifyEvent('CR123456')
使用 RanderStack 和 PostHog 两种语言
import { Analytics } from '@deriv-com/analytics'
await Analytics.initialise({
// RudderStack for event tracking (required)
rudderstackKey: 'YOUR_RUDDERSTACK_KEY',
// PostHog for analytics and session recording (optional)
posthogOptions: {
apiKey: 'phc_YOUR_POSTHOG_KEY',
config: {
session_recording: {
recordCrossOriginIframes: true,
minimumDurationMilliseconds: 30000,
},
autocapture: true,
},
},
})
// Events are automatically sent to both providers
Analytics.trackEvent('ce_login_form', {
action: 'login_cta',
login_provider: 'google',
})
// User identification syncs with both providers
// When using PostHog, pass email via provider-specific traits (see User Identification section)
Analytics.identifyEvent('CR123456', {
rudderstack: { language: 'en', country_of_residence: 'US' },
posthog: { email: '[email protected]', language: 'en', country_of_residence: 'US' },
})
框架整合
反应集成
建议的模式是单一的 useAnalytics 处理初始化并曝光所有跟踪方法的钩:
// hooks/useAnalytics.ts
import { useEffect } from 'react'
import { Analytics } from '@deriv-com/analytics'
let isInitialized = false
export function useAnalytics() {
useEffect(() => {
if (isInitialized) return
isInitialized = true
const rudderstackKey = process.env.REACT_APP_RUDDERSTACK_KEY // ← replace with your env var
const posthogKey = process.env.REACT_APP_POSTHOG_KEY // ← replace with your env var
if (!rudderstackKey && !posthogKey) return
Analytics.initialise({
...(rudderstackKey && { rudderstackKey }),
...(posthogKey && {
posthogOptions: {
apiKey: posthogKey,
api_host: process.env.REACT_APP_POSTHOG_HOST,
},
}),
debug: process.env.NODE_ENV === 'development',
})
}, [])
return {
trackEvent: Analytics.trackEvent,
identifyEvent: Analytics.identifyEvent,
pageView: Analytics.pageView,
loadEvent: Analytics.loadEvent,
setAttributes: Analytics.setAttributes,
reset: Analytics.reset,
}
}
在你的应用程序的顶端给钩子打电话:
// App.tsx
import { useAnalytics } from './hooks/useAnalytics'
function App() {
const { trackEvent } = useAnalytics()
return <button onClick={() => trackEvent('ce_signup_button', { action: 'click' })}>Sign Up</button>
}
Next.js 一体化
App 路由器 (Next.js 13+)
用同样的 useAnalytics 钩子( 有 NEXT_PUBLIC_ env var 前缀)在专用客户端提供者内:
// hooks/useAnalytics.ts
'use client'
import { useEffect } from 'react'
import { Analytics } from '@deriv-com/analytics'
let isInitialized = false
export function useAnalytics() {
useEffect(() => {
if (isInitialized) return
isInitialized = true
const rudderstackKey = process.env.NEXT_PUBLIC_RUDDERSTACK_KEY // ← replace with your env var
const posthogKey = process.env.NEXT_PUBLIC_POSTHOG_KEY // ← replace with your env var
if (!rudderstackKey && !posthogKey) return
Analytics.initialise({
...(rudderstackKey && { rudderstackKey }),
...(posthogKey && {
posthogOptions: {
apiKey: posthogKey,
api_host: process.env.NEXT_PUBLIC_POSTHOG_HOST,
},
}),
debug: process.env.NODE_ENV === 'development',
})
}, [])
return {
trackEvent: Analytics.trackEvent,
identifyEvent: Analytics.identifyEvent,
pageView: Analytics.pageView,
loadEvent: Analytics.loadEvent,
setAttributes: Analytics.setAttributes,
reset: Analytics.reset,
}
}
// app/analytics-provider.tsx
'use client'
import { useAnalytics } from '@/hooks/useAnalytics'
export function AnalyticsProvider({ children }: { children: React.ReactNode }) {
useAnalytics()
return <>{children}</>
}
// app/layout.tsx
import { AnalyticsProvider } from './analytics-provider'
export default function RootLayout({ children }: { children: React.ReactNode }) {
return (
<html>
<body>
<AnalyticsProvider>{children}</AnalyticsProvider>
</body>
</html>
)
}
Pages 路由器(以下简称:Next.js 12)
// pages/_app.tsx
import { useAnalytics } from '../hooks/useAnalytics'
import type { AppProps } from 'next/app'
export default function App({ Component, pageProps }: AppProps) {
useAnalytics()
return <Component {...pageProps} />
}
Vue.js 一体化
// main.ts or main.js
import { createApp } from 'vue'
import { Analytics } from '@deriv-com/analytics'
import App from './App.vue'
// Initialize analytics
Analytics.initialise({
rudderstackKey: import.meta.env.VITE_RUDDERSTACK_KEY,
posthogOptions: {
apiKey: import.meta.env.VITE_POSTHOG_KEY,
},
})
// Make Analytics available globally
const app = createApp(App)
app.config.globalProperties.$analytics = Analytics
app.mount('#app')
// Usage in components
export default {
methods: {
handleClick() {
this.$analytics.trackEvent('button_clicked', { button_name: 'submit' })
},
},
}
香草 Java 脚本
<!doctype html>
<html>
<head>
<script src="https://cdn.jsdelivr.net/npm/@deriv-com/analytics@latest/dist/browser/analytics.bundle.global.js"></script>
</head>
<body>
<button id="signup-btn">Sign Up</button>
<script>
const { Analytics } = window.DerivAnalytics
// Initialize
Analytics.initialise({
rudderstackKey: 'YOUR_KEY',
posthogOptions: {
apiKey: 'YOUR_POSTHOG_KEY',
},
})
// Track button clicks
document.getElementById('signup-btn').addEventListener('click', () => {
Analytics.trackEvent('ce_signup_button', {
action: 'click',
location: 'header',
})
})
</script>
</body>
</html>
配置
舵手Stack 配置
RanderStack用于事件跟踪,包括性能优化:
await Analytics.initialise({
rudderstackKey: 'YOUR_RUDDERSTACK_KEY',
})
内建性能特征 :
- 事件夹击: 10个事件或10秒后浮起
- 发送 Beacon API: 用途
navigator.sendBeacon页面卸载中更好的性能 - 自动重试: 请求被自动重审
- Cookie 管理器: 自动匿名ID生成和持久性(6个月饼干寿命)
- 离线支持: 离线时缓存事件, 恢复连接时重放
PostHog 配置
PostHog提供分析,会话录音,以及特色旗帜.
初始化
getPosthogInstance (和 Analytics.initialise)使用单通——用相同的密钥不止一次地调用它们,在不重运行SDK init的情况下返回已存在的实例. 在应用程序启动时拨打一次电话, 不在内部生成循环 .
await Analytics.initialise({
rudderstackKey: 'YOUR_RUDDERSTACK_KEY',
posthogOptions: {
apiKey: 'phc_YOUR_KEY',
// Optional: override the auto-resolved API host (see table below)
api_host: 'https://ph.deriv.com',
// Optional: overridable settings (see "Overridable defaults" table below)
config: {
autocapture: false, // disable autocapture entirely (also disables $rageclick)
disable_session_recording: true, // opt out of session recording
session_recording: {
sessionRecordingSampleRate: 0.5, // record 50% of sessions
},
before_send: event => {
// your function runs after the built-in domain + timestamp filter
if (event?.properties?.sensitive_field) return null
return event
},
},
},
})
api_host 自动解析自 window.location.hostname 如果省略:
| 域图案 | 已确定主机 |
|---|---|
*.deriv.me | https://ph.deriv.me |
*.deriv.be | https://ph.deriv.be |
*.deriv.ae | https://ph.deriv.ae |
| 所有其他(包括安全部门改革) | https://ph.deriv.com |
强制设置
适用这些规定 之后 任何消费者 config 展开。 送他们进来 config 无效 :
| 设置 | 数值 | 原因 |
|---|---|---|
person_profiles | 'identified_only' | 防止匿名剖析bloat |
capture_pageview | 'history_change' | SPA -- -- 安全 -- -- 每起火灾 pushState 编号 : replaceState |
capture_pageleave | true | 标准会话完整性 |
session_recording.recordCrossOriginIframes | true | 抓取嵌入式工具 |
session_recording.minimumDurationMilliseconds | 30000 | 过滤子- 30秒噪声会话 |
session_recording.maskAllInputs | true | 隐私——消费者不能降低 |
里面的消费键 session_recording 正在展开 在此之前 这些强制值,所以额外的像 sessionRecordingSampleRate 在不发生冲突的情况下生效.
无法逾越的默认
| 设置 | 默认 | 当.. |
|---|---|---|
autocapture | { dom_event_allowlist: ['click'], element_allowlist: ['button', 'a'] } | 您需要更多的事件类型或元素 。 避免 false ——它也会禁用 $rageclick |
rageclick | true | 你想停止捕捉愤怒点击 |
capture_dead_clicks | true | 您想要停止捕捉已死点击 |
rate_limiting.events_per_second | 10 | 合法用户流量击中了爆炸限制器 |
rate_limiting.events_burst_limit | 100 | 合法用户流量击中了爆炸限制器 |
QQ 不抓取 $pageview 手动
capture_pageview: 'history_change' 并自动向每个客户端导航开火。 添加手册 posthog.capture('$pageview') 将页面视图数增加一倍 并作出贡献 $client_ingestion_warning 费率限制点击.
反应路由器 :
// ❌ Remove this
useEffect(() => {
posthog.capture('$pageview')
}, [location.pathname])
// ✅ Nothing needed — capture_pageview: 'history_change' handles it
Vue 路由器 :
// ❌ Remove this
router.afterEach(() => {
posthog.capture('$pageview')
})
// ✅ Nothing needed — capture_pageview: 'history_change' handles it
域允许列表
事件被无声地封锁在 before_send 除非主机名符合 :
deriv.com, (中文(简体) ),deriv.be, (中文(简体) ),deriv.me, (中文(简体) ),deriv.team, (中文(简体) ),deriv.aelocalhost财务报告和审定财务报表127.0.0.1总是允许
此列表为硬码而不可配置 .
Stale cookie 清理
在每一处,剩下的 ph_*_posthog 前一个或旋转的 API 密钥中的 cookie 会被自动删除 。 无需采取行动.
核心 API
初始化
在跟踪事件之前初始化分析实例 :
await Analytics.initialise({
rudderstackKey: 'YOUR_RUDDERSTACK_KEY',
posthogOptions: {
apiKey: 'phc_YOUR_POSTHOG_KEY',
config: {
autocapture: true,
},
},
debug: false, // Enable to log all analytics calls to the console
})
事件跟踪
跟踪带有任何有效载荷的自定义事件——不存在强制属性类型. 发送您的活动需要的 :
Analytics.trackEvent('ce_login_form', {
action: 'login_cta',
login_provider: 'email',
form_name: 'main_login',
})
Analytics.trackEvent('ce_signup_form', {
action: 'signup_done',
signup_provider: 'google',
cta_information: {
cta_name: 'get_started',
section_name: 'hero',
},
})
用户标识
确定分析提供者的用户和同步特征:
简单识别
// Identify user with ID only
Analytics.identifyEvent('CR123456')
与自定义特征的识别
// Send same traits to both RudderStack and PostHog (no PostHog-specific fields)
Analytics.identifyEvent('CR123456', {
language: 'en',
country_of_residence: 'US',
account_type: 'real',
})
// Send provider-specific traits (recommended when using PostHog)
// PostHog requires `email` to automatically compute the `is_internal` flag
Analytics.identifyEvent('CR123456', {
rudderstack: {
language: 'en',
custom_field: 'value',
},
posthog: {
email: '[email protected]', // Required for PostHog — used to set is_internal flag
language: 'en',
country_of_residence: 'US',
},
})
如何运作:
- 如果通过一个简单的对象(例如,
{ language: 'en' }),同样的特征被发送给两个供应商 - 如果您通过对象
rudderstack或者说posthog键, 使用提供者特有的特性 - 如果提供者尚未初始化, 队列识别呼叫
- PostHog 自动处理匿名用户和识别用户之间的异名
- 何时
email以后霍格特征提供is_internal旗帜自动计算并设定为个人财产——email本身是 没有 转发到 PostHog
猪后身份生命周期
| 假设 | 打电话 |
|---|---|
| 用户日志在 | identifyEvent(user_id, { posthog: { email, language, country_of_residence } }) |
| 用户日志退出 | reset() |
| 上一个会话中已经识别的用户, 可能缺少个人属性 | backfillPersonProperties({ user_id, email, language, country_of_residence }) |
identifyEvent 链接匿名 PostHog 会话到用户并强制 client_id。如果当前不同的ID已经相同,则跳过它 user_id ——库自动进行此检查.
reset 清除关闭的 PostHog 会话。 未来的事情是匿名的 identifyEvent。 。 。 .
backfillPersonProperties 填入返回用户配置文件中可能缺失的属性(如. client_id, (中文(简体) ), is_internal) (中文(简体) ). 它在写作前检查每个属性,如果所有东西都已经存在,它就是一个不开放的. 在用户ID可用后, 随同或代替使用一次 identifyEvent 用于返回用户.
账户开关守卫: 两者
identifyEvent财务报告和审定财务报表backfillPersonProperties当 PostHog 存储的单独ID 属于 不同 已识别用户( 不是匿名的 UUID) 和呼叫posthog.reset()在识别新用户之前自动。 这样做可以防止各账户的合并.
页视图
音轨页面导航 :
// Basic page view
Analytics.pageView('/dashboard')
// With custom platform name
Analytics.pageView('/dashboard', 'Deriv Trader')
// With additional properties
Analytics.pageView('/trade', 'Deriv App', {
section: 'multipliers',
instrument: 'forex',
})
说明: PostHog 页面视图通过执行自动获取 capture_pageview: 'history_change' 设置。 不要打电话 posthog.capture('$pageview') 手动——见 QQ 不抓取 $pageview 手动 节。 人工页面视图跟踪 Analytics.pageView() 主要为陆克文Stack服务.
用户属性
设置自动包含在以后所有事件的用户和上下文属性. 传出任何密钥值配对——没有执行固定方案:
Analytics.setAttributes({
country: 'US',
user_language: 'en',
account_type: 'real',
device_type: 'mobile',
account_currency: 'USD',
account_mode: 'demo',
residence_country: 'US',
loggedIn: true,
// any additional fields your app needs
})
重置用户会话
清除所有提供者的用户会话( 如在登录时) :
Analytics.reset()
缓存离线支持( O)
软件包包括自动缓存以确保不丢失事件——不需要额外配置.
本地缓存( SDK 尚未装入)
当你打电话 trackEvent 或者说 pageView 在此之前 initialise() 完整,事件存储于 localStorage 并在SDK加载后自动重放 :
// Safe to call before initialise() — automatically replayed on load
Analytics.trackEvent('button_clicked', { button: 'submit' })
Analytics.pageView('/dashboard')
内存卡(离线)
当用户下线但SDK已经初始化时,事件会在内存中进行并冲入下一个在线 trackEvent 电话 :
// While offline — queued in memory, sent automatically when back online
Analytics.trackEvent('offline_event', { data: 'cached' })
基于路线的事件
仅在特定页面上使用 loadEvent数字 :
Analytics.loadEvent([
{
pages: ['dashboard', 'profile'],
event: { name: 'ce_page_load', properties: { page_type: 'authenticated' } },
},
{
excludedPages: ['login'],
event: { name: 'ce_authenticated_view', properties: {} },
},
])
调试模式
启用动词记录以追踪浏览器控制台中每次分析呼叫:
await Analytics.initialise({
rudderstackKey: 'YOUR_KEY',
posthogOptions: { apiKey: 'phc_YOUR_KEY' },
debug: true,
})
所有日志前缀为 [ANALYTIC] (例如, [ANALYTIC][RudderStack] trackEvent | ...) (中文(简体) ). 开发期间和QA用于验证事件的实用性是在不打开网络标签的情况下正确发射.
高级使用
独立软件包使用
每个供应商可独立使用,以达到最大灵活性:
仅限后霍格
import { Posthog } from '@deriv-com/analytics/posthog'
const posthog = Posthog.getPosthogInstance({
apiKey: 'phc_YOUR_KEY',
config: {
autocapture: true,
session_recording: {
recordCrossOriginIframes: true,
},
},
})
// Track events
posthog.capture('button_clicked', { button_name: 'signup' })
// Identify users — email is required and used to compute is_internal
posthog.identifyEvent('CR123', { email: '[email protected]', language: 'en' })
// Check feature flags
const isEnabled = posthog.isFeatureEnabled('new-feature')
const variant = posthog.getFeatureFlag('button-color')
仅限舵板
import { RudderStack } from '@deriv-com/analytics/rudderstack'
const rudderstack = RudderStack.getRudderStackInstance('YOUR_KEY', () => {
console.log('RudderStack loaded')
})
// Track events
rudderstack.track('button_clicked', { button: 'signup' })
// Identify users
rudderstack.identifyEvent('CR123', { language: 'en' })
// Track page views
rudderstack.pageView('/dashboard', 'Deriv App', 'CR123')
访问提供者实例
高级使用情况下访问原始提供者实例:
const { tracking, posthog } = Analytics.getInstances()
// Access PostHog directly
if (posthog?.has_initialized) {
posthog.capture('custom_event', { property: 'value' })
// Access PostHog feature flags
const isEnabled = posthog.isFeatureEnabled('new-feature')
}
// Access RudderStack directly
if (tracking?.has_initialized) {
const userId = tracking.getUserId()
const anonId = tracking.getAnonymousId()
}
后霍格特性旗
通过 posthog 实例:
const { posthog } = Analytics.getInstances()
// Boolean flag — returns true, false, or undefined (not ready)
const isEnabled = posthog?.isFeatureEnabled('my-flag')
// Multivariate flag — returns a string variant, boolean, or undefined
const variant = posthog?.getFeatureFlag('button-color') // e.g. 'red' | 'blue' | true | undefined
// Structured payload attached to a flag
const config = posthog?.getFeatureFlagPayload('pricing-config') // e.g. { price: 9.99 }
// All active flags as a map
const allFlags = posthog?.getAllFlags() // { 'flag-a': true, 'flag-b': 'variant-x' }
// Subscribe to flag changes (fires immediately + on every reload)
const unsubscribe = posthog?.onFeatureFlags((flags, variants) => {
console.log('active flags:', flags)
console.log('variants:', variants)
})
// Call unsubscribe() to stop listening
// Force a reload from the server (e.g. after login or attribute change)
posthog?.reloadFeatureFlags()
直接使用 PostHog 时( 无 Analytics 包装 :
import { Posthog } from '@deriv-com/analytics/posthog'
const posthog = Posthog.getPosthogInstance({ apiKey: 'phc_YOUR_KEY' })
const isEnabled = posthog.isFeatureEnabled('my-flag')
PostHog 整合检查列表
在装运前,核实:
Analytics.initialise(或getPosthogInstance)称为 一次 应用程序启动时——不是每次渲染或路由更改时- 没有
posthog.capture('$pageview')电话保留——搜索密码库并删除 identifyEvent在登录时调用email后霍格特征(用于is_internal旗帜)reset()正在调用登录backfillPersonProperties当用户ID可用时,需要返回用户- 您的域名在许可列表中—— 如果在非..
deriv.*域外的localhost,事件被无声地封锁 debug: true被清除或后方守卫process.env.NODE_ENV === 'development'
API 参考
initialise(options: Options): Promise<void>
初始化分析实例 .
参数:
interface Options {
rudderstackKey?: string
posthogOptions?: {
apiKey: string
/**
* Optional PostHog API host. If omitted, resolved automatically based on window.location.hostname:
* *.deriv.me → https://ph.deriv.me
* *.deriv.be → https://ph.deriv.be
* *.deriv.ae → https://ph.deriv.ae
* all others → https://ph.deriv.com (default; also used server-side)
*/
api_host?: string
config?: PostHogConfig
}
/** Enable verbose debug logging — all analytics calls are logged prefixed with [ANALYTIC] */
debug?: boolean
}
trackEvent(event: string, payload: Record<string, any>): void
追踪一个事件。 没有执行有效载荷计划——发送任何键值对.
pageView(url: string, platform?: string, properties?: Record<string, unknown>): void
音轨页面导航.
identifyEvent(userId?: string, traits?: Record<string, any>): void
将匿名会话链接到具有可选特性的用户ID. 当 PostHog 活动时, 特性包括 email 字段(通过特定提供者) posthog 键), is_internal 自动计算并设定为个人财产——电子邮件本身不存储在PostHog中.
backfillPersonProperties({ user_id, email?, country_of_residence? }): void
后填充 PostHog 前几会中识别的用户的人物属性 。 设定 client_id 财务报告和审定财务报表 is_internal 如果他们还没有出现。 如果 PostHog 没有初始化或 user_id 为空.
// Call after PostHog has loaded and user ID is available
Analytics.backfillPersonProperties({ user_id: 'CR123456', email: '[email protected]', country_of_residence: 'US' })
setAttributes(attributes: Record<string, any>): void
更新流向所有提供者的用户属性 。 没有执行任何计划.
loadEvent(items: PageLoadEventConfig[]): void
以当前页面路径名为条件的火灾事件 .
type PageLoadEventConfig = {
pages?: string[] // fire only on these pages
excludedPages?: string[] // fire on all pages except these
event: { name: string; properties: Record<string, any> }
callback?: () => { name: string; properties: Record<string, any> }
}
reset(): void
清除所有提供者的用户会话 .
getId(): string
获取当前用户身份 .
getAnonymousId(): string
获取匿名用户身份.
getInstances(): { tracking, posthog }
访问原始提供者实例.
业绩
基准
- 事件跟踪: < 5ms(平均)
- 页面视图跟踪: < 3ms(平均)
- 初始化: ~200ms(同时提供两种)
- 离线缓存重放: <50ms,用于10个活动
优化
- 树摇: 未使用供应商从捆绑中完全删除
- 懒惰装入: PostHog 仅在配置时才动态加载
- 事件夹击: RanderStack分批事件(10起事件或10秒)
- 发送 Beacon: 用途
navigator.sendBeacon在卸页时可靠事件交付 - 复制: 防止重复事件被发送
套装大小
估计大小( 小于 + gziped) :
- 核心( RudderStack + Post Hog): ~32 KB 键
- 仅限舵板:~18 KB 键
- 仅限后霍格: ~20 KB 键
- 浏览器 Bundle( 全部包含): ~125 KB 击出
解决问题
未在 RanderStack 中出现的事件
- 校验 API 密钥检查
rudderstackKey正确的 - 检查网络请求: 打开 DevTools = 网络标签 = 查找对 RanderStack 数据平面的请求
- 验证初始化运行
Analytics.getInstances().tracking.has_initialized在控制台中 - 检查批次: 事件进行分批 - 等待~10秒或发送10个事件
无法接收事件
- 校验 API 密钥: 检查 PostHog API 密钥是否正确( 启动于
phc_(中文(简体) ) - 检查域允许列表: 校验您的域名
allowedDomains列表 - 检查初始化运行
Analytics.getInstances().posthog?.has_initialized在控制台中 - 验证网络请求: 检查 DevTools 请求到
ph.deriv.com或您的 PostHog 主机 - 检查浏览器控制台: 查找 PostHog 错误或警告
会话记录不工作
- 校验配置: 确保
disable_session_recording: false(或省略之说 - 检查最小持续时间: 会话短于
minimumDurationMilliseconds未保存 - 校验域: 检查 PostHog 已初始化并允许域
- 检查 PostHog 仪表板:录制可能需要几分钟的时间才能出现
缓存但未发送的事件
- 检查在线状态运行
navigator.onLine在控制台中 - 验证已装入的 SDK运行
Analytics.getInstances().tracking.has_initialized - 检查存储: 打开 DevTools —— 应用程序 —— 本地存储 —— 寻找
cached_analytics_events财务报告和审定财务报表cached_analytics_page_views键。 这个rudder_anonymous_id仍作为饼干保存. - 手动清除缓存: 清除本地密钥或运行
Analytics.reset()
移徙指南
从v1.x到v2.x
中断更改
- 识别事件签名已更改数字 :
// Old (v1.x) - hardcoded traits
Analytics.identifyEvent('CR123')
// New (v2.x) - custom traits
Analytics.identifyEvent('CR123', {
language: 'en',
country_of_residence: 'US',
})
// Or provider-specific
Analytics.identifyEvent('CR123', {
rudderstack: { language: 'en' },
posthog: { language: 'en', country_of_residence: 'US' },
})
- 增长减值: 迁移到 PostHog 特性旗
// Old (GrowthBook)
const isEnabled = Analytics.isFeatureOn('new-feature')
// New (PostHog)
const { posthog } = Analytics.getInstances()
const isEnabled = posthog?.isFeatureEnabled('new-feature')
捐款
欢迎捐款! 请遵照这些准则:
- 叉子存储器
- 创建特性分支
- 为您的更改撰写测试
- 运行
npm test财务报告和审定财务报表npm run build - 提交拉动请求
许可证
麻省理工学院
支助
关于议题和问题清单: