mon-reactive-h5 1.0.6
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 +310 -0
- package/dist/BatchReporter.d.ts +56 -0
- package/dist/BatchReporter.js +231 -0
- package/dist/BatchReporter.js.map +1 -0
- package/dist/MonitorSDK.d.ts +141 -0
- package/dist/MonitorSDK.js +913 -0
- package/dist/MonitorSDK.js.map +1 -0
- package/dist/index.d.ts +30 -0
- package/dist/index.js +150 -0
- package/dist/index.js.map +1 -0
- package/dist/packages/basic-sdk.d.ts +18 -0
- package/dist/packages/basic-sdk.js +73 -0
- package/dist/packages/basic-sdk.js.map +1 -0
- package/dist/packages/index.d.ts +16 -0
- package/dist/packages/index.js +98 -0
- package/dist/packages/index.js.map +1 -0
- package/dist/packages/premium-sdk.d.ts +69 -0
- package/dist/packages/premium-sdk.js +236 -0
- package/dist/packages/premium-sdk.js.map +1 -0
- package/dist/packages/standard-sdk.d.ts +22 -0
- package/dist/packages/standard-sdk.js +78 -0
- package/dist/packages/standard-sdk.js.map +1 -0
- package/dist/reporters.d.ts +32 -0
- package/dist/reporters.js +204 -0
- package/dist/reporters.js.map +1 -0
- package/dist/types.d.ts +120 -0
- package/dist/types.js +6 -0
- package/dist/types.js.map +1 -0
- package/package.json +50 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) [year] [author]
|
|
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,310 @@
|
|
|
1
|
+
# mon-reactive-sdk
|
|
2
|
+
|
|
3
|
+
前端监控SDK - 支持页面浏览、JS错误、API请求、资源错误监控
|
|
4
|
+
|
|
5
|
+
## 功能特性
|
|
6
|
+
|
|
7
|
+
- **页面浏览监控**:自动记录页面访问次数、停留时间
|
|
8
|
+
- **JS错误监控**:捕获运行时错误、Promise错误
|
|
9
|
+
- **API请求监控**:跟踪HTTP请求性能、成功率
|
|
10
|
+
- **资源错误监控**:监控静态资源加载失败
|
|
11
|
+
- **多平台支持**:H5、Vue、React、uni-app、微信小程序
|
|
12
|
+
- **三种版本选择**:Basic、Standard、Premium
|
|
13
|
+
|
|
14
|
+
## 安装
|
|
15
|
+
|
|
16
|
+
```bash
|
|
17
|
+
# npm
|
|
18
|
+
npm install mon-reactive-sdk
|
|
19
|
+
|
|
20
|
+
# yarn
|
|
21
|
+
yarn add mon-reactive-sdk
|
|
22
|
+
|
|
23
|
+
# pnpm
|
|
24
|
+
pnpm add mon-reactive-sdk
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
## 使用方法
|
|
28
|
+
|
|
29
|
+
### 1. 基础使用
|
|
30
|
+
|
|
31
|
+
```javascript
|
|
32
|
+
// 引入SDK
|
|
33
|
+
import { createStandardSDK } from 'mon-reactive-sdk';
|
|
34
|
+
|
|
35
|
+
// 初始化SDK
|
|
36
|
+
const sdk = createStandardSDK({
|
|
37
|
+
appId: 'your_app_id',
|
|
38
|
+
reportUrl: 'https://your-report-server.com/v1/report',
|
|
39
|
+
sampleRates: {
|
|
40
|
+
pageview: 1,
|
|
41
|
+
jserror: 1,
|
|
42
|
+
api: 0.3,
|
|
43
|
+
resource: 0.5
|
|
44
|
+
}
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
// 启动SDK
|
|
48
|
+
sdk.init();
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
### 2. React项目集成
|
|
52
|
+
|
|
53
|
+
```jsx
|
|
54
|
+
// main.jsx / main.tsx
|
|
55
|
+
import { createStandardSDK } from 'mon-reactive-sdk';
|
|
56
|
+
|
|
57
|
+
// 初始化SDK
|
|
58
|
+
const sdk = createStandardSDK({
|
|
59
|
+
appId: 'your_app_id',
|
|
60
|
+
reportUrl: 'https://your-report-server.com/v1/report'
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
// 启动SDK
|
|
64
|
+
sdk.init();
|
|
65
|
+
|
|
66
|
+
// 将SDK实例挂载到window,方便在组件中使用
|
|
67
|
+
window.monitorSDK = sdk;
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
### 3. Vue项目集成
|
|
71
|
+
|
|
72
|
+
#### Vue 3 项目集成
|
|
73
|
+
|
|
74
|
+
```javascript
|
|
75
|
+
// main.js
|
|
76
|
+
import { createApp } from 'vue';
|
|
77
|
+
import { createStandardSDK } from 'mon-reactive-sdk';
|
|
78
|
+
import App from './App.vue';
|
|
79
|
+
|
|
80
|
+
const app = createApp(App);
|
|
81
|
+
|
|
82
|
+
// 初始化SDK
|
|
83
|
+
const sdk = createStandardSDK({
|
|
84
|
+
appId: 'your_app_id',
|
|
85
|
+
reportUrl: 'https://your-report-server.com/v1/report'
|
|
86
|
+
});
|
|
87
|
+
|
|
88
|
+
// 启动SDK
|
|
89
|
+
sdk.init();
|
|
90
|
+
|
|
91
|
+
// 挂载到全局属性
|
|
92
|
+
app.config.globalProperties.$monitor = sdk;
|
|
93
|
+
|
|
94
|
+
app.mount('#app');
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
#### Vue 2 项目集成
|
|
98
|
+
|
|
99
|
+
```javascript
|
|
100
|
+
// main.js
|
|
101
|
+
import Vue from 'vue';
|
|
102
|
+
import { createStandardSDK } from 'mon-reactive-sdk';
|
|
103
|
+
import App from './App.vue';
|
|
104
|
+
|
|
105
|
+
// 初始化SDK
|
|
106
|
+
const sdk = createStandardSDK({
|
|
107
|
+
appId: 'your_app_id',
|
|
108
|
+
reportUrl: 'https://your-report-server.com/v1/report'
|
|
109
|
+
});
|
|
110
|
+
|
|
111
|
+
// 启动SDK
|
|
112
|
+
sdk.init();
|
|
113
|
+
|
|
114
|
+
// 通过Vue原型挂载到全局
|
|
115
|
+
Vue.prototype.$monitor = sdk;
|
|
116
|
+
|
|
117
|
+
// 创建Vue实例
|
|
118
|
+
new Vue({
|
|
119
|
+
render: h => h(App)
|
|
120
|
+
}).$mount('#app');
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
### 4. Vue 2 项目中的使用示例
|
|
124
|
+
|
|
125
|
+
```javascript
|
|
126
|
+
// 在组件中使用
|
|
127
|
+
import Vue from 'vue';
|
|
128
|
+
|
|
129
|
+
export default {
|
|
130
|
+
mounted() {
|
|
131
|
+
// 访问全局SDK实例
|
|
132
|
+
const monitor = this.$monitor;
|
|
133
|
+
|
|
134
|
+
// 手动上报用户行为
|
|
135
|
+
monitor.trackUserAction('component_mounted', {
|
|
136
|
+
component: 'MyComponent',
|
|
137
|
+
timestamp: Date.now()
|
|
138
|
+
});
|
|
139
|
+
|
|
140
|
+
// 手动设置用户ID
|
|
141
|
+
if (this.$store.state.user.id) {
|
|
142
|
+
monitor.setUserId(this.$store.state.user.id);
|
|
143
|
+
}
|
|
144
|
+
},
|
|
145
|
+
methods: {
|
|
146
|
+
handleClick() {
|
|
147
|
+
// 上报点击事件
|
|
148
|
+
this.$monitor.trackUserAction('button_clicked', {
|
|
149
|
+
button: 'submit',
|
|
150
|
+
formName: 'loginForm'
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
},
|
|
154
|
+
beforeDestroy() {
|
|
155
|
+
// 可以在这里上报组件卸载事件
|
|
156
|
+
this.$monitor.trackUserAction('component_destroyed', {
|
|
157
|
+
component: 'MyComponent'
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
### 5. Vue 2 路由集成
|
|
164
|
+
|
|
165
|
+
```javascript
|
|
166
|
+
// router/index.js
|
|
167
|
+
import Vue from 'vue';
|
|
168
|
+
import Router from 'vue-router';
|
|
169
|
+
import routes from './routes';
|
|
170
|
+
|
|
171
|
+
Vue.use(Router);
|
|
172
|
+
|
|
173
|
+
const router = new Router({
|
|
174
|
+
routes
|
|
175
|
+
});
|
|
176
|
+
|
|
177
|
+
// 路由守卫中集成SDK
|
|
178
|
+
router.beforeEach((to, from, next) => {
|
|
179
|
+
// 记录路由切换
|
|
180
|
+
if (Vue.prototype.$monitor) {
|
|
181
|
+
Vue.prototype.$monitor.trackUserAction('route_change', {
|
|
182
|
+
from: from.path,
|
|
183
|
+
to: to.path,
|
|
184
|
+
timestamp: Date.now()
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
next();
|
|
188
|
+
});
|
|
189
|
+
|
|
190
|
+
export default router;
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
## SDK版本选择
|
|
194
|
+
|
|
195
|
+
- **BasicSDK**:轻量版本,仅包含页面浏览和JS错误监控
|
|
196
|
+
- **StandardSDK**:标准版本,包含所有基础功能,合理的采样率设置
|
|
197
|
+
- **PremiumSDK**:高级版本,包含所有功能,更高的采样率,支持更多高级特性
|
|
198
|
+
|
|
199
|
+
```javascript
|
|
200
|
+
// 选择合适的版本
|
|
201
|
+
import { createBasicSDK, createStandardSDK, createPremiumSDK } from 'mon-reactive-sdk';
|
|
202
|
+
|
|
203
|
+
// 或者使用SDK选择器
|
|
204
|
+
import { createSDK } from 'mon-reactive-sdk';
|
|
205
|
+
|
|
206
|
+
const sdk = createSDK({
|
|
207
|
+
appId: 'your_app_id',
|
|
208
|
+
reportUrl: 'https://your-report-server.com/v1/report',
|
|
209
|
+
tier: 'standard' // basic, standard, premium
|
|
210
|
+
});
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
## 配置项
|
|
214
|
+
|
|
215
|
+
| 配置项 | 类型 | 默认值 | 说明 |
|
|
216
|
+
| --- | --- | --- | --- |
|
|
217
|
+
| appId | string | 无 | 应用唯一标识,必填 |
|
|
218
|
+
| reportUrl | string | 无 | 上报地址,必填 |
|
|
219
|
+
| version | string | - | 应用版本号,可选。如果不提供,PC端会尝试从process.env.VUE_APP_VERSION获取,小程序和APP会使用各自平台的版本号 |
|
|
220
|
+
| sampleRates | object | - | 各类型数据的采样率 |
|
|
221
|
+
| isMiniProgram | boolean | false | 是否为小程序环境 |
|
|
222
|
+
| isApp | boolean | false | 是否为APP环境 |
|
|
223
|
+
| platform | string | - | 平台标识 |
|
|
224
|
+
| userId | string | - | 用户ID,可后续通过setUserId更新 |
|
|
225
|
+
|
|
226
|
+
## 实例方法
|
|
227
|
+
|
|
228
|
+
### sdk.init()
|
|
229
|
+
启动SDK,初始化所有监控
|
|
230
|
+
|
|
231
|
+
### sdk.setUserId(userId)
|
|
232
|
+
设置用户ID,用于用户行为跟踪
|
|
233
|
+
|
|
234
|
+
### sdk.trackUserAction(actionName, params)
|
|
235
|
+
手动跟踪用户行为
|
|
236
|
+
|
|
237
|
+
### sdk.reportPageView(data)
|
|
238
|
+
手动上报页面浏览数据
|
|
239
|
+
|
|
240
|
+
### sdk.reportJSError(error)
|
|
241
|
+
手动上报JS错误
|
|
242
|
+
|
|
243
|
+
### sdk.reportApi(data)
|
|
244
|
+
手动上报API请求数据
|
|
245
|
+
|
|
246
|
+
### sdk.reportResourceError(data)
|
|
247
|
+
手动上报资源错误
|
|
248
|
+
|
|
249
|
+
## 更多文档
|
|
250
|
+
|
|
251
|
+
详细使用说明请参考 [SDK集成指南](./SDK集成指南.md)
|
|
252
|
+
|
|
253
|
+
## 浏览器兼容性
|
|
254
|
+
|
|
255
|
+
SDK 兼容所有现代浏览器,包括 Chrome、Firefox、Safari、Edge 等。同时也兼容 IE 11 浏览器(需要 polyfill 支持)。
|
|
256
|
+
|
|
257
|
+
## Vue 2 项目常见问题解决
|
|
258
|
+
|
|
259
|
+
### 解决 "digital envelope routines::unsupported" 错误
|
|
260
|
+
|
|
261
|
+
在 Vue 2 项目中安装 SDK 后,如果遇到以下错误:
|
|
262
|
+
|
|
263
|
+
```
|
|
264
|
+
Error: error:0308010C:digital envelope routines::unsupported
|
|
265
|
+
```
|
|
266
|
+
|
|
267
|
+
这是由于 Node.js 版本过高(v17+)与 webpack 4(Vue 2 常用版本)的兼容性问题导致的。可以通过以下方法解决:
|
|
268
|
+
|
|
269
|
+
#### 方法一:设置环境变量
|
|
270
|
+
|
|
271
|
+
在项目根目录创建 `.env` 文件,添加以下内容:
|
|
272
|
+
|
|
273
|
+
```
|
|
274
|
+
NODE_OPTIONS=--openssl-legacy-provider
|
|
275
|
+
```
|
|
276
|
+
|
|
277
|
+
或者在启动命令前添加环境变量:
|
|
278
|
+
|
|
279
|
+
```bash
|
|
280
|
+
# Linux/Mac
|
|
281
|
+
NODE_OPTIONS=--openssl-legacy-provider npm run dev
|
|
282
|
+
|
|
283
|
+
# Windows (命令提示符)
|
|
284
|
+
set NODE_OPTIONS=--openssl-legacy-provider && npm run dev
|
|
285
|
+
|
|
286
|
+
# Windows (PowerShell)
|
|
287
|
+
$env:NODE_OPTIONS="--openssl-legacy-provider" && npm run dev
|
|
288
|
+
```
|
|
289
|
+
|
|
290
|
+
#### 方法二:降级 Node.js 版本
|
|
291
|
+
|
|
292
|
+
暂时切换到 Node.js v16 或更低版本运行项目。
|
|
293
|
+
|
|
294
|
+
#### 方法三:更新 webpack 配置
|
|
295
|
+
|
|
296
|
+
如果使用 webpack 配置,可以在 webpack 配置文件中添加:
|
|
297
|
+
|
|
298
|
+
```javascript
|
|
299
|
+
// webpack.config.js
|
|
300
|
+
module.exports = {
|
|
301
|
+
// 其他配置...
|
|
302
|
+
node: {
|
|
303
|
+
crypto: true,
|
|
304
|
+
stream: true
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
## 许可证
|
|
309
|
+
|
|
310
|
+
[MIT](./LICENSE)
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { BaseReportData } from './types';
|
|
2
|
+
/**
|
|
3
|
+
* 批量上报器类
|
|
4
|
+
* 用于合并多个同类事件并批量上报,减少网络请求次数
|
|
5
|
+
*/
|
|
6
|
+
export declare class BatchReporter {
|
|
7
|
+
private url;
|
|
8
|
+
private batchSize;
|
|
9
|
+
private interval;
|
|
10
|
+
private buffer;
|
|
11
|
+
private timer;
|
|
12
|
+
private isFlushing;
|
|
13
|
+
/**
|
|
14
|
+
* 构造函数
|
|
15
|
+
* @param config 批量上报器配置
|
|
16
|
+
*/
|
|
17
|
+
constructor(config: {
|
|
18
|
+
url: string;
|
|
19
|
+
batchSize?: number;
|
|
20
|
+
interval?: number;
|
|
21
|
+
});
|
|
22
|
+
/**
|
|
23
|
+
* 初始化批量上报器
|
|
24
|
+
*/
|
|
25
|
+
private init;
|
|
26
|
+
/**
|
|
27
|
+
* 批量上报数据
|
|
28
|
+
* @param data 上报数据
|
|
29
|
+
*/
|
|
30
|
+
report(data: BaseReportData): void;
|
|
31
|
+
/**
|
|
32
|
+
* 添加数据到批量队列
|
|
33
|
+
*/
|
|
34
|
+
addData(data: BaseReportData): void;
|
|
35
|
+
/**
|
|
36
|
+
* 立即上报缓冲区中的数据
|
|
37
|
+
*/
|
|
38
|
+
flush(): Promise<void>;
|
|
39
|
+
/**
|
|
40
|
+
* 同步上报数据(用于页面卸载时)
|
|
41
|
+
*/
|
|
42
|
+
private flushSync;
|
|
43
|
+
/**
|
|
44
|
+
* 执行上报
|
|
45
|
+
* @param data 要上报的数据数组
|
|
46
|
+
*/
|
|
47
|
+
private sendReport;
|
|
48
|
+
/**
|
|
49
|
+
* 获取当前缓冲区大小
|
|
50
|
+
*/
|
|
51
|
+
getBufferSize(): number;
|
|
52
|
+
/**
|
|
53
|
+
* 销毁批量上报器
|
|
54
|
+
*/
|
|
55
|
+
destroy(): void;
|
|
56
|
+
}
|
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
|
|
4
|
+
function _regenerator() { /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */ var e, t, r = "function" == typeof Symbol ? Symbol : {}, n = r.iterator || "@@iterator", o = r.toStringTag || "@@toStringTag"; function i(r, n, o, i) { var c = n && n.prototype instanceof Generator ? n : Generator, u = Object.create(c.prototype); return _regeneratorDefine2(u, "_invoke", function (r, n, o) { var i, c, u, f = 0, p = o || [], y = !1, G = { p: 0, n: 0, v: e, a: d, f: d.bind(e, 4), d: function d(t, r) { return i = t, c = 0, u = e, G.n = r, a; } }; function d(r, n) { for (c = r, u = n, t = 0; !y && f && !o && t < p.length; t++) { var o, i = p[t], d = G.p, l = i[2]; r > 3 ? (o = l === n) && (u = i[(c = i[4]) ? 5 : (c = 3, 3)], i[4] = i[5] = e) : i[0] <= d && ((o = r < 2 && d < i[1]) ? (c = 0, G.v = n, G.n = i[1]) : d < l && (o = r < 3 || i[0] > n || n > l) && (i[4] = r, i[5] = n, G.n = l, c = 0)); } if (o || r > 1) return a; throw y = !0, n; } return function (o, p, l) { if (f > 1) throw TypeError("Generator is already running"); for (y && 1 === p && d(p, l), c = p, u = l; (t = c < 2 ? e : u) || !y;) { i || (c ? c < 3 ? (c > 1 && (G.n = -1), d(c, u)) : G.n = u : G.v = u); try { if (f = 2, i) { if (c || (o = "next"), t = i[o]) { if (!(t = t.call(i, u))) throw TypeError("iterator result is not an object"); if (!t.done) return t; u = t.value, c < 2 && (c = 0); } else 1 === c && (t = i.return) && t.call(i), c < 2 && (u = TypeError("The iterator does not provide a '" + o + "' method"), c = 1); i = e; } else if ((t = (y = G.n < 0) ? u : r.call(n, G)) !== a) break; } catch (t) { i = e, c = 1, u = t; } finally { f = 1; } } return { value: t, done: y }; }; }(r, o, i), !0), u; } var a = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} t = Object.getPrototypeOf; var c = [][n] ? t(t([][n]())) : (_regeneratorDefine2(t = {}, n, function () { return this; }), t), u = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(c); function f(e) { return Object.setPrototypeOf ? Object.setPrototypeOf(e, GeneratorFunctionPrototype) : (e.__proto__ = GeneratorFunctionPrototype, _regeneratorDefine2(e, o, "GeneratorFunction")), e.prototype = Object.create(u), e; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, _regeneratorDefine2(u, "constructor", GeneratorFunctionPrototype), _regeneratorDefine2(GeneratorFunctionPrototype, "constructor", GeneratorFunction), GeneratorFunction.displayName = "GeneratorFunction", _regeneratorDefine2(GeneratorFunctionPrototype, o, "GeneratorFunction"), _regeneratorDefine2(u), _regeneratorDefine2(u, o, "Generator"), _regeneratorDefine2(u, n, function () { return this; }), _regeneratorDefine2(u, "toString", function () { return "[object Generator]"; }), (_regenerator = function _regenerator() { return { w: i, m: f }; })(); }
|
|
5
|
+
function _regeneratorDefine2(e, r, n, t) { var i = Object.defineProperty; try { i({}, "", {}); } catch (e) { i = 0; } _regeneratorDefine2 = function _regeneratorDefine(e, r, n, t) { function o(r, n) { _regeneratorDefine2(e, r, function (e) { return this._invoke(r, n, e); }); } r ? i ? i(e, r, { value: n, enumerable: !t, configurable: !t, writable: !t }) : e[r] = n : (o("next", 0), o("throw", 1), o("return", 2)); }, _regeneratorDefine2(e, r, n, t); }
|
|
6
|
+
function _toConsumableArray(r) { return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray(r) || _nonIterableSpread(); }
|
|
7
|
+
function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
|
|
8
|
+
function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
|
|
9
|
+
function _iterableToArray(r) { if ("undefined" != typeof Symbol && null != r[Symbol.iterator] || null != r["@@iterator"]) return Array.from(r); }
|
|
10
|
+
function _arrayWithoutHoles(r) { if (Array.isArray(r)) return _arrayLikeToArray(r); }
|
|
11
|
+
function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
|
|
12
|
+
function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); }
|
|
13
|
+
function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } }
|
|
14
|
+
function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; }
|
|
15
|
+
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; }
|
|
16
|
+
function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
|
|
17
|
+
var __awaiter = void 0 && (void 0).__awaiter || function (thisArg, _arguments, P, generator) {
|
|
18
|
+
function adopt(value) {
|
|
19
|
+
return value instanceof P ? value : new P(function (resolve) {
|
|
20
|
+
resolve(value);
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
24
|
+
function fulfilled(value) {
|
|
25
|
+
try {
|
|
26
|
+
step(generator.next(value));
|
|
27
|
+
} catch (e) {
|
|
28
|
+
reject(e);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
function rejected(value) {
|
|
32
|
+
try {
|
|
33
|
+
step(generator["throw"](value));
|
|
34
|
+
} catch (e) {
|
|
35
|
+
reject(e);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
function step(result) {
|
|
39
|
+
result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected);
|
|
40
|
+
}
|
|
41
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
42
|
+
});
|
|
43
|
+
};
|
|
44
|
+
Object.defineProperty(exports, "__esModule", {
|
|
45
|
+
value: true
|
|
46
|
+
});
|
|
47
|
+
exports.BatchReporter = void 0;
|
|
48
|
+
var reporters_1 = require("./reporters");
|
|
49
|
+
/**
|
|
50
|
+
* 批量上报器类
|
|
51
|
+
* 用于合并多个同类事件并批量上报,减少网络请求次数
|
|
52
|
+
*/
|
|
53
|
+
var BatchReporter = /*#__PURE__*/function () {
|
|
54
|
+
/**
|
|
55
|
+
* 构造函数
|
|
56
|
+
* @param config 批量上报器配置
|
|
57
|
+
*/
|
|
58
|
+
function BatchReporter(config) {
|
|
59
|
+
_classCallCheck(this, BatchReporter);
|
|
60
|
+
this.url = config.url;
|
|
61
|
+
this.batchSize = config.batchSize || 10;
|
|
62
|
+
this.interval = config.interval || 5000;
|
|
63
|
+
this.buffer = [];
|
|
64
|
+
this.timer = null;
|
|
65
|
+
this.isFlushing = false;
|
|
66
|
+
this.init();
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* 初始化批量上报器
|
|
70
|
+
*/
|
|
71
|
+
return _createClass(BatchReporter, [{
|
|
72
|
+
key: "init",
|
|
73
|
+
value: function init() {
|
|
74
|
+
var _this = this;
|
|
75
|
+
// 设置定时上报
|
|
76
|
+
this.timer = window.setInterval(function () {
|
|
77
|
+
_this.flush();
|
|
78
|
+
}, this.interval);
|
|
79
|
+
// 页面卸载时清理
|
|
80
|
+
window.addEventListener('beforeunload', function () {
|
|
81
|
+
_this.flush();
|
|
82
|
+
_this.destroy();
|
|
83
|
+
});
|
|
84
|
+
// 页面关闭前最后尝试
|
|
85
|
+
window.addEventListener('unload', function () {
|
|
86
|
+
if (_this.buffer.length > 0) {
|
|
87
|
+
_this.flushSync();
|
|
88
|
+
}
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* 批量上报数据
|
|
93
|
+
* @param data 上报数据
|
|
94
|
+
*/
|
|
95
|
+
}, {
|
|
96
|
+
key: "report",
|
|
97
|
+
value: function report(data) {
|
|
98
|
+
this.buffer.push(data);
|
|
99
|
+
// 当缓冲区达到阈值时,立即上报
|
|
100
|
+
if (this.buffer.length >= this.batchSize) {
|
|
101
|
+
this.flush();
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* 添加数据到批量队列
|
|
106
|
+
*/
|
|
107
|
+
}, {
|
|
108
|
+
key: "addData",
|
|
109
|
+
value: function addData(data) {
|
|
110
|
+
this.report(data);
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* 立即上报缓冲区中的数据
|
|
114
|
+
*/
|
|
115
|
+
}, {
|
|
116
|
+
key: "flush",
|
|
117
|
+
value: function flush() {
|
|
118
|
+
return __awaiter(this, void 0, void 0, /*#__PURE__*/_regenerator().m(function _callee() {
|
|
119
|
+
var dataToReport, _t;
|
|
120
|
+
return _regenerator().w(function (_context) {
|
|
121
|
+
while (1) switch (_context.p = _context.n) {
|
|
122
|
+
case 0:
|
|
123
|
+
if (!(this.isFlushing || this.buffer.length === 0)) {
|
|
124
|
+
_context.n = 1;
|
|
125
|
+
break;
|
|
126
|
+
}
|
|
127
|
+
return _context.a(2);
|
|
128
|
+
case 1:
|
|
129
|
+
this.isFlushing = true;
|
|
130
|
+
_context.p = 2;
|
|
131
|
+
// 复制缓冲区数据,然后清空
|
|
132
|
+
dataToReport = _toConsumableArray(this.buffer);
|
|
133
|
+
this.buffer = [];
|
|
134
|
+
_context.n = 3;
|
|
135
|
+
return this.sendReport(dataToReport);
|
|
136
|
+
case 3:
|
|
137
|
+
_context.n = 5;
|
|
138
|
+
break;
|
|
139
|
+
case 4:
|
|
140
|
+
_context.p = 4;
|
|
141
|
+
_t = _context.v;
|
|
142
|
+
console.error('批量上报失败:', _t);
|
|
143
|
+
case 5:
|
|
144
|
+
_context.p = 5;
|
|
145
|
+
this.isFlushing = false;
|
|
146
|
+
return _context.f(5);
|
|
147
|
+
case 6:
|
|
148
|
+
return _context.a(2);
|
|
149
|
+
}
|
|
150
|
+
}, _callee, this, [[2, 4, 5, 6]]);
|
|
151
|
+
}));
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* 同步上报数据(用于页面卸载时)
|
|
155
|
+
*/
|
|
156
|
+
}, {
|
|
157
|
+
key: "flushSync",
|
|
158
|
+
value: function flushSync() {
|
|
159
|
+
try {
|
|
160
|
+
var dataToReport = _toConsumableArray(this.buffer);
|
|
161
|
+
var payload = {
|
|
162
|
+
type: 'batch',
|
|
163
|
+
items: dataToReport
|
|
164
|
+
};
|
|
165
|
+
// 尝试使用 sendBeacon 同步上报
|
|
166
|
+
// 注意:上报地址已在reportByBeacon内部固定为/v1/report/collect
|
|
167
|
+
(0, reporters_1.reportByBeacon)(payload, '');
|
|
168
|
+
} catch (error) {
|
|
169
|
+
console.error('同步上报失败:', error);
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* 执行上报
|
|
174
|
+
* @param data 要上报的数据数组
|
|
175
|
+
*/
|
|
176
|
+
}, {
|
|
177
|
+
key: "sendReport",
|
|
178
|
+
value: function sendReport(data) {
|
|
179
|
+
return __awaiter(this, void 0, void 0, /*#__PURE__*/_regenerator().m(function _callee2() {
|
|
180
|
+
var payload, success;
|
|
181
|
+
return _regenerator().w(function (_context2) {
|
|
182
|
+
while (1) switch (_context2.n) {
|
|
183
|
+
case 0:
|
|
184
|
+
payload = {
|
|
185
|
+
type: 'batch',
|
|
186
|
+
items: data
|
|
187
|
+
}; // 优先使用 sendBeacon
|
|
188
|
+
// 注意:上报地址已在各上报方法内部固定
|
|
189
|
+
success = (0, reporters_1.reportByBeacon)(payload, '');
|
|
190
|
+
if (success) {
|
|
191
|
+
_context2.n = 1;
|
|
192
|
+
break;
|
|
193
|
+
}
|
|
194
|
+
// 失败则降级到图片标签上报
|
|
195
|
+
success = (0, reporters_1.reportByImg)(payload, '');
|
|
196
|
+
if (success) {
|
|
197
|
+
_context2.n = 1;
|
|
198
|
+
break;
|
|
199
|
+
}
|
|
200
|
+
_context2.n = 1;
|
|
201
|
+
return (0, reporters_1.reportByApi)(payload, '');
|
|
202
|
+
case 1:
|
|
203
|
+
return _context2.a(2);
|
|
204
|
+
}
|
|
205
|
+
}, _callee2);
|
|
206
|
+
}));
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* 获取当前缓冲区大小
|
|
210
|
+
*/
|
|
211
|
+
}, {
|
|
212
|
+
key: "getBufferSize",
|
|
213
|
+
value: function getBufferSize() {
|
|
214
|
+
return this.buffer.length;
|
|
215
|
+
}
|
|
216
|
+
/**
|
|
217
|
+
* 销毁批量上报器
|
|
218
|
+
*/
|
|
219
|
+
}, {
|
|
220
|
+
key: "destroy",
|
|
221
|
+
value: function destroy() {
|
|
222
|
+
if (this.timer !== null) {
|
|
223
|
+
clearInterval(this.timer);
|
|
224
|
+
this.timer = null;
|
|
225
|
+
}
|
|
226
|
+
this.buffer = [];
|
|
227
|
+
}
|
|
228
|
+
}]);
|
|
229
|
+
}();
|
|
230
|
+
exports.BatchReporter = BatchReporter;
|
|
231
|
+
//# sourceMappingURL=BatchReporter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BatchReporter.js","names":["reporters_1","require","BatchReporter","config","_classCallCheck","url","batchSize","interval","buffer","timer","isFlushing","init","_createClass","key","value","_this","window","setInterval","flush","addEventListener","destroy","length","flushSync","report","data","push","addData","_context","n","a","p","dataToReport","_toConsumableArray","sendReport","_t","v","console","error","f","_callee","payload","type","items","reportByBeacon","success","_context2","reportByImg","reportByApi","_callee2","getBufferSize","clearInterval","exports"],"sources":["../BatchReporter.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
|