Web 插件
Web 插件需显式启用,可通过 autocapture 配置或 plugins 注册。按需要选择插件,避免在同一目标上重复记录点击或页面事件。
使用前
- 自动采集插件默认关闭,启用后仍受授权和采集策略约束。
- 内置插件不采集表单输入值;路径、标题和自定义属性仍需审查。
- 插件异常会被隔离,但自定义插件仍需控制同步计算量,避免阻塞页面。
Web SDK 的 pagePrivacy 对显式传入和后续 registerPlugin() 注册的插件使用同一实例策略。 页面标题默认省略;路径和来源页默认保留,可分别清洗或关闭。归因插件的首次/最近落地页和来源页存储副本也受控制。 完整配置、路由模板与旧缓存边界见页面地址与隐私。
预设插件组合
可以按页面、点击、渠道和稳定性需求选择预设组合:
页面与稳定性组合
createWebBetaPluginPack 组合页面、生命周期、归因和可靠性插件。各插件仍遵守自身的 Consent、Policy 和 Tracking Plan 门控;它不会自动启用 DOM 点击采集或录屏。接入前应按下方插件清单确认所需能力和数据范围:
import { TrackBusinessSDK } from '@track-business/sdk-web';
import { createWebBetaPluginPack } from '@track-business/sdk-web/plugins/presets';
const sdk = TrackBusinessSDK.create({
endpoint: 'https://collector.example.com/v1/events/batch',
projectKey: 'web-public-project-key',
plugins: createWebBetaPluginPack({
growth: { attribution: { mode: 'first_touch' } },
}),
});页面与点击采集
需要采集单页应用的页面浏览、文档活动状态和受控点击时使用:
import { createWebAutocapturePluginPack } from '@track-business/sdk-web/plugins/presets';
const plugins = createWebAutocapturePluginPack({
page: true,
lifecycle: true,
domClick: { selectorAllowlist: ['[data-track-id]'] }, // 必须指定选择器白名单
});这只注册插件,不会自动提升 Consent。页面与生命周期、DOM 点击插件默认要求 STANDARD;默认 Consent 为 GRANTED + MINIMAL,需在宿主/CMP 确认授权后调用 grantConsent('STANDARD')。选择器必须由接入方控制范围,SDK 不会拒绝 '*' 这类宽选择器。
按场景组合
import {
createWebContentPluginPack,
createWebGrowthPluginPack,
createWebLifecyclePluginPack,
createWebReliabilityPluginPack,
} from '@track-business/sdk-web/plugins/presets';
const plugins = [
// 增长投放场景:包含 utm 渠道归因与落地页上下文
...createWebGrowthPluginPack({
attribution: { mode: 'first_touch' },
}),
// 内容/电商场景:显式目标曝光与业务交互
...createWebContentPluginPack({
exposure: {
targets: [{ selector: '[data-track-exposure]', exposureId: 'home_hero' }],
},
interaction: {
targets: [{ selector: '[data-track-action]', action: 'nav_click' }],
},
}),
// 稳定性场景:包含 JS 异常、Web Vitals 与性能摘要
...createWebReliabilityPluginPack(),
// 文档活动状态与页面停留片段;不定义 Session 开始/结束
...createWebLifecyclePluginPack(),
];插件与事件
下表列出插件产生的事件及采集范围:
| 插件名称 (Manifest) | 工厂函数入口 | 触发标准事件 | 采集语义与安全约束 |
|---|---|---|---|
web-spa-page | createWebSpaPagePlugin | $pageview | 记录单页路由切换;页面地址按 pagePrivacy 配置处理 |
web-page-leave | createWebPageLeavePlugin | $page_leave | 页面隐藏/卸载时发出,记录页面停留片段 |
web-stay | createWebStayPlugin | $web_stay | 页面处于可见且活跃状态的实际有效时长 |
web-page-load | createWebPageLoadPlugin | $page_load | Navigation Timing API 性能指标摘要 |
web-scroll | createWebScrollPlugin | $scroll | 页面滚动深度有界阈值(25%、50%、75%、100%) |
web-dom-click | createWebDomClickPlugin | $element_click | 受控点击:只处理命中 selectorAllowlist 的元素,不读文本;选择器范围由接入方审查 |
web-rage-click | createWebRageClickPlugin | $web_rage_click | 短时间内连续点击异常检测(默认关闭) |
web-exposure | createWebExposurePlugin | $sdk_exposure | 基于 IntersectionObserver 监听指定视口曝光目标 |
web-interaction | createWebInteractionPlugin | $sdk_interaction | 显式声明的业务语义交互动作 |
web-attribution | createWebAttributionPlugin | $sdk_attribution | 白名单 Campaign 参数识别与跨会话存储 |
web-lifecycle | createWebLifecyclePlugin | $sdk_lifecycle | 文档活动状态;字段为 $lifecycle_state 与 $lifecycle_scope,不定义 Analytics Session 边界 |
web-vitals | createWebVitalsPlugin | $sdk_web_vital | 核心体验指标:LCP、INP、CLS 采集 |
web-performance | createWebPerformancePlugin | $sdk_performance | Paint、首屏渲染与静态资源聚合耗时 |
web-exception | createWebExceptionPlugin | $sdk_exception | 捕获未处理异常;有限清洗常见邮箱、Bearer、凭据键名和 URL,不保证覆盖所有敏感内容 |
web-network-performance | createWebNetworkPerformancePlugin | $sdk_network_performance | Resource Timing 网络请求耗时统计 |
web-network-enrichment | createWebNetworkEnrichmentPlugin | — (Context 扩展) | 注入 context.network.online;有效连接类型、RTT 与下行速率仅在显式启用后读取,且受浏览器支持限制 |
常用插件配置
元素曝光 (web-exposure)
曝光插件使用浏览器的 IntersectionObserver 监听显式配置的目标,最多读取前 50 个配置项。每个选择器每轮最多检查前 1,024 个匹配元素,同时观察最多 64 个。DOM 变化会合并处理,动态元素可能稍后开始计时。长列表和虚拟滚动可在业务确认元素曝光时显式记录。
<div id="hero-banner" data-track-exposure></div>import { createWebExposurePlugin } from '@track-business/sdk-web/plugins';
createWebExposurePlugin({
targets: [{ selector: '#hero-banner', exposureId: 'home_hero_banner' }],
minVisibleMs: 500, // 元素持续可见至少 500 毫秒才计入有效曝光
threshold: 0.5, // 视口内可见面积比例必须 >= 50%
});交互语义 (web-interaction)
用于捕获关键业务控件动作。仅接受显式配置的语义目标,不会读取控件文本或表单输入:
import { createWebInteractionPlugin } from '@track-business/sdk-web/plugins';
createWebInteractionPlugin({
targets: [
{
selector: '[data-action="checkout_pay"]',
action: 'checkout_submit',
elementType: 'primary_button',
screenName: 'CheckoutPage',
},
],
});渠道来源 (web-attribution)
页面离开 (web-page-leave)
页面隐藏、切换路由或离开文档时生成 $page_leave。关闭标签时浏览器可能中止后续工作,事件能否送达仍取决于 Outbox 与浏览器生命周期,不构成送达保证:
import { createWebPageLeavePlugin } from '@track-business/sdk-web/plugins';
createWebPageLeavePlugin({
// 默认记录页面可见期间的停留片段,无需配置时长开关。
});表单、下载与可见性
针对特定业务场景,SDK 还提供 3 个细分元数据插件;它们不会读取输入值、文件正文或 DOM 文本,但会生成少量事件元数据。宿主应审查选择器、ID 和页面 URL:
| 插件名称 | 触发事件 | 采集数据范围 | 采集边界 |
|---|---|---|---|
web-form | $web_form_submit | 当前页面 URL、表单标签及可选的表单 ID 哈希;仅监听命中选择器的 submit | 不读取表单控件值或表单文本 |
web-download | $web_download | 当前页面 URL、链接标签及可选的下载文件名哈希;只处理含 download 属性且命中选择器的链接 | 不读取文件正文、磁盘数据或下载扩展名 |
web-visibility | $web_visibility | 目标标签、当前页面 URL、可见比例;每个元素每次插件运行最多一次 | 不读取 DOM 文本;默认可见比例 50%,不设持续时间门槛 |
按场景选择插件
根据业务需要选择插件:
| 业务场景 | 推荐配置插件组合 | 预期产生核心事件 |
|---|---|---|
| 内容资讯 / 社区 | web-spa-page + web-stay + web-scroll | $pageview、$web_stay、$scroll |
| 电商与商品交易 | web-spa-page + web-exposure + web-interaction | $pageview、$sdk_exposure、$sdk_interaction |
| 获客投放落地页 | web-spa-page + web-attribution + web-page-leave | $pageview、$sdk_attribution、$page_leave |
| 后台管理系统 | web-spa-page + web-exception + web-vitals | $pageview、$sdk_exception、$sdk_web_vital |
体积与 Tree-shaking 说明
Web 包提供 ESM 导出并标记 sideEffects: false,支持使用方构建工具进行 Tree-shaking。实际移除效果取决于导入入口、构建器配置和宿主打包结果;请用生产构建产物分析确认体积,不保证未调用的每个工厂及其依赖都必然完全剔除。
Web Vitals 统计口径
$sdk_web_vital 的 $report_version 为 2.0。同一 $metric_id 的新观测会增加 $revision;统计时按项目和指标 ID 取最高修订,不要把累计的 $value 相加。$unit 对 CLS 为 dimensionless,对 FCP、LCP、INP 为 ms;$value_clamped 标记截断值,不宜按精确测量参与分布统计。
$document_id 关联文档,$observation_id 关联一次观测;$navigation_type 描述导航类型,$algorithm_version 标识指标算法。$measurement_scope 区分完整文档、往返缓存恢复和局部采集。授权晚于页面启动或采集重启时,样本标为 collection-segment,不应并入完整文档分布。浏览器不支持相应观测能力时,指标会缺失,不能按零值统计。