@uxda/appkit 4.2.93 → 4.2.95
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/PROJECT_DOCS.md +142 -0
- package/dist/index.js +1084 -23
- package/package.json +2 -1
- package/src/payment/api/endpoints.ts +1 -0
- package/src/payment/components/RechargeView.vue +2 -1
- package/src/payment/types.ts +1 -0
- package/src/shared/index.ts +1 -0
- package/src/shared/tracking/README.md +509 -0
- package/src/shared/tracking/directives/index.ts +40 -0
- package/src/shared/tracking/directives/track-click.ts +142 -0
- package/src/shared/tracking/directives/track-page.ts +50 -0
- package/src/shared/tracking/directives/track-scroll.ts +116 -0
- package/src/shared/tracking/directives/track-search.ts +179 -0
- package/src/shared/tracking/examples/data-structure-example.ts +239 -0
- package/src/shared/tracking/examples/directive-tracking-example.vue +202 -0
- package/src/shared/tracking/examples/global-tracking-example.vue +25 -0
- package/src/shared/tracking/examples/page-tracking-template.vue +27 -0
- package/src/shared/tracking/examples/sdk-tracking-example.vue +33 -0
- package/src/shared/tracking/index.ts +5 -0
- package/src/shared/tracking/tracking-init.ts +214 -0
- package/src/shared/tracking/tracking-sdk.ts +986 -0
- package/src/shared/tracking/useAutoTracking.ts +108 -0
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@uxda/appkit",
|
|
3
|
-
"version": "4.2.
|
|
3
|
+
"version": "4.2.95",
|
|
4
4
|
"description": "小程序应用开发包",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"module": "dist/index.ts",
|
|
@@ -38,6 +38,7 @@
|
|
|
38
38
|
"dayjs": "^1.11.18",
|
|
39
39
|
"dsbridge": "^3.1.4",
|
|
40
40
|
"lodash-es": "^4.17.21",
|
|
41
|
+
"pako": "^2.1.0",
|
|
41
42
|
"validator": "^13.15.15",
|
|
42
43
|
"vue": "^3.5.22"
|
|
43
44
|
},
|
|
@@ -35,6 +35,7 @@ const endpointsList: HttpEndpoints = {
|
|
|
35
35
|
accountAuthFlag: params.accountAuthFlag || false,
|
|
36
36
|
channelCode: params.channelCode || null,
|
|
37
37
|
payFinishJumpUrl: params.payFinishJumpUrl || null,
|
|
38
|
+
clientInfo: params.clientInfo || null,
|
|
38
39
|
}),
|
|
39
40
|
transform: (data: any) => {
|
|
40
41
|
let json = null
|
|
@@ -110,7 +110,8 @@ const onPayClick = () => {
|
|
|
110
110
|
accountAuthFlag: false,
|
|
111
111
|
channelCode: 'centergzh',
|
|
112
112
|
payFinishJumpUrl: props.payFinishJumpUrl,
|
|
113
|
-
fromMini: !!params.from
|
|
113
|
+
fromMini: !!params.from,
|
|
114
|
+
clientInfo: 'H5'
|
|
114
115
|
}).then(result => {
|
|
115
116
|
console.log(result, '------requestBrandWCPay')
|
|
116
117
|
state.buttonLoading = false
|
package/src/payment/types.ts
CHANGED
package/src/shared/index.ts
CHANGED
|
@@ -0,0 +1,509 @@
|
|
|
1
|
+
# 全埋点SDK使用指南
|
|
2
|
+
|
|
3
|
+
## 概述
|
|
4
|
+
|
|
5
|
+
这是一个精简版的全埋点SDK,支持自动埋点和手动埋点功能。已集成到项目中,开箱即用。
|
|
6
|
+
|
|
7
|
+
## 数据结构
|
|
8
|
+
|
|
9
|
+
埋点数据符合统一的 JSON 格式规范,包含以下核心字段:
|
|
10
|
+
|
|
11
|
+
```typescript
|
|
12
|
+
interface TrackingMainData {
|
|
13
|
+
log_id?: string // 日志ID (自动生成)
|
|
14
|
+
log_time: number // 日志时间戳 (毫秒)
|
|
15
|
+
log_type: LogType // 日志类型 (组合类型,如 "page/event/error/device/app")
|
|
16
|
+
tenant_id?: string // 租户ID
|
|
17
|
+
user_id?: string // 用户ID
|
|
18
|
+
source: SourceType // 来源 (app/H5/PC)
|
|
19
|
+
session_id: string // 会话ID
|
|
20
|
+
log_data: LogData // 日志数据
|
|
21
|
+
}
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
### 日志数据子结构
|
|
25
|
+
|
|
26
|
+
`log_data` 包含以下可选字段:
|
|
27
|
+
|
|
28
|
+
```typescript
|
|
29
|
+
interface LogData {
|
|
30
|
+
page?: PageData // 页面信息
|
|
31
|
+
event?: EventData // 事件信息
|
|
32
|
+
app?: AppData // 应用信息
|
|
33
|
+
device?: DeviceData // 设备信息
|
|
34
|
+
performance?: PerformanceData // 性能信息
|
|
35
|
+
error?: ErrorData // 错误信息
|
|
36
|
+
}
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
#### 页面信息 (PageData)
|
|
40
|
+
|
|
41
|
+
```typescript
|
|
42
|
+
interface PageData {
|
|
43
|
+
page_name?: string // 页面名称
|
|
44
|
+
page_url?: string // 页面URL
|
|
45
|
+
page_referrer?: string // 页面来源
|
|
46
|
+
previous_page_name?: string // 上一页名称
|
|
47
|
+
page_start_time?: string // 页面开始时间 (ISO 8601格式)
|
|
48
|
+
page_duration?: number // 页面停留时长(毫秒)
|
|
49
|
+
}
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
#### 事件信息 (EventData)
|
|
53
|
+
|
|
54
|
+
```typescript
|
|
55
|
+
interface EventData {
|
|
56
|
+
event_type?: string // 事件类型 (click/custom/page_view等)
|
|
57
|
+
event_name?: string // 事件名称
|
|
58
|
+
element_id?: string // 元素ID
|
|
59
|
+
}
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
#### 应用信息 (AppData)
|
|
63
|
+
|
|
64
|
+
```typescript
|
|
65
|
+
interface AppData {
|
|
66
|
+
app_version?: string // 应用版本
|
|
67
|
+
package_name?: string // 包名
|
|
68
|
+
app_channel?: string // 应用渠道 (H5/WeChat/App Store)
|
|
69
|
+
}
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
#### 设备信息 (DeviceData)
|
|
73
|
+
|
|
74
|
+
```typescript
|
|
75
|
+
interface DeviceData {
|
|
76
|
+
device_type?: string // 设备类型 (mobile/tablet/desktop)
|
|
77
|
+
os?: string // 操作系统
|
|
78
|
+
os_version?: string // 操作系统版本
|
|
79
|
+
brand?: string // 品牌
|
|
80
|
+
model?: string // 型号
|
|
81
|
+
network_type?: string // 网络类型 (wifi/2g/3g/4g/5g/none等)
|
|
82
|
+
}
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
**网络类型说明**:SDK 会自动检测当前网络类型,可能的值包括:
|
|
86
|
+
- `wifi` - WiFi 网络
|
|
87
|
+
- `2g` - 2G 网络
|
|
88
|
+
- `3g` - 3G 网络
|
|
89
|
+
- `4g` - 4G 网络
|
|
90
|
+
- `5g` - 5G 网络
|
|
91
|
+
- `none` - 无网络连接
|
|
92
|
+
- 其他平台特定值
|
|
93
|
+
|
|
94
|
+
#### 性能信息 (PerformanceData)
|
|
95
|
+
|
|
96
|
+
```typescript
|
|
97
|
+
interface PerformanceData {
|
|
98
|
+
page_load_time?: number // 页面加载时间(毫秒)
|
|
99
|
+
response_time?: number // 响应时间(毫秒)
|
|
100
|
+
fps?: number // 帧率
|
|
101
|
+
memory_usage?: number // 内存使用率(%)
|
|
102
|
+
battery_usage?: number // 电池使用率(%)
|
|
103
|
+
network_latency?: number // 网络延迟(毫秒)
|
|
104
|
+
crash_rate?: number // 崩溃率(%)
|
|
105
|
+
}
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
**性能数据说明**:
|
|
109
|
+
- SDK 会在**页面访问 (PAGE_VIEW)** 时自动采集以下性能数据:
|
|
110
|
+
- `page_load_time`: 页面加载完成时间
|
|
111
|
+
- `response_time`: 页面响应时间
|
|
112
|
+
- `memory_usage`: 内存使用率
|
|
113
|
+
- **跨平台支持**:
|
|
114
|
+
- H5 环境:使用浏览器原生 `window.performance` API
|
|
115
|
+
- 小程序环境:使用 `Taro.getPerformance()` API
|
|
116
|
+
- 可以通过 `customData.businessData.performance` 手动传入额外的性能数据,会与自动采集的数据合并
|
|
117
|
+
|
|
118
|
+
#### 错误信息 (ErrorData)
|
|
119
|
+
|
|
120
|
+
```typescript
|
|
121
|
+
interface ErrorData {
|
|
122
|
+
error_code?: string // 错误代码
|
|
123
|
+
error_message?: string // 错误消息
|
|
124
|
+
stack_trace?: string // 堆栈跟踪
|
|
125
|
+
error_level?: string // 错误级别 (info/warning/error)
|
|
126
|
+
error_context?: string // 错误上下文
|
|
127
|
+
}
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
## 文件结构
|
|
131
|
+
|
|
132
|
+
```
|
|
133
|
+
utils/
|
|
134
|
+
├── tracking/
|
|
135
|
+
│ ├── tracking-sdk.ts # 核心埋点SDK
|
|
136
|
+
│ ├── tracking-init.ts # 埋点初始化
|
|
137
|
+
│ ├── useAutoTracking.ts # 自动埋点组合式函数
|
|
138
|
+
│ ├── directives/ # 埋点指令
|
|
139
|
+
│ │ ├── index.ts # 指令入口
|
|
140
|
+
│ │ ├── track-click.ts # 点击埋点指令
|
|
141
|
+
│ │ ├── track-page.ts # 页面访问埋点指令
|
|
142
|
+
│ │ └── track-scroll.ts # 滚动埋点指令
|
|
143
|
+
│ └── examples/ # 使用示例
|
|
144
|
+
│ ├── data-structure-example.ts # 数据结构示例
|
|
145
|
+
│ └── directive-tracking-example.vue # 指令使用示例
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
## 核心功能
|
|
149
|
+
|
|
150
|
+
### 1. 页面级自动埋点
|
|
151
|
+
- 使用 `usePageTracking` 组合式函数
|
|
152
|
+
- 自动记录页面访问和性能数据
|
|
153
|
+
- 页面显示/隐藏时自动触发
|
|
154
|
+
|
|
155
|
+
### 2. 手动埋点
|
|
156
|
+
- 自定义事件埋点
|
|
157
|
+
- 业务事件埋点
|
|
158
|
+
- 页面访问埋点
|
|
159
|
+
|
|
160
|
+
### 3. 埋点指令
|
|
161
|
+
- 点击埋点指令 (v-track-click)
|
|
162
|
+
- 页面访问埋点指令 (v-track-page)
|
|
163
|
+
- 滚动埋点指令 (v-track-scroll)
|
|
164
|
+
- 搜索埋点指令 (v-track-search)
|
|
165
|
+
|
|
166
|
+
### 4. 状态管理
|
|
167
|
+
- 埋点开关控制
|
|
168
|
+
- 调试模式
|
|
169
|
+
- 统计信息
|
|
170
|
+
|
|
171
|
+
## 使用方法
|
|
172
|
+
|
|
173
|
+
### 1. 基本使用
|
|
174
|
+
|
|
175
|
+
所有埋点方法都是异步的,需要使用 `await` 关键字:
|
|
176
|
+
|
|
177
|
+
```typescript
|
|
178
|
+
import { trackClick, trackCustom, trackPageView } from '~/utils/tracking/tracking-sdk'
|
|
179
|
+
|
|
180
|
+
// 点击事件埋点
|
|
181
|
+
await trackClick('add_to_cart_btn', '加入购物车按钮')
|
|
182
|
+
|
|
183
|
+
// 自定义事件埋点
|
|
184
|
+
await trackCustom('purchase_complete', {
|
|
185
|
+
order_id: 'ORDER_123',
|
|
186
|
+
amount: 99.99,
|
|
187
|
+
currency: 'CNY',
|
|
188
|
+
})
|
|
189
|
+
|
|
190
|
+
// 页面访问埋点
|
|
191
|
+
await trackPageView('商品详情页')
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
### 2. 页面级自动埋点
|
|
195
|
+
|
|
196
|
+
```vue
|
|
197
|
+
<template>
|
|
198
|
+
<view>
|
|
199
|
+
<!-- 页面内容 -->
|
|
200
|
+
</view>
|
|
201
|
+
</template>
|
|
202
|
+
|
|
203
|
+
<script setup lang="ts">
|
|
204
|
+
import { usePageTracking } from '~/utils/tracking/useAutoTracking'
|
|
205
|
+
|
|
206
|
+
// 启用页面级自动埋点
|
|
207
|
+
const pageTracking = usePageTracking({
|
|
208
|
+
pageTitle: '页面标题',
|
|
209
|
+
customData: {
|
|
210
|
+
pageType: 'example'
|
|
211
|
+
}
|
|
212
|
+
})
|
|
213
|
+
</script>
|
|
214
|
+
```
|
|
215
|
+
|
|
216
|
+
### 3. 手动埋点
|
|
217
|
+
|
|
218
|
+
```typescript
|
|
219
|
+
import { trackingSDK, TrackingEventType } from '~/utils/tracking/tracking-sdk'
|
|
220
|
+
|
|
221
|
+
// 自定义事件埋点
|
|
222
|
+
await trackingSDK.trackCustom('button_click', {
|
|
223
|
+
buttonId: 'submit',
|
|
224
|
+
page: 'login'
|
|
225
|
+
})
|
|
226
|
+
|
|
227
|
+
// 业务事件埋点
|
|
228
|
+
await trackingSDK.trackBusiness(TrackingEventType.CUSTOM, {
|
|
229
|
+
action: 'search',
|
|
230
|
+
keyword: 'example'
|
|
231
|
+
})
|
|
232
|
+
|
|
233
|
+
// 页面访问埋点
|
|
234
|
+
await trackingSDK.trackPageView('首页')
|
|
235
|
+
|
|
236
|
+
// 点击事件埋点
|
|
237
|
+
await trackingSDK.trackClick('submit-btn', '提交按钮')
|
|
238
|
+
```
|
|
239
|
+
|
|
240
|
+
### 4. 组合式函数埋点
|
|
241
|
+
|
|
242
|
+
```vue
|
|
243
|
+
<script setup lang="ts">
|
|
244
|
+
import { useAutoTracking } from '~/utils/tracking/useAutoTracking'
|
|
245
|
+
|
|
246
|
+
const tracking = useAutoTracking({
|
|
247
|
+
trackPageView: true,
|
|
248
|
+
trackClicks: true,
|
|
249
|
+
trackStay: true
|
|
250
|
+
})
|
|
251
|
+
|
|
252
|
+
// 手动触发事件
|
|
253
|
+
const handleClick = async () => {
|
|
254
|
+
await tracking.trackEvent('custom_click', {
|
|
255
|
+
buttonType: 'primary'
|
|
256
|
+
})
|
|
257
|
+
}
|
|
258
|
+
</script>
|
|
259
|
+
```
|
|
260
|
+
|
|
261
|
+
### 5. 埋点指令使用
|
|
262
|
+
|
|
263
|
+
```vue
|
|
264
|
+
<template>
|
|
265
|
+
<!-- 页面访问埋点 -->
|
|
266
|
+
<view v-track-page="'页面标题'">
|
|
267
|
+
<text>页面内容</text>
|
|
268
|
+
</view>
|
|
269
|
+
|
|
270
|
+
<!-- 自定义页面访问埋点 -->
|
|
271
|
+
<view v-track-page="{ pageTitle: '自定义标题', customData: { pageType: 'example' } }">
|
|
272
|
+
<text>自定义页面内容</text>
|
|
273
|
+
</view>
|
|
274
|
+
|
|
275
|
+
<!-- 基础点击埋点 -->
|
|
276
|
+
<button v-track-click="'button_click'">
|
|
277
|
+
点击按钮
|
|
278
|
+
</button>
|
|
279
|
+
|
|
280
|
+
<!-- 自定义点击埋点 -->
|
|
281
|
+
<button v-track-click="{
|
|
282
|
+
event: 'custom_click',
|
|
283
|
+
data: { buttonType: 'primary', value: 123 },
|
|
284
|
+
elementId: 'submit-btn',
|
|
285
|
+
}">
|
|
286
|
+
自定义点击按钮
|
|
287
|
+
</button>
|
|
288
|
+
|
|
289
|
+
<!-- 滚动埋点 -->
|
|
290
|
+
<view v-track-scroll="true">
|
|
291
|
+
<text>滚动到此区域会触发埋点</text>
|
|
292
|
+
</view>
|
|
293
|
+
|
|
294
|
+
<!-- 自定义滚动埋点 -->
|
|
295
|
+
<view v-track-scroll="{
|
|
296
|
+
threshold: 0.3,
|
|
297
|
+
data: { section: 'custom_scroll' },
|
|
298
|
+
trackDirection: true
|
|
299
|
+
}">
|
|
300
|
+
<text>自定义滚动埋点</text>
|
|
301
|
+
</view>
|
|
302
|
+
|
|
303
|
+
<!-- 搜索埋点 -->
|
|
304
|
+
<input v-track-search="'search'" />
|
|
305
|
+
|
|
306
|
+
<!-- 自定义搜索埋点 -->
|
|
307
|
+
<input v-track-search="{
|
|
308
|
+
event: 'product_search',
|
|
309
|
+
data: { category: 'electronics' },
|
|
310
|
+
trackInput: true,
|
|
311
|
+
trackSubmit: true,
|
|
312
|
+
debounceTime: 300,
|
|
313
|
+
minLength: 2
|
|
314
|
+
}" />
|
|
315
|
+
</template>
|
|
316
|
+
```
|
|
317
|
+
|
|
318
|
+
|
|
319
|
+
## 配置选项
|
|
320
|
+
|
|
321
|
+
### 初始化配置
|
|
322
|
+
|
|
323
|
+
```typescript
|
|
324
|
+
import { initTracking } from '~/utils/tracking/tracking-init'
|
|
325
|
+
|
|
326
|
+
await initTracking({
|
|
327
|
+
enabled: true, // 是否启用埋点
|
|
328
|
+
debug: false, // 是否开启调试模式
|
|
329
|
+
})
|
|
330
|
+
```
|
|
331
|
+
|
|
332
|
+
### SDK 配置
|
|
333
|
+
|
|
334
|
+
```typescript
|
|
335
|
+
import { trackingSDK } from '~/utils/tracking/tracking-sdk'
|
|
336
|
+
|
|
337
|
+
trackingSDK.updateConfig({
|
|
338
|
+
enabled: true, // 是否启用埋点
|
|
339
|
+
debug: false, // 是否开启调试模式
|
|
340
|
+
batchSize: 30, // 批量发送大小
|
|
341
|
+
flushInterval: 100000, // 刷新间隔(ms)
|
|
342
|
+
apiEndpoint: '/api/tracking', // API端点
|
|
343
|
+
})
|
|
344
|
+
```
|
|
345
|
+
|
|
346
|
+
### 自动埋点配置
|
|
347
|
+
|
|
348
|
+
```typescript
|
|
349
|
+
interface AutoTrackingConfig {
|
|
350
|
+
trackPageView?: boolean // 是否自动跟踪页面访问
|
|
351
|
+
trackClicks?: boolean // 是否自动跟踪点击事件
|
|
352
|
+
trackStay?: boolean // 是否自动跟踪停留时间
|
|
353
|
+
pageTitle?: string // 页面标题
|
|
354
|
+
customData?: Record<string, unknown> // 自定义数据
|
|
355
|
+
}
|
|
356
|
+
```
|
|
357
|
+
|
|
358
|
+
## 事件类型
|
|
359
|
+
|
|
360
|
+
```typescript
|
|
361
|
+
enum TrackingEventType {
|
|
362
|
+
PAGE_VIEW = 'page_view', // 页面访问
|
|
363
|
+
PAGE_LEAVE = 'page_leave', // 页面离开
|
|
364
|
+
CLICK = 'click', // 点击事件
|
|
365
|
+
CUSTOM = 'custom' // 自定义事件
|
|
366
|
+
}
|
|
367
|
+
```
|
|
368
|
+
|
|
369
|
+
## 使用示例
|
|
370
|
+
|
|
371
|
+
### 基本点击事件
|
|
372
|
+
|
|
373
|
+
```typescript
|
|
374
|
+
import { trackClick } from '~/utils/tracking/tracking-sdk'
|
|
375
|
+
|
|
376
|
+
// 点击事件埋点
|
|
377
|
+
await trackClick('add_to_cart_btn', '加入购物车按钮')
|
|
378
|
+
```
|
|
379
|
+
|
|
380
|
+
### 自定义业务事件
|
|
381
|
+
|
|
382
|
+
```typescript
|
|
383
|
+
import { trackCustom } from '~/utils/tracking/tracking-sdk'
|
|
384
|
+
|
|
385
|
+
// 自定义事件埋点
|
|
386
|
+
await trackCustom('purchase_complete', {
|
|
387
|
+
order_id: 'ORDER_123',
|
|
388
|
+
amount: 99.99,
|
|
389
|
+
currency: 'CNY',
|
|
390
|
+
})
|
|
391
|
+
```
|
|
392
|
+
|
|
393
|
+
### 带性能数据的埋点
|
|
394
|
+
|
|
395
|
+
页面访问时会自动采集性能数据,也可以手动传入额外的性能数据:
|
|
396
|
+
|
|
397
|
+
```typescript
|
|
398
|
+
import { trackCustom, trackPageView } from '~/utils/tracking/tracking-sdk'
|
|
399
|
+
|
|
400
|
+
// 页面访问时自动采集性能数据(page_load_time、response_time、memory_usage)
|
|
401
|
+
await trackPageView('商品详情页')
|
|
402
|
+
|
|
403
|
+
// 手动传入额外的性能数据
|
|
404
|
+
await trackCustom('api_call', {
|
|
405
|
+
api_name: '/api/products/list',
|
|
406
|
+
performance: {
|
|
407
|
+
response_time: 1200,
|
|
408
|
+
network_latency: 350,
|
|
409
|
+
},
|
|
410
|
+
})
|
|
411
|
+
```
|
|
412
|
+
|
|
413
|
+
### 带错误信息的埋点
|
|
414
|
+
|
|
415
|
+
```typescript
|
|
416
|
+
import { trackCustom } from '~/utils/tracking/tracking-sdk'
|
|
417
|
+
|
|
418
|
+
// 带错误信息的埋点
|
|
419
|
+
await trackCustom('error_occurred', {
|
|
420
|
+
error: {
|
|
421
|
+
error_code: 'TIMEOUT',
|
|
422
|
+
error_message: '请求超时',
|
|
423
|
+
error_level: 'error',
|
|
424
|
+
error_context: 'UserProfileService',
|
|
425
|
+
},
|
|
426
|
+
})
|
|
427
|
+
```
|
|
428
|
+
|
|
429
|
+
更多示例请参考 `examples/data-structure-example.ts`。
|
|
430
|
+
|
|
431
|
+
## 最佳实践
|
|
432
|
+
|
|
433
|
+
1. **页面级埋点**:在页面组件中使用 `usePageTracking` 启用自动埋点
|
|
434
|
+
2. **组件级埋点**:在需要埋点的组件中使用 `useAutoTracking`
|
|
435
|
+
3. **业务埋点**:在关键业务节点使用 `trackCustom` 或 `trackBusiness`
|
|
436
|
+
4. **调试模式**:开发环境开启调试模式,生产环境关闭
|
|
437
|
+
5. **异步处理**:所有埋点方法都是异步的,使用 `await` 或 `.catch()` 处理错误
|
|
438
|
+
|
|
439
|
+
## 注意事项
|
|
440
|
+
|
|
441
|
+
1. **异步方法**:所有埋点方法都是异步的,需要使用 `await` 关键字
|
|
442
|
+
2. **数据字段**:数据字段名使用下划线命名法 (snake_case) 符合后端规范
|
|
443
|
+
3. **时间戳**:使用毫秒级 Unix 时间戳
|
|
444
|
+
4. **自动采集**:SDK 会自动采集设备信息、应用信息等
|
|
445
|
+
5. **批量发送**:埋点数据会自动批量发送,无需手动处理
|
|
446
|
+
6. **网络异常**:网络异常时会自动重试发送
|
|
447
|
+
7. **敏感信息**:敏感信息不要通过埋点传递
|
|
448
|
+
8. **性能影响**:埋点数据量较大时注意性能影响
|
|
449
|
+
9. **页面链路追踪**:SDK 会自动记录页面访问历史(最多保存 10 条),即使使用 `switchTab` 清空页面栈,也能正确追踪上一页信息
|
|
450
|
+
|
|
451
|
+
## 核心特性
|
|
452
|
+
|
|
453
|
+
### 1. 页面链路追踪
|
|
454
|
+
|
|
455
|
+
SDK 实现了基于本地存储的页面链路追踪机制,解决了小程序 `switchTab` 导致页面栈重置的问题:
|
|
456
|
+
|
|
457
|
+
**历史记录追踪**
|
|
458
|
+
- 完全基于本地存储的历史记录获取上一页信息
|
|
459
|
+
- 不依赖页面栈 `getCurrentPages()`,避免 `switchTab` 导致的链路中断
|
|
460
|
+
|
|
461
|
+
**自动历史记录**
|
|
462
|
+
- 每次页面访问都会自动保存到本地存储
|
|
463
|
+
- 保留最近 10 条页面访问记录
|
|
464
|
+
- 支持跨会话追踪
|
|
465
|
+
|
|
466
|
+
**调试模式**
|
|
467
|
+
- 开启调试模式可查看详细的页面追踪日志
|
|
468
|
+
- 包含当前页、上一页、历史记录长度等信息
|
|
469
|
+
|
|
470
|
+
```typescript
|
|
471
|
+
// 开启调试模式查看页面追踪详情
|
|
472
|
+
trackingSDK.updateConfig({ debug: true })
|
|
473
|
+
```
|
|
474
|
+
|
|
475
|
+
### 2. 页面关闭时数据发送
|
|
476
|
+
|
|
477
|
+
SDK 实现了智能的数据发送机制,确保页面关闭时不丢失埋点数据:
|
|
478
|
+
|
|
479
|
+
**自动触发场景**
|
|
480
|
+
- 小程序隐藏(`onAppHide`)
|
|
481
|
+
- H5 页面卸载(`beforeunload`、`pagehide`)
|
|
482
|
+
- H5 页面隐藏(`visibilitychange`)
|
|
483
|
+
|
|
484
|
+
**发送策略**
|
|
485
|
+
- **H5 环境**:优先使用 `navigator.sendBeacon` API
|
|
486
|
+
- 专为页面卸载场景设计,不阻塞页面关闭
|
|
487
|
+
- 自动使用 pako 压缩数据,减少带宽消耗
|
|
488
|
+
- 如果 `sendBeacon` 失败,降级使用普通 HTTP 请求
|
|
489
|
+
- **小程序环境**:使用普通异步请求,自动 pako 压缩
|
|
490
|
+
|
|
491
|
+
```typescript
|
|
492
|
+
import { trackingSDK } from '~/utils/tracking/tracking-sdk'
|
|
493
|
+
|
|
494
|
+
// 手动触发立即发送
|
|
495
|
+
trackingSDK.flushNow()
|
|
496
|
+
```
|
|
497
|
+
|
|
498
|
+
**优势**
|
|
499
|
+
- 不会丢失页面关闭前的埋点数据
|
|
500
|
+
- 不阻塞页面关闭流程
|
|
501
|
+
- 跨平台支持,自动选择最优发送方式
|
|
502
|
+
|
|
503
|
+
## 故障排除
|
|
504
|
+
|
|
505
|
+
1. **埋点不生效**:检查是否启用了埋点功能
|
|
506
|
+
2. **数据未发送**:检查网络连接和API配置
|
|
507
|
+
3. **调试信息**:开启调试模式查看详细日志
|
|
508
|
+
4. **性能问题**:适当调整批量发送大小和间隔
|
|
509
|
+
5. **页面链路不准确**:开启调试模式查看页面追踪日志,确认历史记录是否正常保存
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 埋点指令入口文件
|
|
3
|
+
* 统一导出所有埋点指令
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import type { App } from 'vue'
|
|
7
|
+
import { installTrackClickDirective } from './track-click'
|
|
8
|
+
import { installTrackPageDirective } from './track-page'
|
|
9
|
+
import { installTrackScrollDirective } from './track-scroll'
|
|
10
|
+
import { installTrackSearchDirective } from './track-search'
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* 安装所有埋点指令
|
|
14
|
+
*/
|
|
15
|
+
export function installTrackingDirectives(app: App) {
|
|
16
|
+
// 安装点击埋点指令
|
|
17
|
+
installTrackClickDirective(app)
|
|
18
|
+
|
|
19
|
+
// 安装页面访问埋点指令
|
|
20
|
+
installTrackPageDirective(app)
|
|
21
|
+
|
|
22
|
+
// 安装滚动埋点指令
|
|
23
|
+
installTrackScrollDirective(app)
|
|
24
|
+
|
|
25
|
+
// 安装搜索埋点指令
|
|
26
|
+
installTrackSearchDirective(app)
|
|
27
|
+
|
|
28
|
+
console.log('[TrackingDirectives] 所有埋点指令安装完成')
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
// 导出各个指令的安装函数
|
|
32
|
+
export { installTrackClickDirective, installTrackPageDirective, installTrackScrollDirective, installTrackSearchDirective }
|
|
33
|
+
|
|
34
|
+
// 导出指令实现
|
|
35
|
+
export { default as trackClickDirective } from './track-click'
|
|
36
|
+
export { default as trackPageDirective } from './track-page'
|
|
37
|
+
export { default as trackScrollDirective } from './track-scroll'
|
|
38
|
+
export { default as trackSearchDirective } from './track-search'
|
|
39
|
+
|
|
40
|
+
export default installTrackingDirectives
|