# @dotcms/analytics 中文文档

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

版本：26\.11\.2-3
npm 元数据更新时间：2026-11-11T19:27:18.166Z
中文译文更新时间：2026-11-12T20:47:33.228Z
软件包许可：MIT

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

原始 npm 页面：https://www.npmjs.com/package/%40dotcms/analytics
原文对照：https://npmcn.com/package/%40dotcms/analytics/?lang=original
项目主页：https://github.com/dotCMS/core/tree/main/core-web/libs/sdk/analytics/README.md
源码仓库：https://github.com/dotCMS/core#main

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

- 包体积（解压后）：155 kB，62 个文件
- 模块格式：ES Module
- TypeScript 类型：包内自带
- 运行依赖：5 个
- peer 依赖：next \>=13，react ^18 \|\| ^19，@dotcms/uve 26\.11\.2-3
- 首次发布：2024-12-19T21:28:08.293Z
- 最新版本发布：2026-11-11T19:27:17.988Z
- 近 30 天下载量：5078（2026-10-13 至 2026-11-11，npm 官方下载统计）
- 已发布版本数：287（近 12 个月 191 个）

## 中文简介

DotCMS 内容分析的官方JavaScript库.

## 安装

```sh
npm install @dotcms/analytics
```

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

## README

# @ dotcms/分析

内容 Analytics SDK用于在dotCMS驱动的应用程序中跟踪了解内容的事件.

## 入境点

| 导入 | 包含 | 用它当 |
| --- | --- | --- |
| `@dotcms/analytics` | 框架中立引擎: `initializeContentAnalytics`, (中文(简体) ), `getAnalyticsConfig`类型。 没有反应,没有下一个. | 你没有使用React, 或者你想驱动分析自己. |
| `@dotcms/analytics/react` | `DotContentAnalytics` 财务报告和审定财务报表 `useContentAnalytics`,包括Next.js App路由器集成. | 你正在使用反应。 此指南余所用也. |

> **升级?** 套接字根用于再导出 React 绑定, 所以 `@dotcms/analytics` 财务报告和审定财务报表 `@dotcms/analytics/react` 解决了同一模块。 该根现在框架中立. 如果导入 `useContentAnalytics` 或者说 `DotContentAnalytics` 从根起,添加 `/react` 说明者——见 [移民.md](https://npmcn.com/package/%40dotcms/analytics/MIGRATION.md)。 。 。 .

## 我该用哪个SDK版本?

dotCMS SDKs 发布在锁定步骤中,同时发布 dotCMS 本身: 每 `@dotcms/*` 货包船 地点 **完全相同的版本编号** 作为点CMS的发布,它是为(例如:点CMS)而建的 `26.7.14-1` → `@dotcms/client@26.7.14-1`, (中文(简体) ), `@dotcms/react@26.7.14-1`,等等).

**简单的拇指规则:使用匹配您点CMS实例版本的 SDK 版本.**

每次dotCMS发布新版本(反之亦然)时,你不必升级SDK. 大部分的发布都不会改变SDK所依赖的东西,所以一个更老的SDK通常会继续工作 对一个新的点CMS案例,罚款。 但偶尔,释放确实包括一个真正的 打破更改——如果您的 SDK 年龄超过此点, 它会停止正确工作 .

你不需要自己去跟踪它: 你的点CMS实例总是知道最古老的SDK 版本它仍然支持,SDK自动对照它检查自己. 狦琌 使用SDK这个太老了,你会看到一个清晰的警告 在你的控制台上告诉你 升级.

**建议:** 将您的 SDK 与您的点CMS 实例相同的版本连接, 并且只接通 当您升级了点CMS, 或者当控制台告诉你.

> **在LTS发布?** LTS发行版目前没有获得自己匹配的SDK版本. 在解决之前,请使用所出版的SDK版本,以便最接近定期发布 或者在你的LTS版本之前.
> 
> 想要更多关于dotCMS发布和支持窗口如何工作的背景吗? 见 [发布和支持生命周期( S)](https://dev.dotcms.com/docs/release-support-lifecycle)。 。 。 .

## 快速启动

### 1\. 安装

```bash
npm install @dotcms/analytics
```

### 2\. 创建集中配置文件

```javascript
// src/config/analytics.config.js
export const analyticsConfig = {
    siteAuth: process.env.NEXT_PUBLIC_DOTCMS_ANALYTICS_SITE_KEY,
    server: process.env.NEXT_PUBLIC_DOTCMS_ANALYTICS_HOST,
    autoPageView: true,
    debug: process.env.NEXT_PUBLIC_DOTCMS_ANALYTICS_DEBUG === 'true',
    impressions: true,
    clicks: true
};
```

### 3\. 在您的布局中添加自动页面视图跟踪

```jsx
// src/app/layout.js
import { DotContentAnalytics } from '@dotcms/analytics/react';
import { analyticsConfig } from '@/config/analytics.config';

export default function RootLayout({ children }) {
    return (
        <html lang="en">
            <body>
                <DotContentAnalytics config={analyticsConfig} />
                {children}
            </body>
        </html>
    );
}
```

### 4\. 部分中的跟踪事件

```jsx
'use client';

import { useContentAnalytics } from '@dotcms/analytics/react';
import { analyticsConfig } from '@/config/analytics.config';

function ContactForm() {
    const { conversion } = useContentAnalytics(analyticsConfig);

    const handleSubmit = (e) => {
        e.preventDefault();
        // ... submit form logic ...

        // Track conversion ONLY after successful submission
        conversion('form-submit', {
            formName: 'contact-us',
            formType: 'lead-gen'
        });
    };

    return <form onSubmit={handleSubmit}>{/* form fields */}</form>;
}
```

## 理解各组成部分

SDK输出出两个回放原始. 了解他们的作用对正确使用至关重要.

### `<DotContentAnalytics />` -- 自动页面查看跟踪器

-   内容 **仅目的** 将自动跟踪路由更改的页面视图
-   没错 **没有** a 反应上下文提供者
-   没错 **没有** 共享与子组件配置
-   将其放入根版式

### `useContentAnalytics(config)` - 手动跟踪钩

-   用于自定义事件、转换和人工页面浏览
-   **总是需要 `config` 作为参数** - 它不从上下文读取
-   在使用钩子的每个组件中导入集中配置

```jsx
// Every component that tracks events must import config explicitly
import { useContentAnalytics } from '@dotcms/analytics/react';
import { analyticsConfig } from '@/config/analytics.config';

const { track, pageView, conversion } = useContentAnalytics(analyticsConfig);
```

> **为什么要集中配置?** 您必须在每个组件中导入它, 但有一个文件可以防止重复, 并更容易更新 .

## 配置

### 环境变量

把这些添加到您的 `.env.local` 文件 :

```bash
NEXT_PUBLIC_DOTCMS_ANALYTICS_SITE_KEY=YOUR_ANALYTICS_SITE_KEY
NEXT_PUBLIC_DOTCMS_ANALYTICS_HOST=http://localhost:8080
NEXT_PUBLIC_DOTCMS_ANALYTICS_DEBUG=true
```

| 变量 | 说明 |
| --- | --- |
| `NEXT_PUBLIC_DOTCMS_ANALYTICS_SITE_KEY` | DotCMS中的内容分析应用程序的站点认证密钥 |
| `NEXT_PUBLIC_DOTCMS_ANALYTICS_HOST` | 您的点CMS 实例正在运行的 URL |
| `NEXT_PUBLIC_DOTCMS_ANALYTICS_DEBUG` | 设定为 `"true"` 启用动词控制台记录 |

### 配置选项

| 选项 | 类型 | 需求 | 默认 | 说明 |
| --- | --- | --- | --- | --- |
| `siteAuth` | `string` | 对 | \- 说吧 | DotCMS 分析软件的站点认证 |
| `server` | `string` | 对 | \- 说吧 | 您的点CMS 服务器 URL |
| `debug` | `boolean` | 没有 | `false` | 启用动词记录 |
| `autoPageView` | `boolean` | 没有 | `true` | 路由更改时自动跟踪页面视图 |
| `queue` | `QueueConfig | false` | 没有 | 见下文 | 事件分批配置 |
| `impressions` | `ImpressionConfig | boolean` | 没有 | `false` | 内容印象跟踪 |
| `clicks` | `boolean` | 没有 | `false` | 内容点击跟踪( 300ms 节流器) |

### 队列配置

控制事件在发送到服务器前的批量 :

-   **`false`**: 停止排队,立即发送事件
-   **`undefined` (默认)**: 启用默认设置的队列
-   **`QueueConfig` 对象**: 自定义设置

| 选项 | 类型 | 默认 | 说明 |
| --- | --- | --- | --- |
| `eventBatchSize` | `number` | `15` | 每批最大事件- 到达时自动发送 |
| `flushInterval` | `number` | `5000` | 以毫秒为单位的冲程间隔时间 |

如何运作:

-   当 `eventBatchSize` 到达
-   发送待决事件 `flushInterval` 毫秒
-   在页面导航/关闭时自动显示 `visibilitychange` + 键 `pagehide`
-   用途 `navigator.sendBeacon()` 在卸页时可靠发送

```javascript
// Disable queuing (send immediately)
export const analyticsConfig = {
    siteAuth: process.env.NEXT_PUBLIC_DOTCMS_ANALYTICS_SITE_KEY,
    server: process.env.NEXT_PUBLIC_DOTCMS_ANALYTICS_HOST,
    queue: false
};

// Custom queue settings
export const analyticsConfig = {
    siteAuth: process.env.NEXT_PUBLIC_DOTCMS_ANALYTICS_SITE_KEY,
    server: process.env.NEXT_PUBLIC_DOTCMS_ANALYTICS_HOST,
    queue: {
        eventBatchSize: 10,
        flushInterval: 3000
    }
};
```

### 印象跟踪

控制视图中内容能见度的自动跟踪 :

-   **`false` 或者说 `undefined` (默认)**: 已禁用
-   **`true`**: 以默认设置启用
-   **`ImpressionConfig` 对象**: 自定义设置

| 选项 | 类型 | 默认 | 说明 |
| --- | --- | --- | --- |
| `visibilityThreshold` | `number` | `0.5` | 可看见的最小百分比(0.0至1.0) |
| `dwellMs` | `number` | `750` | 以毫秒计的可见时间 |
| `maxNodes` | `number` | `1000` | 要跟踪的最大元素( 性能限制) |

如何运作:

-   标记为 `dotcms-contentlet` 类和 `data-dot-*` 属性
-   性能使用 Intersection 观察 API
-   只当一个元素在所配置的阈值可见并停留时间时起火
-   每个会话的内容片段一个印象( 无重复)
-   在 dotCMS 编辑器模式下自动禁用

```javascript
// Enable with defaults (50% visible, 750ms dwell)
export const analyticsConfig = {
    // ...required fields
    impressions: true
};

// Custom thresholds
export const analyticsConfig = {
    // ...required fields
    impressions: {
        visibilityThreshold: 0.7,
        dwellMs: 1000,
        maxNodes: 500
    }
};
```

### 点击跟踪

控制用户点击内容元素的自动跟踪:

-   **`false` 或者说 `undefined` (默认)**: 已禁用
-   **`true`**: 启用了300ms节流阀

如何运作:

-   音轨点击 `<a>` 财务报告和审定财务报表 `<button>` 内容中的元素
-   内容必须标记为 `dotcms-contentlet` 类和 `data-dot-*` 属性
-   抓取语义属性( E)`href`, (中文(简体) ), `aria-label`, (中文(简体) ), `data-*`)不包括CSS类
-   螺旋快速点击以防止重复( 300ms)
-   在 dotCMS 编辑器模式下自动禁用

**每次点击抓取的数据 :**

-   **内容信息**数字 : `identifier`, (中文(简体) ), `inode`, (中文(简体) ), `title`, (中文(简体) ), `content_type`
-   **元素信息**数字 : `text`, (中文(简体) ), `type` (a/按钮), `id`, (中文(简体) ), `class`, (中文(简体) ), `href`, (中文(简体) ), `attributes`
-   **职位信息**数字 : `viewport_offset_pct`, (中文(简体) ), `dom_index`

您可以使用 `data-*` hTML 中的属性 :

```html
<a
    href="/signup"
    id="cta-signup"
    data-category="primary-cta"
    data-campaign="summer-sale"
    aria-label="Sign up for free trial">
    Start Free Trial
</a>

<button data-action="download" data-file-type="pdf" data-category="lead-magnet">
    Download Whitepaper
</button>
```

## 核心概念

### 事件类型

SDK发送四种类型的事件,由 `event_type`数字 :

| 事件类型 | 触发 | 要求数 |
| --- | --- | --- |
| `pageview` | 路由更改时自动或通过 `pageView()` | `autoPageView: true` 或人工调用 |
| `content_impression` | 当一个内容在视图中可见时 | `impressions` 配置已启用 |
| `content_click` | 当用户点击内容列表中的链接/按钮时 | `clicks` 配置已启用 |
| `conversion` | 明确通过 `conversion()` 在商业诉讼成功之后 | 手动呼叫 |

### 页视图

这个 `pageView()` 方法跟踪页面导航事件。 这个 **自动丰富** 活动地址:

-   **页面数据**: URL、标题、参考者、路径、协议、搜索参数
-   **设备数据**: 屏幕分辨率、视图大小、语言、用户代理
-   **UTM 参数**:运动跟踪数据(来源、中期、运动、术语、内容)
-   **A. 背景情况**: 站点密钥、会话ID、用户ID、时间戳

您可以选择通过将发送的自定义数据 **此外,还有:** 所有自动浓缩.

### 转换跟踪

这个 `conversion()` 方法跟踪用户转换(购买,下载,签名等).

**仅在成功动作或完成目标后进行音轨转换.** 跟踪点击或尝试(在成功之前)会降低其作为转换指标的价值。 音轨时间 :

-   采购完成,付款得到确认
-   下载已成功完成
-   提交注册表并创建账户
-   任何商业目标都已经实现

### 自定义事件

这个 `track()` 方法跟踪任何自定义用户动作,并带有独特的事件名称和可选属性.

-   `eventName` 无法是 `"pageview"` 或者说 `"conversion"` (保留)
-   使用描述性名称 : `"button-click"`, (中文(简体) ), `"form-submit"`, (中文(简体) ), `"video-play"`等 (中文(简体) ).

### 会议

-   30分钟无活动暂停
-   协调世界时午夜恢复
-   如果 UTM 活动更改新会话

### 身份

-   匿名用户标识在会话中持续
-   存储于 `dot_analytics_user_id`

## 用法实例

### 自动页面视图跟踪

添加 `DotContentAnalytics` 到您的根布局。 不需要额外的代码 -- -- 每一路由更改都跟踪页面浏览.

```jsx
// src/app/layout.js
import { DotContentAnalytics } from '@dotcms/analytics/react';
import { analyticsConfig } from '@/config/analytics.config';

export default function RootLayout({ children }) {
    return (
        <html lang="en">
            <body>
                <DotContentAnalytics config={analyticsConfig} />
                {children}
            </body>
        </html>
    );
}
```

### 手动带有自定义数据的页面视图

```jsx
'use client';

import { useEffect } from 'react';
import { useContentAnalytics } from '@dotcms/analytics/react';
import { analyticsConfig } from '@/config/analytics.config';

function BlogPost({ post }) {
    const { pageView } = useContentAnalytics(analyticsConfig);

    useEffect(() => {
        pageView({
            contentType: 'blog',
            category: post.category,
            author: post.author,
            wordCount: post.wordCount
        });
    }, []);

    return <article>{/* post content */}</article>;
}
```

### 自定义事件跟踪

```jsx
'use client';

import { useContentAnalytics } from '@dotcms/analytics/react';
import { analyticsConfig } from '@/config/analytics.config';

function CallToAction() {
    const { track } = useContentAnalytics(analyticsConfig);

    const handleClick = () => {
        track('cta-click', {
            button: 'Buy Now',
            location: 'hero-section',
            price: 299.99
        });
    };

    return <button onClick={handleClick}>Buy Now</button>;
}
```

### 转换跟踪(真实世界实例)

此示例基于 [Next.js 示例应用程序](https://github.com/dotCMS/core/tree/main/examples/nextjs)数字 :

```jsx
'use client';

import { useState } from 'react';
import { useContentAnalytics } from '@dotcms/analytics/react';
import { analyticsConfig } from '@/config/analytics.config';

export default function ContactUs({ description }) {
    const [isSubmitting, setIsSubmitting] = useState(false);
    const [isSuccess, setIsSuccess] = useState(false);
    const { conversion } = useContentAnalytics(analyticsConfig);

    const handleSubmit = (e) => {
        e.preventDefault();
        setIsSubmitting(true);

        // Simulate form submission
        setTimeout(() => {
            setIsSuccess(true);

            // Track conversion ONLY after successful submission
            conversion('form-submit', {
                formName: 'contact-us',
                formType: 'lead-gen'
            });
        }, 3000);
    };

    return (
        <form onSubmit={handleSubmit}>
            {/* form fields */}
            <button type="submit" disabled={isSubmitting}>
                {isSubmitting ? 'Submitting...' : 'Submit'}
            </button>
        </form>
    );
}
```

### 电子商务

```jsx
'use client';

import { useContentAnalytics } from '@dotcms/analytics/react';
import { analyticsConfig } from '@/config/analytics.config';

function CheckoutButton({ product, quantity }) {
    const { conversion } = useContentAnalytics(analyticsConfig);

    const handlePurchase = async () => {
        // Process payment...
        const result = await processPayment(product, quantity);

        if (result.success) {
            // Track conversion ONLY after confirmed payment
            conversion('purchase', {
                value: product.price * quantity,
                currency: 'USD',
                productId: product.sku,
                category: product.category
            });
        }
    };

    return <button onClick={handlePurchase}>Complete Purchase</button>;
}
```

## API 参考

### `<DotContentAnalytics />`

在路由变化中自动进行页面查看跟踪的响应组件 .

```typescript
interface DotContentAnalyticsProps {
    config: DotCMSAnalyticsConfig;
}
```

在您的根布局中放置一次 。 将内部跟踪器包入 `<Suspense>` next.js App 路由器兼容性.

### `useContentAnalytics(config)`

反应钩子,返回跟踪方法. **总是需要配置为参数.**

```typescript
function useContentAnalytics(config: DotCMSAnalyticsConfig): DotCMSAnalytics;

interface DotCMSAnalytics {
    /** Track a page view with optional custom data */
    pageView: (customData?: Record<string, unknown>) => void;

    /** Track a custom event (eventName cannot be "pageview" or "conversion") */
    track: (eventName: string, properties?: Record<string, unknown>) => void;

    /** Track a conversion after a successful business action */
    conversion: (name: string, options?: Record<string, unknown>) => void;
}
```

### `DotCMSAnalyticsConfig`

```typescript
interface DotCMSAnalyticsConfig {
    server: string;
    siteAuth: string;
    debug?: boolean;
    autoPageView?: boolean;
    queue?: QueueConfig | false;
    impressions?: ImpressionConfig | boolean;
    clicks?: boolean;
}

interface QueueConfig {
    eventBatchSize?: number;
    flushInterval?: number;
}

interface ImpressionConfig {
    visibilityThreshold?: number;
    dwellMs?: number;
    maxNodes?: number;
}
```

### 事件有效载荷结构

#### 页面查看事件

当你打电话 `pageView(customData?)`SDK发送:

```typescript
{
    context: {
        site_key: string;          // Your site key
        session_id: string;        // Current session ID
        user_id: string;           // Anonymous user ID
        device: {
            screen_resolution: string;
            language: string;
            viewport_width: string;
            viewport_height: string;
        }
    },
    events: [{
        event_type: "pageview",
        local_time: string,        // ISO 8601 timestamp with timezone
        data: {
            page: {                // Captured automatically
                url: string;
                title: string;
                referrer: string;
                path: string;
                doc_host: string;
                doc_protocol: string;
                doc_search: string;
                doc_hash: string;
                doc_encoding: string;
            },
            utm?: {                // Captured automatically (if present in URL)
                source: string;
                medium: string;
                campaign: string;
                term: string;
                content: string;
            },
            custom?: {             // Your optional data from pageView(customData)
                // Any properties you pass
            }
        }
    }]
}
```

#### 自定义事件

当你打电话 `track(eventName, properties)`数字 :

```typescript
{
    context: { /* same as above */ },
    events: [{
        event_type: string,        // Your custom event name
        local_time: string,
        data: {
            custom: {
                // Your properties object
            }
        }
    }]
}
```

#### 转换事件

当你打电话 `conversion(name, options)`数字 :

```typescript
{
    context: { /* same as above */ },
    events: [{
        event_type: "conversion",
        local_time: string,
        data: {
            conversion: {
                name: string;      // Your conversion name
            },
            page: {
                url: string;
                title: string;
            },
            custom?: {             // Your optional data from options parameter
                // All properties from options
            }
        }
    }]
}
```

#### 单击事件

当点击跟踪被启用,而用户点击内容列表元素时:

```json
{
    "content": {
        "identifier": "abc123",
        "inode": "xyz789",
        "title": "Product Page",
        "content_type": "Page"
    },
    "element": {
        "text": "Start Free Trial",
        "type": "a",
        "id": "cta-signup",
        "class": "btn btn-primary",
        "href": "/signup",
        "attributes": [
            "data-category:primary-cta",
            "data-campaign:summer-sale",
            "aria-label:Sign up for free trial"
        ]
    },
    "position": {
        "viewport_offset_pct": 45.2,
        "dom_index": 2
    }
}
```

## 在兜帽男的下面

### 存储密钥

| 密钥 | 目的 |
| --- | --- |
| `dot_analytics_user_id` | 匿名用户标识符(遍历会话) |
| `dot_analytics_session_id` | 当前会话编号 |
| `dot_analytics_session_utm` | B. 会议UTM活动数据 |
| `dot_analytics_session_start` | 会话开始时间戳 |

### 编辑器检测

分析器在botCMS通用视觉编辑器(UVE)内部时会自动被禁用. 没有以编辑器模式发送事件 .

### 终点

所有活动均通过 `POST` 改为:

```
{server}/api/v1/analytics/content/event
```

何处 `{server}` 这是 `server` 从您的配置值.

## 调试出问题( T)

### 启用调试模式

设定 `debug: true` 在您的配置中看到浏览器控制台上的动词记录.

### 校验网络标签中的事件

1.  打开浏览器 DevTools > 网络标签
2.  过滤器由 `/api/v1/analytics/content/event`
3.  在应用程序中执行动作
4.  检查要求有效载荷查看所捕获的数据

### 检查存储

打开浏览器 DevTools > 应用程序 > 本地存储并查找:

-   `dot_analytics_user_id`
-   `dot_analytics_session_id`
-   `dot_analytics_session_utm`
-   `dot_analytics_session_start`

### 共同问题

**事情没有发生?**

-   校验 `siteAuth` 财务报告和审定财务报表 `server` 在配置中正确
-   启用 `debug: true` 查看控制台日志
-   确保环境变量设置在 `.env.local` (更改后重新启动 dev 服务器)
-   检查变量名称的起始 `NEXT_PUBLIC_`
-   分析器在 DotCMS 编辑器模式下自动失效 -- 测试在预览或发布模式中

**排队不冲?**

-   检查 `eventBatchSize` - 门槛可能尚未达到
-   校验 `flushInterval` 适合您使用的情况
-   页面导航/关闭中自动擦出的事件 `visibilitychange`

**届会没有持续?**

-   检查浏览器是否启用本地Storage
-   校验没有浏览器扩展封存

## 支助

我们提供多个渠道来获得帮助 点CMS分析SDK:

-   **GitHub 问题**: 对于错误报告和特性请求,请 [打开一个问题](https://github.com/dotCMS/core/issues/new/choose) 在 GitHub 仓库中.
-   **社区论坛**: 加入我们 [社区讨论](https://community.dotcms.com/) 以提问和分享解决方案.
-   **叠叠流**:使用标签 `dotcms-analytics` 当张贴问题.
-   **企业支助**:企业客户可通过 [dotCMS 支持门户](https://www.dotcms.com/support)。 。 。 .

在报告问题时,请包括:

-   您使用的 SDK 版本
-   框架/图书馆版本(如果适用)
-   最小复制步骤
-   预期与实际行为

## 捐款

GitHub 拖取请求是向dotCMS提供代码的首选方法. 我们欢迎对DotCMS分析SDK的贡献! 如果你想作出贡献,请遵循这些步骤:

1.  叉子存储器 [点/核心](https://github.com/dotCMS/core)
2.  创建特性分支( E)`git checkout -b feature/amazing-feature`(中文(简体) )
3.  提交更改( E)`git commit -m 'Add some amazing feature'`(中文(简体) )
4.  推向分行(`git push origin feature/amazing-feature`(中文(简体) )
5.  打开拉请求

请确保您的代码遵循现有的样式并包含适当的测试 .

## 许可证发放

点CMS 可在 [业务来源许可证1.1(BSL)](https://www.dotcms.com/bsl) 或商业执照.

在BSL下,DotCMS可以免费由个人开发商,小企业或机构在总资金中低于5M美元,也可以由非生产环境下的更大型组织使用. BSL每次发布都会在其发布后四年自动转换为GPL v3. 全文和问题,访问 [dotcms.com/bsl (英语)](https://www.dotcms.com/bsl) 财务报告和审定财务报表 [dotcms.com/bsl-faq (英语)](https://www.dotcms.com/bsl-faq)。 。 。 .

大型组织的生产用途,以及管理下的云、服务级协议、支助和企业能力,均根据点集管理系统的商业许可证提供。 关于商业计划、特点和支助选项的详情,见 [dotcms.com/定价](https://www.dotcms.com/pricing)。 。 。 .

## 常见问题

### @dotcms/analytics 是什么？

DotCMS 内容分析的官方JavaScript库\.

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

在项目目录运行 npm install @dotcms/analytics，或使用 pnpm add / yarn add / bun add。它还需要宿主项目提供 peer 依赖：@dotcms/uve（26\.11\.2-3）。npm 7 及以上与 pnpm 8 及以上默认会自动安装必需的 peer 依赖，Yarn 需要手动安装。

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

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

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

以 ES Module 形式发布，推荐使用 import 引入。在 CommonJS 项目中，Node\.js 20\.19\+ / 22\.12\+ 可以直接 require\(\) 不含顶层 await 的 ES Module，更早的版本需要改用动态 import\(\)。

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

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

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

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

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

最新版本 26\.11\.2-3 发布于 2026/11/12（1 天前）；至今共发布 287 个版本，其中过去 12 个月发布了 191 个；首次发布于 2024/12/20。发布频率只是参考信号：功能稳定的工具可能很少需要更新，建议结合源码仓库的 issue 和提交记录判断。

