# @analytics/snowplow 中文文档

规范地址：https://npmcn.com/package/%40analytics/snowplow/

版本：0\.3\.3
npm 元数据更新时间：2022-04-04T13:55:00.698Z
中文译文更新时间：2026-11-06T01:53:54.213Z
软件包许可：MIT

本文由上游 README 翻译，可能存在偏差，请结合原文核对 API、命令与配置。版权与许可归原作者所有。

原始 npm 页面：https://www.npmjs.com/package/%40analytics/snowplow
原文对照：https://npmcn.com/package/%40analytics/snowplow/?lang=original
项目主页：https://github.com/DavidWells/analytics#readme
源码仓库：https://github.com/DavidWells/analytics

## 关键信息（来自 npm 元数据）

- 包体积（解压后）：474 kB，10 个文件
- 模块格式：ESM + CJS
- TypeScript 类型：未声明
- 运行依赖：16 个
- 首次发布：2020-08-02T18:49:14.022Z
- 最新版本发布：2022-03-18T03:43:13.980Z
- 近 30 天下载量：7835（2026-10-06 至 2026-11-04，npm 官方下载统计）
- 已发布版本数：11（近 12 个月 0 个）

## 中文简介

浏览器和节点的“分析”模块的雪花集成

## 安装

```sh
npm install @analytics/snowplow
```

也可以使用：`pnpm add @analytics/snowplow`、`yarn add @analytics/snowplow`、`bun add @analytics/snowplow`

## README

# 分析的雪花插件

与 [雪花分析](https://www.snowplowanalytics.com/) 页:1 [分析](https://www.npmjs.com/package/analytics) 软件包.

[查看文件](https://getanalytics.io/plugins/snowplow/)

单击以扩展

-   [安装](https://npmcn.com/package/%40analytics/snowplow/#readme-installation)
-   [如何使用](https://npmcn.com/package/%40analytics/snowplow/#readme-how-to-use)
-   [支持的平台](https://npmcn.com/package/%40analytics/snowplow/#readme-platforms-supported)
-   [浏览器使用量](https://npmcn.com/package/%40analytics/snowplow/#readme-browser-usage)
    -   [浏览器 API](https://npmcn.com/package/%40analytics/snowplow/#readme-browser-api)
    -   [浏览器配置选项](https://npmcn.com/package/%40analytics/snowplow/#readme-configuration-options-for-browser)
-   [服务器侧用法](https://npmcn.com/package/%40analytics/snowplow/#readme-server-side-usage)
    -   [服务器侧 API](https://npmcn.com/package/%40analytics/snowplow/#readme-server-side-api)
    -   [服务器侧配置选项](https://npmcn.com/package/%40analytics/snowplow/#readme-configuration-options-for-server-side)
-   [其他例子](https://npmcn.com/package/%40analytics/snowplow/#readme-additional-examples)

## 安装

安装 `analytics` 财务报告和审定财务报表 `@analytics/snowplow` 软件包

```bash
npm install analytics
npm install @analytics/snowplow
```

## 如何使用

这个 `@analytics/snowplow` 软件包在 [浏览器](https://npmcn.com/package/%40analytics/snowplow/#readme-browser-usage) 财务报告和审定财务报表 [在节点.js的服务器侧](https://npmcn.com/package/%40analytics/snowplow/#readme-server-side-usage)。要使用、安装软件包,在您的工程中包含并初始化插件 [分析](https://www.npmjs.com/package/analytics)。 。 。 .

以下为如何使用浏览器插件的例子.

```js
import Analytics from 'analytics'
import snowplowPlugin from '@analytics/snowplow'

const analytics = Analytics({
  app: 'awesome-app',
  plugins: [
    // Minimal recommended configuration
    snowplowPlugin({
      name: 'snowplow',
      collectorUrl: 'collector.mysite.com',
      trackerSettings: {
        appId: 'myApp'
      }
    })
  ]
})

/* Track a page view */
// Enable some automatic tracking before page event
analytics.on('initialize:snowplow', ({ instance }) => {
  instance.plugins.snowplow.enableActivityTracking(10, 10)
  instance.plugins.snowplow.enableLinkClickTracking()
})

// Track page
analytics.page()

// or Track page view with additional entities
analytics.page({
  contexts: [
    {
      schema: 'iglu:com.acme/blog_post/jsonschema/1-0-0',
      data: {
        title: 'Re-thinking the structure of event data',
        category: 'Data Insights',
        author: 'Cara Baestlein',
        datePublished: '2020-01-24'
      }
    }
  ]
})

/* Track a custom event */
// Track structured event
analytics.track('playedVideo', {
  category: 'Videos',
  label: 'Fall Campaign',
  value: 42
})

// or Track Self Describing event
analytics.track('selfDescribingEvent', {
  schema: 'iglu:com.acme/video_played/jsonschema/1-0-0',
  data: {
    id: 42,
    title: 'Fall Campaign'
  }
})

// or Track Self Describing event with additional entities
analytics.track('selfDescribingEvent', {
  schema: 'iglu:com.acme/video_played/jsonschema/1-0-0',
  data: {
    id: 42,
    title: 'Fall Campaign',
    videoTimestampInMs: 1104
  },
  contexts: [
    {
      schema: 'iglu:com.acme/product/jsonschema/1-0-0',
      data: {
        id: 'f9cb6cb6-5ca8-47a6-9035-d9c6ac13029e',
        category: 'clothing',
        subCategory: 'socks',
        price: 3.99
      }
    }
  ]
})

// or Track Enchanced Ecommerce event with product context
analytics.track('EnhancedEcommerceProductContext', {
  id: 'P12345',
  name: 'Android Warhol T-Shirt',
  list: 'Search Results',
  brand: 'Google',
  category: 'Apparel/T-Shirts',
  variant: 'Black',
  quantity: 1
})
analytics.track('EnhancedEcommerceAction', {
  action: 'add'
})

/* Identify a visitor */
analytics.identify('user-id-xyz')

```

初始化后 `analytics` 与 `snowplowPlugin` 插件中, 数据会被传送到雪花分析器中 [分析. p](https://getanalytics.io/api/#analyticspage), (中文(简体) ), [分析. track](https://getanalytics.io/api/#analyticstrack),或 [分析 识别](https://getanalytics.io/api/#analyticsidentify) 被调用.

见 [其他执行实例](https://npmcn.com/package/%40analytics/snowplow/#readme-additional-examples) 在您的项目中使用更多细节 .

## 支持的平台

这个 `@analytics/snowplow` 软件包在 [浏览器](https://npmcn.com/package/%40analytics/snowplow/#readme-browser-usage) 财务报告和审定财务报表 [在节点.js的服务器侧](https://npmcn.com/package/%40analytics/snowplow/#readme-server-side-usage)

## 浏览器使用量

Snowplow Analytics客户端浏览器插件与这些分析的api方法合作:

-   **[分析. p](https://getanalytics.io/api/#analyticspage)** - 将页面视图输入斯诺普洛分析
-   **[分析. 重置](https://getanalytics.io/api/#analyticsreset)** - 为雪花分析值重置浏览器存储 cookie 和本地存储
-   **[分析. track](https://getanalytics.io/api/#analyticstrack)** - 追踪自定义事件并发送到斯诺普洛分析
-   **[分析 识别](https://getanalytics.io/api/#analyticsidentify)** - 确定来访者的身份,并将详情发送给斯诺普洛分析公司

### 浏览器 API

```js
import Analytics from 'analytics'
import snowplowPlugin from '@analytics/snowplow'

const analytics = Analytics({
  app: 'awesome-app',
  plugins: [
    // Minimal recommended configuration
    snowplowPlugin({
      name: 'snowplow',
      collectorUrl: 'collector.mysite.com',
      trackerSettings: {
        appId: 'myApp'
      }
    })
  ]
})

```

### 浏览器配置选项

| 选项 | 说明 |
| :-- | :-- |
| `collectorUrl`  
**所需经费** - 绳子 | 雪花收藏器的 URL |
| `name`  
_选项_ - 绳子 | 用于识别此跟踪器实例的名称, 如果使用多个跟踪器实例( “ snowplow' 默认) 则使用 |
| `trackerSettings`  
_选项_ - 对象 | 传递到雪花追踪器的参数图 |
| `trackerSettings.appId`  
_选项_ - 绳子 | 用于识别此应用程序的应用程序 |
| `trackerSettings.platform`  
_选项_ - 绳子 | 跟踪平台 ("web" 默认) |
| `trackerSettings.cookieDomain`  
_选项_ - 绳子 | 要设置 cookie 的域 |
| `trackerSettings.discoverRootDomain`  
_选项_ - 绳子 | 自动发现根域 |
| `trackerSettings.cookieName`  
_选项_ - 绳子 | 饼干的前缀 (")_s (韩语)_" 默认) |
| `trackerSettings.cookieSameSite`  
_选项_ - 绳子 | SameSite cookie 设置( “ 无” 默认) |
| `trackerSettings.cookieSecure`  
_选项_ - 布尔 | 安全饼干设置( 真正的默认) |
| `trackerSettings.encodeBase64`  
_选项_ - 布尔 | 将 JSON 对象编码为 Base64( 真默认) |
| `trackerSettings.respectDoNotTrack`  
_选项_ - 布尔 | 尊重不跟踪( 考虑分析- 插入- do- not- track) (假默认) |
| `trackerSettings.eventMethod`  
_选项_ - 绳子 | 发送事件、获取、 POST、 灯塔的方法( POST 默认) |
| `trackerSettings.bufferSize`  
_选项_ - 数目 | 发送前要缓冲的事件数量(1个默认) |
| `trackerSettings.maxPostBytes`  
_选项_ - 数目 | 发送前的最大大小 POST 或 Beacon( 默认 40000 ) |
| `trackerSettings.crossDomainLinker`  
_选项_ - 绳子 | 函数来配置要添加跨域链接的链接 |
| `trackerSettings.cookieLifetime`  
_选项_ - 数目 | Cookie 寿命( 63072000 默认) |
| `trackerSettings.stateStorageStrategy`  
_选项_ - 绳子 | 使用 cookie 和/或本地仓库( “ cookieAnd LocalStorage ” 默认) |
| `trackerSettings.maxLocalStorageQueueSize`  
_选项_ - 数目 | 在本地存储中缓冲以阻止填充本地存储的最大事件数 (1000 默认) |
| `trackerSettings.resetActivityTrackingOnPageView`  
_选项_ - 布尔 | 决定是否在虚拟页面视图上重设页面ping计时器的旗帜( 真实默认) |
| `trackerSettings.connectionTimeout`  
_选项_ - 布尔 | 超时, 以毫秒计, 在 GET 和 POST 请求之前, 将超时( 5000 默认) ( Snowplow JS 2 |
| `trackerSettings.anonymousTracking`  
_选项_ - 对象 | 启用匿名跟踪功能的旗帜( 假默认) |
| `trackerSettings.anonymousTracking.withSessionTracking`  
_选项_ - 布尔 | 标记以允许是否以匿名跟踪模式继续跟踪会话( 假默认) |
| `trackerSettings.anonymousTracking.withServerAnonymisation`  
_选项_ - 布尔 | 防止收藏家返回和捕获 cookie并捕获 ip 地址的旗帜( 假默认) |
| `trackerSettings.contexts`  
_选项_ - 对象 | 每个事件的自动上下文 |
| `trackerSettings.contexts.webPage`  
_选项_ - 布尔 | 网页上下文,包含页面视图id. (真正的默认) |
| `trackerSettings.contexts.performanceTiming`  
_选项_ - 布尔 | 增加业绩时间安排信息 |
| `trackerSettings.contexts.clientHints`  
_选项_ - 对象 | 添加客户提示信息(Snowplow JS 2.1.5.0+) |
| `trackerSettings.contexts.clientHints.includeHighEntropy`  
_选项_ - 布尔 | 捕获高输入客户端提示(Snowplow JS 2.1.5.0+) |
| `trackerSettings.contexts.gaCookies`  
_选项_ - 布尔 | 添加 gaCookie 信息 |
| `trackerSettings.contexts.geolocation`  
_选项_ - 布尔 | 添加浏览器地理定位信息 |
| `trackerSettings.contexts.optimizelyXSummary`  
_选项_ - 布尔 | 添加浏览器地理定位信息 |
| `trackerSettings.plugins`  
_选项_ - 阵列 | 在跟踪器初始化时包含的额外插件 。 见 [https://docs.snowplowanalytics.com/docs/collection-data/collection- from-own-applications/javascript-tracker/browser-tracker-v3- reference/plugins/ 互联网档案馆的存檔,存档日期2013-12-12](https://docs.snowplowanalytics.com/docs/collecting-data/collecting-from-own-applications/javascript-trackers/browser-tracker/browser-tracker-v3-reference/plugins/) |

## 服务器侧用法

Snowplow Analytics 服务器侧节点.js插件与这些分析的api方法合作:

-   **[分析. p](https://getanalytics.io/api/#analyticspage)** - 将页面视图输入斯诺普洛分析
-   **[分析. track](https://getanalytics.io/api/#analyticstrack)** - 追踪自定义事件并发送到斯诺普洛分析
-   **[分析 识别](https://getanalytics.io/api/#analyticsidentify)** - 确定来访者的身份,并将详情发送给斯诺普洛分析公司

### 服务器侧 API

```js
import Analytics from 'analytics'
import snowplowPlugin from '@analytics/snowplow'

const analytics = Analytics({
  app: 'awesome-app',
  plugins: [
    snowplowPlugin({
      name: 'snowplow',
      collectorUrl: 'collector.mysite.com',
      appId: 'myApp'
    })
  ]
})

```

### 服务器侧配置选项

| 选项 | 说明 |
| :-- | :-- |
| `collectorUrl`  
**所需经费** - 绳子 | 雪花收藏器的 URL |
| `appId`  
**所需经费** - 绳子 | 用于识别此应用程序的应用程序 |
| `name`  
_选项_ - 绳子 | 用于识别此跟踪器实例的名称 (' snowplow' 默认) |
| `protocol`  
_选项_ - 绳子 | “ http” 或“ https” (“ https” 默认) |
| `port`  
_选项_ - 绳子 | 收藏器端口( 80 或 443 默认) |
| `method`  
_选项_ - 绳子 | 发送事件到收集器、 “ post” 或“ get” (“ post” 默认) 的方法 |
| `bufferSize`  
_选项_ - 绳子 | 仅在 N 被缓冲后发送事件 。 GET 请求默认为 1, POST 请求默认为 10 . |
| `retries`  
_选项_ - 绳子 | 追踪器将尝试重发事件的次数 。 默认为 5. |
| `maxSockets`  
_选项_ - 绳子 | 节点.js代理对象 Options 对象调谐性能( 6 默认) |
| `platform`  
_选项_ - 绳子 | 设置平台 [https://bit.ly/302dSQy (英语)](https://bit.ly/302dSQy) ('srv' 默认) |
| `screenResolution`  
_选项_ - 对象 | 如果可用, 设置设备屏幕分辨率 |
| `screenResolution.width`  
_选项_ - 数目 | 屏幕宽度正整数 |
| `screenResolution.height`  
_选项_ - 数目 | 屏幕高度正整数 |
| `viewport`  
_选项_ - 对象 | 如果可用, 设置设备视图 |
| `viewport.width`  
_选项_ - 数目 | 视图宽度正整数 |
| `viewport.height`  
_选项_ - 数目 | 查看高度正整数 |
| `colorDepth`  
_选项_ - 数目 | 正整数, 每像素以比特计 |
| `timezone`  
_选项_ - 绳子 | 设置用户的时区, 如“ 欧洲/ 伦敦 ” |
| `lang`  
_选项_ - 绳子 | Ser 用户的名词 e. global This. 'en' |

## 其他例子

以下是其他执行实例.

服务器侧 ES6

```js
import Analytics from 'analytics'
import snowplowPlugin from '@analytics/snowplow'

const analytics = Analytics({
  app: 'awesome-app',
  plugins: [
    snowplowPlugin({
      name: 'snowplow',
      collectorUrl: 'collector.mysite.com',
      appId: 'myApp'
    })
    // ...other plugins
  ]
})

/* Track a page view */
// Track page
analytics.page()

// or Track page view with additional entities
analytics.page({
  contexts: [
    {
      schema: 'iglu:com.acme/blog_post/jsonschema/1-0-0',
      data: {
        title: 'Re-thinking the structure of event data',
        url:
          'https://snowplowanalytics.com/blog/2020/01/24/re-thinking-the-structure-of-event-data/',
        category: 'Data Insights',
        author: 'Cara Baestlein',
        datePublished: '2020-01-24'
      }
    }
  ]
})

/* Track a custom event */
// Track structured event
analytics.track('playedVideo', {
  category: 'Videos',
  label: 'Fall Campaign',
  value: 42
})

// or Track Self Describing event
analytics.track('selfDescribingEvent', {
  schema: 'iglu:com.acme/video_played/jsonschema/1-0-0',
  data: {
    id: 42,
    title: 'Fall Campaign'
  }
})

// or Track Self Describing event with additional entities
analytics.track('selfDescribingEvent', {
  schema: 'iglu:com.acme/video_played/jsonschema/1-0-0',
  data: {
    id: 42,
    title: 'Fall Campaign',
    videoTimestampInMs: 1104
  },
  contexts: [
    {
      schema: 'iglu:com.acme/product/jsonschema/1-0-0',
      data: {
        id: 'f9cb6cb6-5ca8-47a6-9035-d9c6ac13029e',
        category: 'clothing',
        subCategory: 'socks',
        price: 3.99
      }
    }
  ]
})

// or Track Enchanced Ecommerce event with product context
analytics.track('ScreenView', {
  name: 'Product Page',
  id: 'p-123',
  contexts: [
    {
      schema: 'iglu:com.acme/product/jsonschema/1-0-0',
      data: {
        id: 'f9cb6cb6-5ca8-47a6-9035-d9c6ac13029e',
        category: 'clothing',
        subCategory: 'socks',
        price: 3.99
      }
    }
  ]
})

/* Identify a visitor */
analytics.identify('user-id-xyz', {
  firstName: 'bill',
  lastName: 'murray'
})

```

具有共同JS的服务器端节点.js

如果使用节点,您将想要导入 `.default`

```js
const analyticsLib = require('analytics').default
const snowplowPlugin = require('@analytics/snowplow').default

const analytics = analyticsLib({
  app: 'my-app-name',
  plugins: [
    snowplowPlugin({
      name: 'snowplow',
      collectorUrl: 'collector.mysite.com',
      appId: 'myApp'
    })
  ]
})

/* Track a page view */
// Track page
analytics.page()

// or Track page view with additional entities
analytics.page({
  contexts: [
    {
      schema: 'iglu:com.acme/blog_post/jsonschema/1-0-0',
      data: {
        title: 'Re-thinking the structure of event data',
        url:
          'https://snowplowanalytics.com/blog/2020/01/24/re-thinking-the-structure-of-event-data/',
        category: 'Data Insights',
        author: 'Cara Baestlein',
        datePublished: '2020-01-24'
      }
    }
  ]
})

/* Track a custom event */
// Track structured event
analytics.track('playedVideo', {
  category: 'Videos',
  label: 'Fall Campaign',
  value: 42
})

// or Track Self Describing event
analytics.track('selfDescribingEvent', {
  schema: 'iglu:com.acme/video_played/jsonschema/1-0-0',
  data: {
    id: 42,
    title: 'Fall Campaign'
  }
})

// or Track Self Describing event with additional entities
analytics.track('selfDescribingEvent', {
  schema: 'iglu:com.acme/video_played/jsonschema/1-0-0',
  data: {
    id: 42,
    title: 'Fall Campaign',
    videoTimestampInMs: 1104
  },
  contexts: [
    {
      schema: 'iglu:com.acme/product/jsonschema/1-0-0',
      data: {
        id: 'f9cb6cb6-5ca8-47a6-9035-d9c6ac13029e',
        category: 'clothing',
        subCategory: 'socks',
        price: 3.99
      }
    }
  ]
})

// or Track Enchanced Ecommerce event with product context
analytics.track('ScreenView', {
  name: 'Product Page',
  id: 'p-123',
  contexts: [
    {
      schema: 'iglu:com.acme/product/jsonschema/1-0-0',
      data: {
        id: 'f9cb6cb6-5ca8-47a6-9035-d9c6ac13029e',
        category: 'clothing',
        subCategory: 'socks',
        price: 3.99
      }
    }
  ]
})

/* Identify a visitor */
analytics.identify('user-id-xyz', {
  firstName: 'bill',
  lastName: 'murray'
})

```

在 HTML 中使用

以下是通过unpkg CDN导入的例子. 请注意,这将拉入该套件的最新版本.

```html
<!DOCTYPE html>
<html>
  <head>
    <title>Using @analytics/snowplow in HTML</title>
    <script src="https://unpkg.com/analytics/dist/analytics.min.js"></script>
    <script src="https://unpkg.com/@analytics/snowplow/dist/@analytics/snowplow.min.js"></script>
    <script type="text/javascript">
      /* Initialize analytics */
      var Analytics = _analytics.init({
        app: 'my-app-name',
        plugins: [
          // Minimal recommended configuration
          analyticsSnowplow({
            name: 'snowplow',
            collectorUrl: 'collector.mysite.com',
            trackerSettings: {
              appId: 'myApp'
            }
          })
        ]
      })

      /* Track a page view */
      // Enable some automatic tracking before page event
      analytics.on('initialize:snowplow', ({ instance }) => {
        instance.plugins.snowplow.enableActivityTracking(10, 10)
        instance.plugins.snowplow.enableLinkClickTracking()
      })

      // Track page
      analytics.page()

      // or Track page view with additional entities
      analytics.page({
        contexts: [
          {
            schema: 'iglu:com.acme/blog_post/jsonschema/1-0-0',
            data: {
              title: 'Re-thinking the structure of event data',
              category: 'Data Insights',
              author: 'Cara Baestlein',
              datePublished: '2020-01-24'
            }
          }
        ]
      })

      /* Track a custom event */
      // Track structured event
      analytics.track('playedVideo', {
        category: 'Videos',
        label: 'Fall Campaign',
        value: 42
      })

      // or Track Self Describing event
      analytics.track('selfDescribingEvent', {
        schema: 'iglu:com.acme/video_played/jsonschema/1-0-0',
        data: {
          id: 42,
          title: 'Fall Campaign'
        }
      })

      // or Track Self Describing event with additional entities
      analytics.track('selfDescribingEvent', {
        schema: 'iglu:com.acme/video_played/jsonschema/1-0-0',
        data: {
          id: 42,
          title: 'Fall Campaign',
          videoTimestampInMs: 1104
        },
        contexts: [
          {
            schema: 'iglu:com.acme/product/jsonschema/1-0-0',
            data: {
              id: 'f9cb6cb6-5ca8-47a6-9035-d9c6ac13029e',
              category: 'clothing',
              subCategory: 'socks',
              price: 3.99
            }
          }
        ]
      })

      // or Track Enchanced Ecommerce event with product context
      analytics.track('EnhancedEcommerceProductContext', {
        id: 'P12345',
        name: 'Android Warhol T-Shirt',
        list: 'Search Results',
        brand: 'Google',
        category: 'Apparel/T-Shirts',
        variant: 'Black',
        quantity: 1
      })
      analytics.track('EnhancedEcommerceAction', {
        action: 'add'
      })

      /* Identify a visitor */
      analytics.identify('user-id-xyz')
    </script>
  </head>
  <body>
    ....
  </body>
</html>

```

通过 ES 模块在 HTML 中使用

使用 `@analytics/snowplow` 在无害环境管理模块中.

```html
<!DOCTYPE html>
<html>
  <head>
    <title>Using @analytics/snowplow in HTML via ESModules</title>
    <script>
      // Polyfill process.
      // **Note**: Because `import`s are hoisted, we need a separate, prior <script> block.
      window.process = window.process || { env: { NODE_ENV: 'production' } }
    </script>
    <script type="module">
      import analytics from 'https://unpkg.com/analytics/lib/analytics.browser.es.js?module'
      import analyticsSnowplow from 'https://unpkg.com/@analytics/snowplow/lib/analytics-plugin-snowplow.browser.es.js?module'
      /* Initialize analytics */
      const Analytics = analytics({
        app: 'analytics-html-demo',
        debug: true,
        plugins: [
          // Minimal recommended configuration
          analyticsSnowplow({
            name: 'snowplow',
            collectorUrl: 'collector.mysite.com',
            trackerSettings: {
              appId: 'myApp'
            }
          })
          // ... add any other third party analytics plugins
        ]
      })

      /* Track a page view */
      // Enable some automatic tracking before page event
      analytics.on('initialize:snowplow', ({ instance }) => {
        instance.plugins.snowplow.enableActivityTracking(10, 10)
        instance.plugins.snowplow.enableLinkClickTracking()
      })

      // Track page
      analytics.page()

      // or Track page view with additional entities
      analytics.page({
        contexts: [
          {
            schema: 'iglu:com.acme/blog_post/jsonschema/1-0-0',
            data: {
              title: 'Re-thinking the structure of event data',
              category: 'Data Insights',
              author: 'Cara Baestlein',
              datePublished: '2020-01-24'
            }
          }
        ]
      })

      /* Track a custom event */
      // Track structured event
      analytics.track('playedVideo', {
        category: 'Videos',
        label: 'Fall Campaign',
        value: 42
      })

      // or Track Self Describing event
      analytics.track('selfDescribingEvent', {
        schema: 'iglu:com.acme/video_played/jsonschema/1-0-0',
        data: {
          id: 42,
          title: 'Fall Campaign'
        }
      })

      // or Track Self Describing event with additional entities
      analytics.track('selfDescribingEvent', {
        schema: 'iglu:com.acme/video_played/jsonschema/1-0-0',
        data: {
          id: 42,
          title: 'Fall Campaign',
          videoTimestampInMs: 1104
        },
        contexts: [
          {
            schema: 'iglu:com.acme/product/jsonschema/1-0-0',
            data: {
              id: 'f9cb6cb6-5ca8-47a6-9035-d9c6ac13029e',
              category: 'clothing',
              subCategory: 'socks',
              price: 3.99
            }
          }
        ]
      })

      // or Track Enchanced Ecommerce event with product context
      analytics.track('EnhancedEcommerceProductContext', {
        id: 'P12345',
        name: 'Android Warhol T-Shirt',
        list: 'Search Results',
        brand: 'Google',
        category: 'Apparel/T-Shirts',
        variant: 'Black',
        quantity: 1
      })
      analytics.track('EnhancedEcommerceAction', {
        action: 'add'
      })

      /* Identify a visitor */
      analytics.identify('user-id-xyz')
    </script>
  </head>
  <body>
    ....
  </body>
</html>

```

见 [分析提供者插件的完整列表](https://github.com/DavidWells/analytics#current-plugins) 在主重播时.

## 常见问题

### @analytics/snowplow 是什么？

浏览器和节点的“分析”模块的雪花集成

### 如何安装 @analytics/snowplow？

在项目目录运行 npm install @analytics/snowplow，或使用 pnpm add / yarn add / bun add。

### @analytics/snowplow 支持 TypeScript 吗？

该包的 package\.json 没有声明类型入口。需要类型提示时，可以在 npm 上查找社区维护的 @types/analytics\_\_snowplow 是否存在。

### @analytics/snowplow 支持 ESM 还是 CommonJS？

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

### @analytics/snowplow 可以商用吗？

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

### @analytics/snowplow 的下载量有多少？

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

### @analytics/snowplow 还在维护吗？

最新版本 0\.3\.3 发布于 2022/03/18（4 年前）；至今共发布 11 个版本，其中过去 12 个月发布了 0 个；首次发布于 2020/08/03。发布频率只是参考信号：功能稳定的工具可能很少需要更新，建议结合源码仓库的 issue 和提交记录判断。

