@feiyangdefeng/sdk 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +389 -0
- package/dist/collector/auto-tracker.d.ts +45 -0
- package/dist/collector/auto-tracker.d.ts.map +1 -0
- package/dist/collector/click-tracker.d.ts +38 -0
- package/dist/collector/click-tracker.d.ts.map +1 -0
- package/dist/collector/custom-tracker.d.ts +10 -0
- package/dist/collector/custom-tracker.d.ts.map +1 -0
- package/dist/collector/error-tracker.d.ts +43 -0
- package/dist/collector/error-tracker.d.ts.map +1 -0
- package/dist/collector/exposure-tracker.d.ts +60 -0
- package/dist/collector/exposure-tracker.d.ts.map +1 -0
- package/dist/collector/input-tracker.d.ts +30 -0
- package/dist/collector/input-tracker.d.ts.map +1 -0
- package/dist/collector/performance-tracker.d.ts +48 -0
- package/dist/collector/performance-tracker.d.ts.map +1 -0
- package/dist/collector/view-tracker.d.ts +38 -0
- package/dist/collector/view-tracker.d.ts.map +1 -0
- package/dist/core/config.d.ts +27 -0
- package/dist/core/config.d.ts.map +1 -0
- package/dist/core/event-bus.d.ts +30 -0
- package/dist/core/event-bus.d.ts.map +1 -0
- package/dist/core/request.d.ts +35 -0
- package/dist/core/request.d.ts.map +1 -0
- package/dist/core/storage.d.ts +67 -0
- package/dist/core/storage.d.ts.map +1 -0
- package/dist/core/utils.d.ts +61 -0
- package/dist/core/utils.d.ts.map +1 -0
- package/dist/extension/behavior-analysis.d.ts +41 -0
- package/dist/extension/behavior-analysis.d.ts.map +1 -0
- package/dist/extension/network-interceptor.d.ts +32 -0
- package/dist/extension/network-interceptor.d.ts.map +1 -0
- package/dist/extension/plugin-manager.d.ts +32 -0
- package/dist/extension/plugin-manager.d.ts.map +1 -0
- package/dist/extension/session-replay.d.ts +80 -0
- package/dist/extension/session-replay.d.ts.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.es.js +8443 -0
- package/dist/index.es.js.map +1 -0
- package/dist/index.iife.js +3 -0
- package/dist/index.iife.js.map +1 -0
- package/dist/index.umd.js +3 -0
- package/dist/index.umd.js.map +1 -0
- package/dist/processor/compressor.d.ts +16 -0
- package/dist/processor/compressor.d.ts.map +1 -0
- package/dist/processor/data-processor.d.ts +36 -0
- package/dist/processor/data-processor.d.ts.map +1 -0
- package/dist/processor/deduplicator.d.ts +29 -0
- package/dist/processor/deduplicator.d.ts.map +1 -0
- package/dist/processor/sampler.d.ts +16 -0
- package/dist/processor/sampler.d.ts.map +1 -0
- package/dist/tracker.d.ts +111 -0
- package/dist/tracker.d.ts.map +1 -0
- package/dist/transport/batch-sender.d.ts +80 -0
- package/dist/transport/batch-sender.d.ts.map +1 -0
- package/dist/transport/offline-storage.d.ts +60 -0
- package/dist/transport/offline-storage.d.ts.map +1 -0
- package/dist/transport/retry-handler.d.ts +29 -0
- package/dist/transport/retry-handler.d.ts.map +1 -0
- package/dist/transport/sender.d.ts +27 -0
- package/dist/transport/sender.d.ts.map +1 -0
- package/package.json +70 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Tracker SDK Contributors
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,389 @@
|
|
|
1
|
+
# 前端全埋点SDK
|
|
2
|
+
|
|
3
|
+
一套完整的前端全埋点SDK,支持自动埋点、错误监控、性能监控、会话回放等功能,具备高性能、高可靠、可扩展和强兼容性。
|
|
4
|
+
|
|
5
|
+
## 特性
|
|
6
|
+
|
|
7
|
+
- ✅ **自动埋点**: 页面浏览、点击事件、元素曝光自动采集
|
|
8
|
+
- ✅ **错误监控**: JavaScript错误、资源加载错误、Promise错误监控
|
|
9
|
+
- ✅ **性能监控**: 页面加载性能、资源加载性能、长任务监控
|
|
10
|
+
- ✅ **会话回放**: DOM快照、用户交互记录
|
|
11
|
+
- ✅ **用户行为分析**: PV/UV统计、停留时长、访问路径
|
|
12
|
+
- ✅ **批量上报**: 数据批量上报,减少网络请求
|
|
13
|
+
- ✅ **离线存储**: 网络异常时数据离线存储,网络恢复后自动上报
|
|
14
|
+
- ✅ **失败重试**: 指数退避重试策略
|
|
15
|
+
- ✅ **数据采样**: 支持配置采样率,减少数据量
|
|
16
|
+
- ✅ **插件系统**: 基于事件总线的插件机制,支持网络请求拦截插件
|
|
17
|
+
- ✅ **网络请求拦截**: 自动拦截 fetch 和 XMLHttpRequest,记录请求和响应信息(包括响应体)
|
|
18
|
+
- ✅ **多环境支持**: 支持浏览器和Node.js环境
|
|
19
|
+
|
|
20
|
+
## 安装
|
|
21
|
+
|
|
22
|
+
```bash
|
|
23
|
+
pnpm add @tracker/sdk
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
## 文档
|
|
27
|
+
|
|
28
|
+
- [📖 详细使用说明](docs/USAGE.md) - 完整的使用文档,包含所有API、配置选项、使用场景和最佳实践
|
|
29
|
+
- [🧪 测试文档](tests/README.md) - 测试覆盖和测试说明
|
|
30
|
+
|
|
31
|
+
## 快速开始
|
|
32
|
+
|
|
33
|
+
### 基础使用
|
|
34
|
+
|
|
35
|
+
```typescript
|
|
36
|
+
import Tracker from '@tracker/sdk';
|
|
37
|
+
|
|
38
|
+
// 方式1: 设置服务器地址(推荐)
|
|
39
|
+
const tracker = new Tracker({
|
|
40
|
+
appId: 'your-app-id',
|
|
41
|
+
serverUrl: 'https://api.example.com/track',
|
|
42
|
+
enableAutoTrack: true,
|
|
43
|
+
enableErrorTrack: true,
|
|
44
|
+
enablePerformanceTrack: true
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
// 方式2: 不设置服务器地址(仅本地收集,数据保存到离线存储)
|
|
48
|
+
const offlineTracker = new Tracker({
|
|
49
|
+
appId: 'your-app-id',
|
|
50
|
+
enableOfflineStorage: true // 建议启用
|
|
51
|
+
// serverUrl 不设置时,数据会保存到离线存储
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
// 后续可以设置serverUrl
|
|
55
|
+
offlineTracker.updateConfig({
|
|
56
|
+
serverUrl: 'https://api.example.com/track'
|
|
57
|
+
});
|
|
58
|
+
// 设置后,离线存储的数据会自动尝试上报
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
### 自定义埋点
|
|
62
|
+
|
|
63
|
+
```typescript
|
|
64
|
+
// 追踪自定义事件
|
|
65
|
+
tracker.track('button-click', {
|
|
66
|
+
buttonName: 'submit',
|
|
67
|
+
page: 'home'
|
|
68
|
+
});
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
### 设置用户信息
|
|
72
|
+
|
|
73
|
+
```typescript
|
|
74
|
+
tracker.setUser({
|
|
75
|
+
userId: '123',
|
|
76
|
+
userName: 'John',
|
|
77
|
+
userEmail: 'john@example.com'
|
|
78
|
+
});
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
### 手动上报错误
|
|
82
|
+
|
|
83
|
+
```typescript
|
|
84
|
+
try {
|
|
85
|
+
// 业务代码
|
|
86
|
+
} catch (error) {
|
|
87
|
+
tracker.trackError(error, {
|
|
88
|
+
context: 'payment',
|
|
89
|
+
orderId: '12345'
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
## 配置选项
|
|
95
|
+
|
|
96
|
+
| 参数 | 类型 | 默认值 | 说明 |
|
|
97
|
+
|------|------|--------|------|
|
|
98
|
+
| `appId` | `string` | - | 应用ID(必填) |
|
|
99
|
+
| `serverUrl` | `string` | - | 上报服务器地址(可选,不设置时数据仅保存到离线存储) |
|
|
100
|
+
| `enableAutoTrack` | `boolean` | `true` | 是否启用自动埋点 |
|
|
101
|
+
| `enableErrorTrack` | `boolean` | `true` | 是否启用错误监控 |
|
|
102
|
+
| `enablePerformanceTrack` | `boolean` | `false` | 是否启用性能监控 |
|
|
103
|
+
| `enableSessionReplay` | `boolean` | `false` | 是否启用会话回放 |
|
|
104
|
+
| `batchSize` | `number` | `10` | 批量上报大小 |
|
|
105
|
+
| `batchWait` | `number` | `5000` | 批量上报等待时间(毫秒) |
|
|
106
|
+
| `sampleRate` | `number` | `1.0` | 采样率(0-1) |
|
|
107
|
+
| `enableOfflineStorage` | `boolean` | `true` | 是否启用离线存储 |
|
|
108
|
+
| `maxRetries` | `number` | `3` | 最大重试次数 |
|
|
109
|
+
| `userId` | `string` | `''` | 用户ID |
|
|
110
|
+
| `deviceId` | `string` | `''` | 设备ID(自动生成) |
|
|
111
|
+
| `customProperties` | `object` | `{}` | 自定义属性 |
|
|
112
|
+
| `beforeSend` | `function` | - | 上报前钩子 |
|
|
113
|
+
| `afterSend` | `function` | - | 上报后钩子 |
|
|
114
|
+
| `onError` | `function` | - | 错误处理函数 |
|
|
115
|
+
|
|
116
|
+
## API
|
|
117
|
+
|
|
118
|
+
### track(eventName, properties?)
|
|
119
|
+
|
|
120
|
+
追踪自定义事件。
|
|
121
|
+
|
|
122
|
+
```typescript
|
|
123
|
+
tracker.track('custom-event', {
|
|
124
|
+
key: 'value'
|
|
125
|
+
});
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
### setUser(user)
|
|
129
|
+
|
|
130
|
+
设置用户信息。
|
|
131
|
+
|
|
132
|
+
```typescript
|
|
133
|
+
tracker.setUser({
|
|
134
|
+
userId: '123',
|
|
135
|
+
userName: 'John'
|
|
136
|
+
});
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
### getUser()
|
|
140
|
+
|
|
141
|
+
获取用户信息。
|
|
142
|
+
|
|
143
|
+
```typescript
|
|
144
|
+
const user = tracker.getUser();
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
### trackError(error, errorInfo?)
|
|
148
|
+
|
|
149
|
+
手动上报错误。
|
|
150
|
+
|
|
151
|
+
```typescript
|
|
152
|
+
tracker.trackError(new Error('Something went wrong'), {
|
|
153
|
+
context: 'payment'
|
|
154
|
+
});
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
### trackPerformance()
|
|
158
|
+
|
|
159
|
+
手动上报性能数据。
|
|
160
|
+
|
|
161
|
+
```typescript
|
|
162
|
+
tracker.trackPerformance();
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
### trackPageView()
|
|
166
|
+
|
|
167
|
+
手动触发页面浏览追踪。
|
|
168
|
+
|
|
169
|
+
```typescript
|
|
170
|
+
tracker.trackPageView();
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
### use(plugin)
|
|
174
|
+
|
|
175
|
+
使用插件。
|
|
176
|
+
|
|
177
|
+
```typescript
|
|
178
|
+
const plugin = {
|
|
179
|
+
name: 'my-plugin',
|
|
180
|
+
install(tracker) {
|
|
181
|
+
// 插件逻辑
|
|
182
|
+
}
|
|
183
|
+
};
|
|
184
|
+
|
|
185
|
+
tracker.use(plugin);
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
**网络请求拦截插件**:
|
|
189
|
+
|
|
190
|
+
```typescript
|
|
191
|
+
import Tracker, { networkInterceptorPlugin, createNetworkInterceptorPlugin } from '@tracker/sdk';
|
|
192
|
+
|
|
193
|
+
const tracker = new Tracker({
|
|
194
|
+
appId: 'my-app',
|
|
195
|
+
serverUrl: 'https://api.example.com/track'
|
|
196
|
+
});
|
|
197
|
+
|
|
198
|
+
// 使用默认配置
|
|
199
|
+
tracker.use(networkInterceptorPlugin);
|
|
200
|
+
|
|
201
|
+
// 或使用自定义配置
|
|
202
|
+
const customNetworkPlugin = createNetworkInterceptorPlugin({
|
|
203
|
+
urlFilter: /^https?:\/\/api\./, // 只记录 API 请求
|
|
204
|
+
recordResponseBody: true, // 记录响应体
|
|
205
|
+
sensitiveFields: ['password', 'token'] // 过滤敏感字段
|
|
206
|
+
});
|
|
207
|
+
tracker.use(customNetworkPlugin);
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
### updateConfig(config)
|
|
211
|
+
|
|
212
|
+
更新配置。
|
|
213
|
+
|
|
214
|
+
```typescript
|
|
215
|
+
tracker.updateConfig({
|
|
216
|
+
sampleRate: 0.5
|
|
217
|
+
});
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
### getConfig()
|
|
221
|
+
|
|
222
|
+
获取配置。
|
|
223
|
+
|
|
224
|
+
```typescript
|
|
225
|
+
const config = tracker.getConfig();
|
|
226
|
+
```
|
|
227
|
+
|
|
228
|
+
### getBehaviorMetrics()
|
|
229
|
+
|
|
230
|
+
获取行为分析数据。
|
|
231
|
+
|
|
232
|
+
```typescript
|
|
233
|
+
const metrics = tracker.getBehaviorMetrics();
|
|
234
|
+
// { pv: 10, uv: 5, sessions: 3, avgDuration: 5000, paths: [...] }
|
|
235
|
+
```
|
|
236
|
+
|
|
237
|
+
### getSessionReplayData()
|
|
238
|
+
|
|
239
|
+
获取会话回放数据。
|
|
240
|
+
|
|
241
|
+
```typescript
|
|
242
|
+
const data = tracker.getSessionReplayData();
|
|
243
|
+
// { snapshots: [...], interactions: [...] }
|
|
244
|
+
```
|
|
245
|
+
|
|
246
|
+
### destroy()
|
|
247
|
+
|
|
248
|
+
销毁Tracker实例。
|
|
249
|
+
|
|
250
|
+
```typescript
|
|
251
|
+
tracker.destroy();
|
|
252
|
+
```
|
|
253
|
+
|
|
254
|
+
## 曝光采集
|
|
255
|
+
|
|
256
|
+
为需要追踪曝光的元素添加 `data-track-exposure` 属性:
|
|
257
|
+
|
|
258
|
+
```html
|
|
259
|
+
<div data-track-exposure>
|
|
260
|
+
需要追踪曝光的内容
|
|
261
|
+
</div>
|
|
262
|
+
```
|
|
263
|
+
|
|
264
|
+
## 钩子函数
|
|
265
|
+
|
|
266
|
+
### beforeSend
|
|
267
|
+
|
|
268
|
+
上报前钩子,可以修改或取消事件上报。
|
|
269
|
+
|
|
270
|
+
```typescript
|
|
271
|
+
const tracker = new Tracker({
|
|
272
|
+
// ...其他配置
|
|
273
|
+
beforeSend(event) {
|
|
274
|
+
// 修改事件
|
|
275
|
+
event.properties.customField = 'value';
|
|
276
|
+
return event;
|
|
277
|
+
|
|
278
|
+
// 或者取消上报
|
|
279
|
+
// return false;
|
|
280
|
+
}
|
|
281
|
+
});
|
|
282
|
+
```
|
|
283
|
+
|
|
284
|
+
### afterSend
|
|
285
|
+
|
|
286
|
+
上报后钩子。
|
|
287
|
+
|
|
288
|
+
```typescript
|
|
289
|
+
const tracker = new Tracker({
|
|
290
|
+
// ...其他配置
|
|
291
|
+
afterSend(event, success) {
|
|
292
|
+
if (success) {
|
|
293
|
+
console.log('Event sent successfully');
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
});
|
|
297
|
+
```
|
|
298
|
+
|
|
299
|
+
## 插件开发
|
|
300
|
+
|
|
301
|
+
```typescript
|
|
302
|
+
import type { TrackerPlugin } from '@tracker/sdk';
|
|
303
|
+
|
|
304
|
+
const myPlugin: TrackerPlugin = {
|
|
305
|
+
name: 'my-plugin',
|
|
306
|
+
install(tracker) {
|
|
307
|
+
// 监听事件
|
|
308
|
+
// 修改配置
|
|
309
|
+
// 扩展功能
|
|
310
|
+
},
|
|
311
|
+
uninstall(tracker) {
|
|
312
|
+
// 清理工作
|
|
313
|
+
}
|
|
314
|
+
};
|
|
315
|
+
|
|
316
|
+
tracker.use(myPlugin);
|
|
317
|
+
```
|
|
318
|
+
|
|
319
|
+
## 性能优化
|
|
320
|
+
|
|
321
|
+
- SDK采用异步加载,不阻塞页面渲染
|
|
322
|
+
- 使用事件委托,避免内存泄漏
|
|
323
|
+
- 数据批量上报,减少网络请求
|
|
324
|
+
- 支持采样,减少数据量
|
|
325
|
+
- 使用Web Worker处理数据(可选)
|
|
326
|
+
|
|
327
|
+
## 浏览器兼容性
|
|
328
|
+
|
|
329
|
+
- Chrome (最新版)
|
|
330
|
+
- Firefox (最新版)
|
|
331
|
+
- Safari (最新版)
|
|
332
|
+
- Edge (最新版)
|
|
333
|
+
|
|
334
|
+
## Node.js支持
|
|
335
|
+
|
|
336
|
+
SDK支持在Node.js环境中使用:
|
|
337
|
+
|
|
338
|
+
```typescript
|
|
339
|
+
import Tracker from '@tracker/sdk';
|
|
340
|
+
|
|
341
|
+
const tracker = new Tracker({
|
|
342
|
+
appId: 'your-app-id',
|
|
343
|
+
serverUrl: 'https://api.example.com/track'
|
|
344
|
+
});
|
|
345
|
+
|
|
346
|
+
tracker.track('server-event', {
|
|
347
|
+
server: 'node'
|
|
348
|
+
});
|
|
349
|
+
```
|
|
350
|
+
|
|
351
|
+
## 开发
|
|
352
|
+
|
|
353
|
+
```bash
|
|
354
|
+
# 安装依赖
|
|
355
|
+
pnpm install
|
|
356
|
+
|
|
357
|
+
# 开发模式
|
|
358
|
+
pnpm dev
|
|
359
|
+
|
|
360
|
+
# 构建
|
|
361
|
+
pnpm build
|
|
362
|
+
|
|
363
|
+
# 类型检查
|
|
364
|
+
pnpm typecheck
|
|
365
|
+
|
|
366
|
+
# 代码检查
|
|
367
|
+
pnpm lint
|
|
368
|
+
|
|
369
|
+
# 格式化
|
|
370
|
+
pnpm format
|
|
371
|
+
```
|
|
372
|
+
|
|
373
|
+
## 技术栈
|
|
374
|
+
|
|
375
|
+
- **构建工具**: Vite
|
|
376
|
+
- **包管理器**: pnpm
|
|
377
|
+
- **Node版本**: 19+
|
|
378
|
+
- **语言**: TypeScript
|
|
379
|
+
- **测试**: Vitest
|
|
380
|
+
|
|
381
|
+
## 更多文档
|
|
382
|
+
|
|
383
|
+
- [详细使用说明](docs/USAGE.md) - 完整的API文档、配置选项、使用场景和最佳实践
|
|
384
|
+
- [测试文档](tests/README.md) - 测试覆盖说明
|
|
385
|
+
|
|
386
|
+
## 许可证
|
|
387
|
+
|
|
388
|
+
MIT
|
|
389
|
+
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { default as ViewTracker } from './view-tracker';
|
|
2
|
+
import { default as ClickTracker } from './click-tracker';
|
|
3
|
+
import { default as ExposureTracker } from './exposure-tracker';
|
|
4
|
+
import { default as InputTracker } from './input-tracker';
|
|
5
|
+
|
|
6
|
+
declare class AutoTracker {
|
|
7
|
+
private viewTracker;
|
|
8
|
+
private clickTracker;
|
|
9
|
+
private exposureTracker;
|
|
10
|
+
private inputTracker;
|
|
11
|
+
private enabled;
|
|
12
|
+
constructor();
|
|
13
|
+
/**
|
|
14
|
+
* 初始化自动埋点
|
|
15
|
+
*/
|
|
16
|
+
init(options?: {
|
|
17
|
+
enableClick?: boolean;
|
|
18
|
+
enableExposure?: boolean;
|
|
19
|
+
enableInput?: boolean;
|
|
20
|
+
clickDebounceTime?: number;
|
|
21
|
+
inputDebounceTime?: number;
|
|
22
|
+
}): void;
|
|
23
|
+
/**
|
|
24
|
+
* 获取ViewTracker实例
|
|
25
|
+
*/
|
|
26
|
+
getViewTracker(): ViewTracker;
|
|
27
|
+
/**
|
|
28
|
+
* 获取ClickTracker实例
|
|
29
|
+
*/
|
|
30
|
+
getClickTracker(): ClickTracker;
|
|
31
|
+
/**
|
|
32
|
+
* 获取ExposureTracker实例
|
|
33
|
+
*/
|
|
34
|
+
getExposureTracker(): ExposureTracker;
|
|
35
|
+
/**
|
|
36
|
+
* 获取InputTracker实例
|
|
37
|
+
*/
|
|
38
|
+
getInputTracker(): InputTracker;
|
|
39
|
+
/**
|
|
40
|
+
* 销毁
|
|
41
|
+
*/
|
|
42
|
+
destroy(): void;
|
|
43
|
+
}
|
|
44
|
+
export default AutoTracker;
|
|
45
|
+
//# sourceMappingURL=auto-tracker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auto-tracker.d.ts","sourceRoot":"","sources":["../../src/collector/auto-tracker.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,WAAW,MAAM,gBAAgB,CAAC;AACzC,OAAO,YAAY,MAAM,iBAAiB,CAAC;AAC3C,OAAO,eAAe,MAAM,oBAAoB,CAAC;AACjD,OAAO,YAAY,MAAM,iBAAiB,CAAC;AAE3C,cAAM,WAAW;IACf,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,YAAY,CAAe;IACnC,OAAO,CAAC,eAAe,CAAkB;IACzC,OAAO,CAAC,YAAY,CAAe;IACnC,OAAO,CAAC,OAAO,CAAkB;;IASjC;;OAEG;IACH,IAAI,CAAC,OAAO,CAAC,EAAE;QAAE,WAAW,CAAC,EAAE,OAAO,CAAC;QAAC,cAAc,CAAC,EAAE,OAAO,CAAC;QAAC,WAAW,CAAC,EAAE,OAAO,CAAC;QAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC;QAAC,iBAAiB,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IA4BxJ;;OAEG;IACH,cAAc,IAAI,WAAW;IAI7B;;OAEG;IACH,eAAe,IAAI,YAAY;IAI/B;;OAEG;IACH,kBAAkB,IAAI,eAAe;IAIrC;;OAEG;IACH,eAAe,IAAI,YAAY;IAI/B;;OAEG;IACH,OAAO,IAAI,IAAI;CAYhB;AAED,eAAe,WAAW,CAAC"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { ClickEvent } from '../types';
|
|
2
|
+
|
|
3
|
+
declare class ClickTracker {
|
|
4
|
+
private clickHandler;
|
|
5
|
+
private touchStartHandler;
|
|
6
|
+
private touchEndHandler;
|
|
7
|
+
private debounceTime;
|
|
8
|
+
private touchTimeout;
|
|
9
|
+
private lastTouch;
|
|
10
|
+
private readonly TOUCH_CLICK_THRESHOLD;
|
|
11
|
+
private readonly TOUCH_DISTANCE_THRESHOLD;
|
|
12
|
+
/**
|
|
13
|
+
* 初始化
|
|
14
|
+
*/
|
|
15
|
+
init(debounceTime?: number): void;
|
|
16
|
+
/**
|
|
17
|
+
* 处理触摸事件
|
|
18
|
+
*/
|
|
19
|
+
private handleTouch;
|
|
20
|
+
/**
|
|
21
|
+
* 处理触摸交互(模拟点击行为)
|
|
22
|
+
*/
|
|
23
|
+
private processTouchInteraction;
|
|
24
|
+
/**
|
|
25
|
+
* 处理点击事件
|
|
26
|
+
*/
|
|
27
|
+
private handleClick;
|
|
28
|
+
/**
|
|
29
|
+
* 获取点击事件
|
|
30
|
+
*/
|
|
31
|
+
getClickEvent(event: MouseEvent): ClickEvent | null;
|
|
32
|
+
/**
|
|
33
|
+
* 销毁
|
|
34
|
+
*/
|
|
35
|
+
destroy(): void;
|
|
36
|
+
}
|
|
37
|
+
export default ClickTracker;
|
|
38
|
+
//# sourceMappingURL=click-tracker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"click-tracker.d.ts","sourceRoot":"","sources":["../../src/collector/click-tracker.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAI1C,cAAM,YAAY;IAChB,OAAO,CAAC,YAAY,CAA8C;IAClE,OAAO,CAAC,iBAAiB,CAA8C;IACvE,OAAO,CAAC,eAAe,CAA8C;IACrE,OAAO,CAAC,YAAY,CAAe;IACnC,OAAO,CAAC,YAAY,CAAuB;IAC3C,OAAO,CAAC,SAAS,CAAuD;IACxE,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAO;IAC7C,OAAO,CAAC,QAAQ,CAAC,wBAAwB,CAAM;IAE/C;;OAEG;IACH,IAAI,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI;IAoCjC;;OAEG;IACH,OAAO,CAAC,WAAW;IAuDnB;;OAEG;IACH,OAAO,CAAC,uBAAuB;IAkD/B;;OAEG;IACH,OAAO,CAAC,WAAW;IAuDnB;;OAEG;IACH,aAAa,CAAC,KAAK,EAAE,UAAU,GAAG,UAAU,GAAG,IAAI;IA2BnD;;OAEG;IACH,OAAO,IAAI,IAAI;CAuBhB;AAED,eAAe,YAAY,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"custom-tracker.d.ts","sourceRoot":"","sources":["../../src/collector/custom-tracker.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAG3C,cAAM,aAAa;IACjB;;OAEG;IACH,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,WAAW;CAa5E;AAED,eAAe,aAAa,CAAC"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
declare class ErrorTracker {
|
|
2
|
+
private handlers;
|
|
3
|
+
private errorCache;
|
|
4
|
+
private debounceTime;
|
|
5
|
+
/**
|
|
6
|
+
* 初始化
|
|
7
|
+
*/
|
|
8
|
+
init(): void;
|
|
9
|
+
/**
|
|
10
|
+
* 处理JavaScript错误
|
|
11
|
+
*/
|
|
12
|
+
private handleJSError;
|
|
13
|
+
/**
|
|
14
|
+
* 处理Promise错误
|
|
15
|
+
*/
|
|
16
|
+
private handlePromiseError;
|
|
17
|
+
/**
|
|
18
|
+
* 处理资源加载错误
|
|
19
|
+
*/
|
|
20
|
+
private handleResourceError;
|
|
21
|
+
/**
|
|
22
|
+
* 获取错误唯一标识
|
|
23
|
+
*/
|
|
24
|
+
private getErrorKey;
|
|
25
|
+
/**
|
|
26
|
+
* 触发错误事件
|
|
27
|
+
*/
|
|
28
|
+
private emitError;
|
|
29
|
+
/**
|
|
30
|
+
* 清理过期的错误缓存
|
|
31
|
+
*/
|
|
32
|
+
private cleanExpiredErrorCache;
|
|
33
|
+
/**
|
|
34
|
+
* 手动上报错误
|
|
35
|
+
*/
|
|
36
|
+
trackError(error: Error | string, errorInfo?: Record<string, unknown>): void;
|
|
37
|
+
/**
|
|
38
|
+
* 销毁
|
|
39
|
+
*/
|
|
40
|
+
destroy(): void;
|
|
41
|
+
}
|
|
42
|
+
export default ErrorTracker;
|
|
43
|
+
//# sourceMappingURL=error-tracker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"error-tracker.d.ts","sourceRoot":"","sources":["../../src/collector/error-tracker.ts"],"names":[],"mappings":"AAMA,cAAM,YAAY;IAChB,OAAO,CAAC,QAAQ,CAAyB;IACzC,OAAO,CAAC,UAAU,CAAkC;IACpD,OAAO,CAAC,YAAY,CAAe;IAEnC;;OAEG;IACH,IAAI,IAAI,IAAI;IAgCZ;;OAEG;IACH,OAAO,CAAC,aAAa;IAsBrB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAgC1B;;OAEG;IACH,OAAO,CAAC,mBAAmB;IA8C3B;;OAEG;IACH,OAAO,CAAC,WAAW;IAwBnB;;OAEG;IACH,OAAO,CAAC,SAAS;IAuBjB;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAS9B;;OAEG;IACH,UAAU,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IA8B5E;;OAEG;IACH,OAAO,IAAI,IAAI;CAKhB;AAED,eAAe,YAAY,CAAC"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
interface ExposureOptions {
|
|
2
|
+
/** 曝光阈值(0-1),元素可见比例达到此值才触发曝光 */
|
|
3
|
+
threshold?: number;
|
|
4
|
+
/** 根元素,默认为viewport */
|
|
5
|
+
root?: Element | null;
|
|
6
|
+
/** 根元素边距 */
|
|
7
|
+
rootMargin?: string;
|
|
8
|
+
}
|
|
9
|
+
declare class ExposureTracker {
|
|
10
|
+
private observer;
|
|
11
|
+
private exposedElements;
|
|
12
|
+
private options;
|
|
13
|
+
private exposureMap;
|
|
14
|
+
private scrollFallbackHandler;
|
|
15
|
+
private resizeFallbackHandler;
|
|
16
|
+
private cachedElements;
|
|
17
|
+
private lastCacheUpdate;
|
|
18
|
+
private readonly CACHE_UPDATE_INTERVAL;
|
|
19
|
+
constructor(options?: ExposureOptions);
|
|
20
|
+
/**
|
|
21
|
+
* 初始化
|
|
22
|
+
*/
|
|
23
|
+
init(): void;
|
|
24
|
+
/**
|
|
25
|
+
* 观察元素
|
|
26
|
+
*/
|
|
27
|
+
observeElements(): void;
|
|
28
|
+
/**
|
|
29
|
+
* 手动添加观察元素
|
|
30
|
+
*/
|
|
31
|
+
observe(element: Element): void;
|
|
32
|
+
/**
|
|
33
|
+
* 取消观察元素
|
|
34
|
+
*/
|
|
35
|
+
unobserve(element: Element): void;
|
|
36
|
+
/**
|
|
37
|
+
* 处理IntersectionObserver回调
|
|
38
|
+
*/
|
|
39
|
+
private handleIntersection;
|
|
40
|
+
/**
|
|
41
|
+
* 触发曝光事件
|
|
42
|
+
* @param element 曝光元素
|
|
43
|
+
* @param duration 曝光时长(毫秒),可选
|
|
44
|
+
*/
|
|
45
|
+
private triggerExposure;
|
|
46
|
+
/**
|
|
47
|
+
* 获取曝光元素列表(带缓存)
|
|
48
|
+
*/
|
|
49
|
+
private getExposureElements;
|
|
50
|
+
/**
|
|
51
|
+
* 降级方案:使用scroll事件
|
|
52
|
+
*/
|
|
53
|
+
private initScrollFallback;
|
|
54
|
+
/**
|
|
55
|
+
* 销毁
|
|
56
|
+
*/
|
|
57
|
+
destroy(): void;
|
|
58
|
+
}
|
|
59
|
+
export default ExposureTracker;
|
|
60
|
+
//# sourceMappingURL=exposure-tracker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"exposure-tracker.d.ts","sourceRoot":"","sources":["../../src/collector/exposure-tracker.ts"],"names":[],"mappings":"AAOA,UAAU,eAAe;IACvB,gCAAgC;IAChC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,sBAAsB;IACtB,IAAI,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IACtB,YAAY;IACZ,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,cAAM,eAAe;IACnB,OAAO,CAAC,QAAQ,CAAqC;IACrD,OAAO,CAAC,eAAe,CAA2B;IAClD,OAAO,CAAC,OAAO,CAAkB;IACjC,OAAO,CAAC,WAAW,CAAmC;IACtD,OAAO,CAAC,qBAAqB,CAA6B;IAC1D,OAAO,CAAC,qBAAqB,CAA6B;IAC1D,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,eAAe,CAAa;IACpC,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAQ;gBAElC,OAAO,GAAE,eAAoB;IASzC;;OAEG;IACH,IAAI,IAAI,IAAI;IAyBZ;;OAEG;IACH,eAAe,IAAI,IAAI;IAevB;;OAEG;IACH,OAAO,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAa/B;;OAEG;IACH,SAAS,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAgBjC;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAqB1B;;;;OAIG;IACH,OAAO,CAAC,eAAe;IAqBvB;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAc3B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IA2D1B;;OAEG;IACH,OAAO,IAAI,IAAI;CAsBhB;AAED,eAAe,eAAe,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
declare class InputTracker {
|
|
2
|
+
private inputHandler;
|
|
3
|
+
private changeHandler;
|
|
4
|
+
private inputDebounceTime;
|
|
5
|
+
private selectDebounceTime;
|
|
6
|
+
private skipEmptyInput;
|
|
7
|
+
private sensitiveKeywords;
|
|
8
|
+
/**
|
|
9
|
+
* 初始化
|
|
10
|
+
*/
|
|
11
|
+
init(debounceTime?: number, skipEmptyInput?: boolean): void;
|
|
12
|
+
/**
|
|
13
|
+
* 处理 input 事件
|
|
14
|
+
*/
|
|
15
|
+
private handleInput;
|
|
16
|
+
/**
|
|
17
|
+
* 处理 change 事件
|
|
18
|
+
*/
|
|
19
|
+
private handleChange;
|
|
20
|
+
/**
|
|
21
|
+
* 判断是否为敏感字段
|
|
22
|
+
*/
|
|
23
|
+
private isSensitiveField;
|
|
24
|
+
/**
|
|
25
|
+
* 销毁
|
|
26
|
+
*/
|
|
27
|
+
destroy(): void;
|
|
28
|
+
}
|
|
29
|
+
export default InputTracker;
|
|
30
|
+
//# sourceMappingURL=input-tracker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"input-tracker.d.ts","sourceRoot":"","sources":["../../src/collector/input-tracker.ts"],"names":[],"mappings":"AAOA,cAAM,YAAY;IAChB,OAAO,CAAC,YAAY,CAAyC;IAC7D,OAAO,CAAC,aAAa,CAAyC;IAC9D,OAAO,CAAC,iBAAiB,CAAe;IACxC,OAAO,CAAC,kBAAkB,CAAe;IACzC,OAAO,CAAC,cAAc,CAAiB;IAEvC,OAAO,CAAC,iBAAiB,CAAiF;IAE1G;;OAEG;IACH,IAAI,CAAC,YAAY,CAAC,EAAE,MAAM,EAAE,cAAc,CAAC,EAAE,OAAO,GAAG,IAAI;IAgC3D;;OAEG;IACH,OAAO,CAAC,WAAW;IAmGnB;;OAEG;IACH,OAAO,CAAC,YAAY;IAmFpB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IA0CxB;;OAEG;IACH,OAAO,IAAI,IAAI;CAWhB;AAED,eAAe,YAAY,CAAC"}
|