AntDock Web SDK
AntDock Analytics Web SDK - 轻量级浏览器端数据追踪库。
获取 SDK
请使用控制台提供的安装地址或下载包。SDK 尚未在 GitHub 或 npm 公开发布。
安装
控制台的应用「接入」页提供「复制给 AI 的接入说明」,包含当前应用 ID、采集地址、所选平台的代码、SDK 文档及验收要求。可先展开查看,再交给项目中的 AI 编码工具;接入后仍需在「验证接入」确认真实、可查询的事件。网站已有 AntDock 时复用一份安装,不要同时安装 Script 与 npm 两套。需要明确同意的网站保留其真实同意流程,不由 AI 自动同意。
Script 标签 (推荐)
最简单的方式是通过 script 标签引入:
<script defer src="https://your-domain.com/static/tracker.js"
data-app-id="your-website-id">
</script>
配置属性:
data-app-id: 必填,Website IDdata-endpoint: 可选,API 端点 (默认为 script 所在域名)data-auto-track: 可选,是否自动追踪 (默认 true)data-respect-dnt: 可选,遵循 DNT/GPC 隐私信号 (默认 true)data-visitor-storage: 可选,persistent(默认)、session或nonedata-spa-routing: 可选,单页应用的页面划分:auto(默认)、path、hash或url,含义见下文“SPA、归因和隐私控制”data-consent-required: 可选,设为true时等待antdock.setConsent(true),同意前不读取配置、不写入标识、不采集;同意前调用的trackEvent等命令只在页面内存中暂存(最多 100 条),同意后补发,拒绝或撤回即丢弃。撤回同意调用antdock.setConsent(false)。
忽略本浏览器与本地调试
在网站任意页面加 ?antdock=ignore(已有查询参数时用 &antdock=ignore)即可在该域名的 localStorage 写入 antdock_ignore。SDK 在初始化前处理并移除这个参数,保留其他参数、hash 和历史状态;标记存在时不读取配置、不发送数据,也不替换 fetch/XHR。用 ?antdock=track 删除标记并恢复采集。控制台「应用详情 → 接入与设置 → SDK 集成」提供这两个链接。只影响当前浏览器和当前域名,不影响网站其他访客。
localhost、127.0.0.1、::1、*.localhost、*.local 和 file: 地址默认不采集,也不输出控制台信息。确需本地采集时,在 SDK 的 script 标签上加 data-allow-local;忽略标记仍优先。验证接入请使用线上地址;需要排除已有浏览器标记的影响时,用隐身窗口访问线上地址。
DevTools 的 Network 过滤框输入 -domain:<采集域名>(例如 -domain:antdock.com)可隐藏该域名的采集请求。过滤只影响调试面板的显示,不阻止采集;SDK 无法使网络请求从 DevTools 中不可见。
批量发送与当前在线会话
普通事件与保活合并为每 30 秒最多一个请求。首个浏览立即发送;批次达到 batchSize 时提前发送。首个浏览、批次满、显隐切换、配置变更和失败重试是频率上限的例外。后台页面只在离开时发送一次状态,随后停止发送;返回可见或从 BFCache 恢复时立即上报。
在线指此刻有可见页面的会话,多标签页算一个,后台标签页不算。页面可见且 30 分钟内有操作,或有媒体在播放时,每 30 秒保活;连续 30 分钟无操作且无媒体播放时停止保活,恢复操作立即补发。关闭/隐藏使用离开状态;崩溃或网络丢失无法确认离开时,最后一次可见状态 75 秒后过期。在线状态与历史 PV/UV、停留时长心跳分开;不能把这一指标叫作人数。移动端和小程序未发送 presence 的来源仍按浏览/心跳后 5 分钟计在线。
配置只在初始化时拉取,随后采集成功响应的 configVersion 变化才刷新。关闭采集后,本页不再轮询以重新开启;重新开启设置后刷新网站页面。配置和采集连续三次网络失败后,本页停止发送,并在 sessionStorage 暂停后续页面初始化 30 分钟;已收到响应的 429/503 继续遵循 Retry-After,不计作网络失败。退出 Beacon 没有送达确认;断网时通过在线过期处理。
npm 接入
当前提供可直接安装的版本包,尚未发布到公共 npm registry。
// npm install https://antdock.com/static/sdk/antdock-tracker-1.0.17.tgz
import antdock from '@antdock/tracker'
antdock.init({ appId: 'your-website-id', endpoint: 'https://antdock.com' })
自己部署 AntDock 时,将 endpoint 换成统计服务的地址。
页面点击视图
在 AntDock 的“点击分析”中选页面,点击“在页面上查看”。新版脚本接入自动支持;npm 接入请升级到 1.0.6 或之后版本并部署。站点 CSP 需要允许 endpoint 的脚本和 API 请求。
工具按需加载,仅在主动打开私人查看链接的浏览器中显示。链接只读、限定完整页面地址,15 分钟失效。查看期间暂停本次浏览的采集;关闭后刷新网站恢复。普通访客不下载查看工具。
默认根据元素标识或结构匹配当前页面,不还原历史个性化内容。旧记录和无法匹配的元素保留为列表;结构匹配不代表内容相同。对动态列表或 A/B 实验,可选地提供不含个人信息的稳定标识和页面版本:
<html data-antdock-page-version="release-2026-10">
<button data-antdock-key="signup" data-antdock-label="开始注册">开始注册</button>
元素标识须以英文字母开头,最多 64 个英文字母、数字、下划线或连字符,并在页面中唯一;版本最多 80 个英文字母、数字、下划线、连字符、点或冒号。输入值和任意 DOM 文本不会用于采集定位;查看工具可在本地读取当前按钮名称以帮助识别,不会上传它。
手动集成
如需更多控制,可以将 SDK 源码复制到您的项目中:
- 复制
src/目录下的所有文件 - 在您的项目中引入使用
import { AntDockTracker } from './antdock'
const antdock = new AntDockTracker()
antdock.init({
appId: 'your-website-id',
endpoint: 'https://your-domain.com'
})
快速开始
初始化
antdock.init({
appId: 'your-website-id',
endpoint: 'https://your-domain.com',
autoTrack: true, // 自动追踪页面
respectDNT: true, // 默认遵循 DNT 和 GPC
visitorStorage: 'persistent', // 用于识别同一浏览器的新老访客
transport: 'auto', // 默认 fetch-first,可识别服务端失败并重试
enableScroll: true, // 滚动深度追踪
enableError: true, // 错误追踪
enablePerformance: true,// 性能追踪
debug: false // 调试模式
})
页面追踪
// 自动追踪 (默认启用)
// 或手动追踪
antdock.trackPageView('/home')
antdock.trackPageView('/product/detail', {
product_id: '12345'
})
SPA、归因和隐私控制
默认(spaRouting: 'auto')在 origin + pathname 或 Hash 路由(#/page、#!/page)变化时自动记录 PV;目录锚点(#section)、搜索筛选同步到 query 或 Hash 路由里的 ? 参数不重复计算。只按路径划分用 'path',任何 Hash 变化都算新页面用 'hash',确实需要完整 URL 划分的应用使用 'url'。Script 接入用 data-spa-routing 设置。标题在路由更新后的下一任务读取;框架异步获取标题时可关闭 autoTrack,在页面渲染完成后手动记录。
路径统计和完整 URL 点击视图的范围不同:完整 URL 视图只归因到该 URL 有页面浏览记录的会话。同页改变 query/hash 而没有新 PV 的点击仍保留在统计中,但可能无法归因或绘制;若这些变化实际代表不同页面,请显式使用 spaRouting: 'url' 或 'hash'。不把另一个 URL 的画面或分母借来填充热力图。
来源和 UTM 按同一应用、同一会话保存。persistent 访客在标签页间共享首次归因;session 与 none 只保存在当前标签页。新会话不沿用旧来源。事件的 referrer 始终是该页面的 document.referrer;会话首个外部来源另放在 source.referrer,由服务端统一分类。搜索词只使用搜索引擎实际提供的 referrer 参数;隐藏词保持未知。AI 引流在外部来源中显示 ChatGPT、Perplexity 等平台,不推断未提供的来源。
已知的 code、token、password、email 等 URL 参数默认脱敏;路由、普通筛选和 UTM 保留。自定义敏感字段、错误内容、用户身份及业务属性仍需站点依据实际数据配置过滤:
antdock.init({
appId: 'your-website-id', endpoint: 'https://antdock.com',
consentRequired: true,
ignoreUrls: ['/account/reset', /\/internal\//],
ignoreErrors: ['Known noncritical error'],
beforeSend(event) {
delete event.userId
return event // return null to drop; throwing also drops the event
},
})
// 在站点自己的同意管理回调中调用;SDK 不会自动替站点取得同意。
antdock.setConsent(true)
// 撤回后停止采集并清除本浏览器的追踪标识和待发队列。
antdock.setConsent(false)
beforeSend 在事件入队、写入重试存储之前执行。控制台设置不能放宽显式的本地 DNT、访客存储与过滤规则。撤回同意不能撤回此前已发送的数据,也不代替服务端访客删除功能。
配置确认后首个 PV 立即发送;冷启动仍需等待控制台开关,不能保证配置返回前就离开的访问被统计。首次读取配置失败时进行有限退避重试(遵循 Retry-After);连续三次网络错误后暂停,不再轮询;服务端缓存已确认的开关,数据库短时故障期间仍可返回。关页使用 text/plain Beacon,并在拒绝入队时尝试 keepalive fetch,按字节拆批;浏览器共享 keepalive 配额、网络断开和系统直接终止仍可能丢失,Beacon 入队不等于服务端已收到。表单离开使用 pagehide,切换标签页不会被误判为放弃;系统直接杀死页面仍无法保证记录。
事件追踪
antdock.trackEvent('button_click', {
button_id: 'submit'
})
antdock.trackEvent('purchase', {
order_id: 'ORD-12345',
amount: 99.99
})
电商事件
antdock.trackEcommerce({ action: 'purchase', transactionId: 'ORD-12345', revenue: 99.99, currency: 'CNY' })
用户标识
antdock.identify('user_123', {
email: 'user@example.com',
name: '张三'
})
API
init(config)
初始化追踪器。Script、npm 默认导出和 new AntDockTracker() 都会先读取一次控制台设置,其后由采集响应中的版本变化触发同步开关。首次配置加载失败时暂不采集,之后自动重试;无需重新安装 SDK。npm 安装请设置 endpoint 为 AntDock 服务地址。
页面、点击、滚动、错误、性能、请求、媒体和可识别的电商行为默认开启。通用网页无法自动知道真实订单支付和业务用户身份:请分别在业务成功后调用 trackEcommerce 和 identify。
trackPageView(path?, properties?)
追踪页面访问。
trackEvent(name, properties?)
追踪自定义事件。
identify(userId, traits?)
识别用户身份。
reset()
重置用户身份。
flush()
立即发送队列中的事件。
enable() / disable()
启用/禁用追踪。
配置选项
| 选项 | 类型 | 默认值 | 说明 |
|---|---|---|---|
appId |
string | - | 必填,网站 ID |
endpoint |
string | 当前域名 | API 端点 |
autoTrack |
boolean | true | 自动追踪页面 |
enableScroll |
boolean | true | 启用滚动追踪 |
enableError |
boolean | true | 启用错误追踪 |
enablePerformance |
boolean | true | 启用性能追踪 |
batchSize |
number | 50 | 批量大小 |
flushInterval |
number | 30000 | 批次间隔 (ms) |
debug |
boolean | false | 调试模式 |
安装来源
以控制台和本文列出的安装地址为准。
版本与诊断(1.0.15)
release: '2026.10.11' 关联控制台版本记录和私有 Source Map。data-release 用于 Script 安装。INP 默认包含标签结构和输入等待、处理、绘制延迟,不发送元素文本、ID 或输入值。
enableBreadcrumbs: true(Script:data-breadcrumbs="true")开启最多 20 条页面内存操作轨迹,出错时发送路径和 API 状态,不记录请求体、表单值或用户文字。enableLongTasks: true(data-long-tasks="true")在离开页面时发送长任务次数与时长。两项默认关闭,beforeSend 仍在持久化前执行,可丢弃整个事件。
会话回放(1.0.16)
默认关闭,需要在网站设置启用并保存,再在本地设置 enableReplay: true 或 Script 的 data-replay="true";一键复制代码会反映已保存的选择。两处均允许、配置已确认且同意要求满足后,才从采集域名加载独立的 /static/replay-recorder.js。主 SDK 不包含录制库,普通统计不会下载它。
录制与发送前始终遮罩页面文本和输入值,移除 URL、表单值、业务属性与主动资源;可以用 .rr-block 或 data-antdock-private 阻止一个区域及其子节点的录制。图片、画布、视频、音频、内嵌页面、可编辑区域不录制。样式仅保留不含资源 URL、内容表达式与引号文本的部分,复杂页面可能出现样式缺失。CSS 类名和页面路径属于元数据,仍可能含有业务信息,站点应在敏感页面设置 ignoreUrls、遮挡区域或关闭回放。
每个页面文档最多录制 5 分钟 / 约 900 KiB,序列化分段上传,不写浏览器持久存储。网络失败有限重试;关页、超限或无法传输时可能缺段。DNT/GPC、采样、ignoreUrls 和同意控制继续生效;进入忽略页面、重置身份、撤回同意、禁用或销毁立即停止并丢弃未发送内容。beforeSend 面向统计事件,不接收回放;回放采用独立的固定遮罩规则。
网站详情 → 访客与流量 → 会话回放提供播放、暂停和时间定位。回放仅向工作空间所有者、管理员与成员开放,查看/删除进入活动日志,公开报告与 Viewer 不含回放。回放独立保留 7 天;每网站在保留窗口内最多 200 段 / 16 MiB,每工作空间额度由套餐分配(免费版 200 段 / 16 MiB,Starter 400 段 / 32 MiB,Pro 1600 段 / 128 MiB,Team 3200 段 / 256 MiB,Business 6400 段 / 512 MiB,按未压缩数据计),各工作空间额度互不占用,满额停止接收而保留已存内容。后台每 5 分钟清理到期数据。管理员可删除单段,访客删除和应用/工作空间删除也清理回放。
第一方代理需同时转发 /static/replay-recorder.js 和 /api/collect/replay。不要公开导出原始录制,也不要放宽播放器的 sandbox 或网络限制。录制模块基于 rrweb 官方录制与回放 API。
框架接入和 SSR 示例见 frameworks.md。包的 endpoint 必须显式配置;品牌域名与采集域名可分离,无需改变包名。npm 尚未发布时仍使用上述 tgz,不能把未发布的版本写为公共 registry 安装说明。
可选诊断模块(1.0.17)
enableBreadcrumbs 和 enableLongTasks 默认关闭。配置及同意确认后,有对应开关才下载 /static/diagnostics.js;撤回同意、关闭或重新初始化会停止观察并清空轨迹。模块加载完成前的轨迹不回补,下载失败不影响常规统计。自建采集代理需要同时转发这个静态地址。
回放内容保存在服务端私有存储目录 REPLAY_STORAGE_PATH(默认 /app/data/replays),数据库只保存元数据。Docker Compose 已挂载持久目录;私有部署备份与搬迁时需要一起保留这个目录。目录禁止公开访问。云对象存储尚未接入。
Chrome 调试调用栈
浏览器包提供 tracker.js.map,全部 SDK 源文件标为忽略列表。Chrome 默认设置下,控制台错误栈和暂停调用栈折叠 SDK 帧,网站源码位置仍保留;可在 DevTools 开启“显示忽略的帧”查看完整栈。Network 请求仍可见,需要按前面的域名过滤。