@deriv-com/analytics

中文文档
1.44.0发布于 2026/10/13MITTypeScriptESM + CJS近 30 天下载 8770

Deriv应用的综合分析包. 通过RuderStack,PostHog和GrowthBook集成,提供统一的事件跟踪,A/B测试,以及用户分析,内置缓存和离线支持.

中文使用文档
文档目录59 节
  1. 特征
  2. 目录
  3. 安装
  4. 国家预防机制/也门
  5. 浏览器( CDN)
  6. 快速启动
  7. 基本使用量( 仅RudderStack)
  8. 使用 RanderStack 和 PostHog 两种语言
  9. 框架整合
  10. 反应集成
  11. Next.js 一体化
  12. Vue.js 一体化
  13. 香草 Java 脚本
  14. 配置
  15. 舵手Stack 配置
  16. PostHog 配置
  17. 核心 API
  18. 初始化
  19. 事件跟踪
  20. 用户标识
  21. 页视图
  22. 用户属性
  23. 重置用户会话
  24. 缓存离线支持( O)
  25. 本地缓存( SDK 尚未装入)
  26. 内存卡(离线)
  27. 基于路线的事件
  28. 调试模式
  29. 高级使用
  30. 独立软件包使用
  31. 访问提供者实例
  32. 后霍格特性旗
  33. PostHog 整合检查列表
  34. API 参考
  35. initialise(options: Options): Promise<void>
  36. trackEvent(event: string, payload: Record<string, any>): vo…
  37. pageView(url: string, platform?: string, properties?: Recor…
  38. identifyEvent(userId?: string, traits?: Record<string, any>…
  39. backfillPersonProperties({ user_id, email?, country_of_resi…
  40. setAttributes(attributes: Record<string, any>): void
  41. loadEvent(items: PageLoadEventConfig[]): void
  42. reset(): void
  43. getId(): string
  44. getAnonymousId(): string
  45. getInstances(): { tracking, posthog }
  46. 业绩
  47. 基准
  48. 优化
  49. 套装大小
  50. 解决问题
  51. 未在 RanderStack 中出现的事件
  52. 无法接收事件
  53. 会话记录不工作
  54. 缓存但未发送的事件
  55. 移徙指南
  56. 从v1.x到v2.x
  57. 捐款
  58. 许可证
  59. 支助

@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.mehttps://ph.deriv.me
*.deriv.behttps://ph.deriv.be
*.deriv.aehttps://ph.deriv.ae
所有其他(包括安全部门改革)https://ph.deriv.com

强制设置

适用这些规定 之后 任何消费者 config 展开。 送他们进来 config 无效 :

设置数值原因
person_profiles'identified_only'防止匿名剖析bloat
capture_pageview'history_change'SPA -- -- 安全 -- -- 每起火灾 pushState 编号 : replaceState
capture_pageleavetrue标准会话完整性
session_recording.recordCrossOriginIframestrue抓取嵌入式工具
session_recording.minimumDurationMilliseconds30000过滤子- 30秒噪声会话
session_recording.maskAllInputstrue隐私——消费者不能降低

里面的消费键 session_recording 正在展开 在此之前 这些强制值,所以额外的像 sessionRecordingSampleRate 在不发生冲突的情况下生效.

无法逾越的默认

设置默认当..
autocapture{ dom_event_allowlist: ['click'], element_allowlist: ['button', 'a'] }您需要更多的事件类型或元素 。 避免 false ——它也会禁用 $rageclick
rageclicktrue你想停止捕捉愤怒点击
capture_dead_clickstrue您想要停止捕捉已死点击
rate_limiting.events_per_second10合法用户流量击中了爆炸限制器
rate_limiting.events_burst_limit100合法用户流量击中了爆炸限制器

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.ae
  • localhost 财务报告和审定财务报表 127.0.0.1 总是允许

此列表为硬码而不可配置 .

在每一处,剩下的 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 中出现的事件

  1. 校验 API 密钥检查 rudderstackKey 正确的
  2. 检查网络请求: 打开 DevTools = 网络标签 = 查找对 RanderStack 数据平面的请求
  3. 验证初始化运行 Analytics.getInstances().tracking.has_initialized 在控制台中
  4. 检查批次: 事件进行分批 - 等待~10秒或发送10个事件

无法接收事件

  1. 校验 API 密钥: 检查 PostHog API 密钥是否正确( 启动于 phc_(中文(简体) )
  2. 检查域允许列表: 校验您的域名 allowedDomains 列表
  3. 检查初始化运行 Analytics.getInstances().posthog?.has_initialized 在控制台中
  4. 验证网络请求: 检查 DevTools 请求到 ph.deriv.com 或您的 PostHog 主机
  5. 检查浏览器控制台: 查找 PostHog 错误或警告

会话记录不工作

  1. 校验配置: 确保 disable_session_recording: false (或省略之说
  2. 检查最小持续时间: 会话短于 minimumDurationMilliseconds 未保存
  3. 校验域: 检查 PostHog 已初始化并允许域
  4. 检查 PostHog 仪表板:录制可能需要几分钟的时间才能出现

缓存但未发送的事件

  1. 检查在线状态运行 navigator.onLine 在控制台中
  2. 验证已装入的 SDK运行 Analytics.getInstances().tracking.has_initialized
  3. 检查存储: 打开 DevTools —— 应用程序 —— 本地存储 —— 寻找 cached_analytics_events 财务报告和审定财务报表 cached_analytics_page_views 键。 这个 rudder_anonymous_id 仍作为饼干保存.
  4. 手动清除缓存: 清除本地密钥或运行 Analytics.reset()

移徙指南

从v1.x到v2.x

中断更改

  1. 识别事件签名已更改数字 :
// 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' },
})
  1. 增长减值: 迁移到 PostHog 特性旗
// Old (GrowthBook)
const isEnabled = Analytics.isFeatureOn('new-feature')

// New (PostHog)
const { posthog } = Analytics.getInstances()
const isEnabled = posthog?.isFeatureEnabled('new-feature')

捐款

欢迎捐款! 请遵照这些准则:

  1. 叉子存储器
  2. 创建特性分支
  3. 为您的更改撰写测试
  4. 运行 npm test 财务报告和审定财务报表 npm run build
  5. 提交拉动请求

许可证

麻省理工学院

支助

关于议题和问题清单:

版本与发布记录

@deriv-com/analytics 共发布 121 个版本,首次发布于 2024/01/15;过去 12 个月发布了 41 个版本。

版本发布日期距今
1.44.0latest2026/10/1329 天前
1.43.02026/09/112 个月前
1.42.12026/05/086 个月前
1.42.02026/05/076 个月前
1.41.12026/04/176 个月前
1.41.02026/04/156 个月前

其他发布通道:beta → 1.7.0-beta.2,next-major → 1.7.0。

关于 @deriv-com/analytics 的常见问题

@deriv-com/analytics 是什么?

Deriv应用的综合分析包. 通过RuderStack,PostHog和GrowthBook集成,提供统一的事件跟踪,A/B测试,以及用户分析,内置缓存和离线支持.

如何安装 @deriv-com/analytics?

在项目目录运行 npm install @deriv-com/analytics,或使用 pnpm add / yarn add / bun add。

@deriv-com/analytics 支持 TypeScript 吗?

支持。包内自带 TypeScript 类型声明(package.json 声明了 types 入口),安装后即可获得类型提示,无需再安装 @types 包。

@deriv-com/analytics 支持 ESM 还是 CommonJS?

同时提供 ES Module 与 CommonJS 入口,import 和 require() 都可以使用,打包工具会自动选择合适的版本。

@deriv-com/analytics 需要什么版本的 Node.js?

package.json 的 engines 字段要求 Node.js >=24.13.0。版本不符时 npm 默认只给出警告,开启 engine-strict 后会拒绝安装。

@deriv-com/analytics 可以商用吗?

@deriv-com/analytics 使用 MIT 许可。宽松许可:允许商业使用、修改和再分发,通常只需在分发时保留原版权与许可声明。以上为概括,不构成法律意见,请以许可原文为准。

@deriv-com/analytics 的下载量有多少?

根据 npm 官方下载统计,@deriv-com/analytics 在 2026/10/12 – 2026/11/10 这 30 天内被下载 8,770 次,日均约 292 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入,适合横向比较热度,不能直接等同于使用人数。

@deriv-com/analytics 还在维护吗?

最新版本 1.44.0 发布于 2026/10/13(29 天前);至今共发布 121 个版本,其中过去 12 个月发布了 41 个;首次发布于 2024/01/15。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。