monitor-track 1.12.1 → 1.14.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/CHANGELOG.md +18 -0
- package/README.md +6 -1
- package/cjs/handlers/error.d.ts +1 -0
- package/cjs/index.js +51 -30
- package/cjs/types/config.d.ts +11 -1
- package/esm/config/index.js +14 -0
- package/esm/handlers/error.d.ts +1 -0
- package/esm/handlers/error.js +18 -16
- package/esm/index.js +8 -5
- package/esm/package.json.js +1 -1
- package/esm/reporter.js +13 -11
- package/esm/types/config.d.ts +11 -1
- package/index.js +50 -29
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,24 @@
|
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
|
4
4
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
|
5
5
|
|
|
6
|
+
## [1.13.0](https://gitlab.seazonmotor.com/panda/CSD_UserBehaviorTracking/compare/monitor-track@1.12.1...monitor-track@1.13.0) (2026-05-22)
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
### ✨ Features
|
|
10
|
+
|
|
11
|
+
* 增加对页面卡顿的启用配置 ([28cd08c](https://gitlab.seazonmotor.com/panda/CSD_UserBehaviorTracking/commit/28cd08c975b003f791e02283cbee59167b054afa))
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
### [1.12.1](https://gitlab.seazonmotor.com/panda/CSD_UserBehaviorTracking/compare/monitor-track@1.12.0...monitor-track@1.12.1) (2026-05-22)
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
### 🐛 Bug Fixes
|
|
19
|
+
|
|
20
|
+
* 修复类型报错 ([460be3e](https://gitlab.seazonmotor.com/panda/CSD_UserBehaviorTracking/commit/460be3e82a782964e056693862ded6a25c8220a5))
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
|
|
6
24
|
## 1.12.0 (2026-05-06)
|
|
7
25
|
|
|
8
26
|
|
package/README.md
CHANGED
|
@@ -43,8 +43,13 @@ track.init({
|
|
|
43
43
|
| hash | boolean | 否 | false | 路由是否为 hash 模式 |
|
|
44
44
|
| enableBehavior | boolean | 否 | true | 启用用户行为上报 |
|
|
45
45
|
| enableError | boolean | 否 | true | 启用异常信息上报 |
|
|
46
|
+
| enableErrorScreenshot | boolean | 否 | false | 启用异常时的截图上报 |
|
|
47
|
+
| enableErrorEvent | boolean | 否 | false | 启用异常时的录像上报 |
|
|
46
48
|
| enableVisualTrack | boolean | 否 | false | 启用可视化埋点上报 |
|
|
47
|
-
|
|
|
49
|
+
| enableLagTrack | boolean | 否 | false | 启用页面卡顿信息上报 |
|
|
50
|
+
| lagTimeout | number | 否 | 400 | 页面卡顿上报的阈值时间(毫秒) |
|
|
51
|
+
| enableRecord | boolean | 否 | false | 启用页面录制 |
|
|
52
|
+
| ignore | 见下方 ignore | 否 | false | 忽略上报的信息 |
|
|
48
53
|
| customPayload | string | 否 | false | 自定义 payload |
|
|
49
54
|
| enable | boolean | 否 | false | 是否开启日志收集,默认关闭 |
|
|
50
55
|
| maxLength | number | 否 | 1000 | 最长上报数据长度 |
|
package/cjs/handlers/error.d.ts
CHANGED
package/cjs/index.js
CHANGED
|
@@ -44,7 +44,11 @@ const Config = {
|
|
|
44
44
|
hash: false,
|
|
45
45
|
enableBehavior: true,
|
|
46
46
|
enableError: true,
|
|
47
|
+
enableErrorScreenshot: false,
|
|
48
|
+
enableErrorEvent: false,
|
|
47
49
|
enableVisualTrack: false,
|
|
50
|
+
enableLagTrack: true,
|
|
51
|
+
enableRecord: false,
|
|
48
52
|
ignore: {
|
|
49
53
|
urls: [],
|
|
50
54
|
errors: [],
|
|
@@ -56,27 +60,39 @@ const Config = {
|
|
|
56
60
|
* @param config 配置项
|
|
57
61
|
*/
|
|
58
62
|
function setConfig(config) {
|
|
63
|
+
var _a;
|
|
59
64
|
Object.assign(Config, config);
|
|
65
|
+
if (!Config.ignore)
|
|
66
|
+
Config.ignore = {};
|
|
67
|
+
if (Array.isArray((_a = Config.ignore) === null || _a === void 0 ? void 0 : _a.errors)) {
|
|
68
|
+
['ResizeObserver loop limit exceeded', 'ResizeObserver loop completed with undelivered notifications.', 'Cancel'].forEach((item) => {
|
|
69
|
+
if (!Config.ignore.errors.includes(item)) {
|
|
70
|
+
Config.ignore.errors.push(item);
|
|
71
|
+
}
|
|
72
|
+
});
|
|
73
|
+
}
|
|
60
74
|
}
|
|
61
75
|
|
|
62
|
-
var version = "1.
|
|
76
|
+
var version = "1.14.0";
|
|
63
77
|
|
|
64
78
|
const eventsMatrix = [[]];
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
eventsMatrix.
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
79
|
+
function enableRecordFunc() {
|
|
80
|
+
rrweb__namespace.record({
|
|
81
|
+
emit(event, isCheckout) {
|
|
82
|
+
// isCheckout 是一个标识,告诉你重新制作了快照
|
|
83
|
+
if (isCheckout) {
|
|
84
|
+
eventsMatrix.push([]);
|
|
85
|
+
}
|
|
86
|
+
if (eventsMatrix.length > 2) {
|
|
87
|
+
eventsMatrix.shift();
|
|
88
|
+
}
|
|
89
|
+
const lastEvents = eventsMatrix[eventsMatrix.length - 1];
|
|
90
|
+
lastEvents.push(event);
|
|
91
|
+
},
|
|
92
|
+
// 每30秒重新制作快照
|
|
93
|
+
checkoutEveryNms: 30 * 1000,
|
|
94
|
+
});
|
|
95
|
+
}
|
|
80
96
|
/**
|
|
81
97
|
* @description 错误事件触发后的操作
|
|
82
98
|
*/
|
|
@@ -902,7 +918,7 @@ function reportFunc(data) {
|
|
|
902
918
|
delete ERROR_MESSAGE_MAP[message];
|
|
903
919
|
}, 3000);
|
|
904
920
|
const { p, pid, host, bN, pt } = payload;
|
|
905
|
-
if ((_c = data.error) === null || _c === void 0 ? void 0 : _c.events) {
|
|
921
|
+
if (((_c = data.error) === null || _c === void 0 ? void 0 : _c.events) && Config.enableErrorEvent) {
|
|
906
922
|
hasErrorEvent = true;
|
|
907
923
|
const errorEvent = data.error.events;
|
|
908
924
|
const delayTime = Math.ceil(Math.random() * 10000);
|
|
@@ -913,17 +929,19 @@ function reportFunc(data) {
|
|
|
913
929
|
});
|
|
914
930
|
}, delayTime < 3500 ? 3500 : delayTime);
|
|
915
931
|
}
|
|
916
|
-
|
|
917
|
-
|
|
918
|
-
|
|
919
|
-
|
|
920
|
-
|
|
921
|
-
|
|
932
|
+
if (Config.enableErrorScreenshot) {
|
|
933
|
+
picturePromise = getFullScreenShoot(filename)
|
|
934
|
+
.then((file) => {
|
|
935
|
+
return new Promise((res) => {
|
|
936
|
+
xhrFunc(file.name, data.uuid, filename, file, res, (result) => {
|
|
937
|
+
payload.error.pic = result;
|
|
938
|
+
}, { p, pid, host, bN, pt });
|
|
939
|
+
});
|
|
940
|
+
})
|
|
941
|
+
.catch((err) => {
|
|
942
|
+
payload.error.picError = (err === null || err === void 0 ? void 0 : err.stack) || (err === null || err === void 0 ? void 0 : err.toString());
|
|
922
943
|
});
|
|
923
|
-
}
|
|
924
|
-
.catch((err) => {
|
|
925
|
-
payload.error.picError = (err === null || err === void 0 ? void 0 : err.stack) || (err === null || err === void 0 ? void 0 : err.toString());
|
|
926
|
-
});
|
|
944
|
+
}
|
|
927
945
|
}
|
|
928
946
|
}
|
|
929
947
|
return picturePromise
|
|
@@ -1397,8 +1415,10 @@ class Track {
|
|
|
1397
1415
|
this.listenPageLag = () => {
|
|
1398
1416
|
this.observer = new PerformanceObserver((list) => {
|
|
1399
1417
|
list.getEntries().forEach((entry) => {
|
|
1400
|
-
if (entry.duration >
|
|
1418
|
+
if (entry.duration > (Config.lagTimeout || 800)) {
|
|
1401
1419
|
handlePageLag(entry.duration);
|
|
1420
|
+
// eslint-disable-next-line no-console
|
|
1421
|
+
console.log('监测到页面卡顿:', entry.duration, entry, location.href);
|
|
1402
1422
|
}
|
|
1403
1423
|
});
|
|
1404
1424
|
});
|
|
@@ -1433,8 +1453,9 @@ class Track {
|
|
|
1433
1453
|
Config.spa && this.addListenRouterChange();
|
|
1434
1454
|
Config.enableBehavior && this.addListenUserActivity();
|
|
1435
1455
|
Config.enableError && this.addListenJSUncaught();
|
|
1436
|
-
this.visualTrack();
|
|
1437
|
-
this.listenPageLag();
|
|
1456
|
+
Config.enableVisualTrack && this.visualTrack();
|
|
1457
|
+
Config.enableLagTrack && this.listenPageLag();
|
|
1458
|
+
Config.enableRecord && enableRecordFunc();
|
|
1438
1459
|
this.addListenUnload();
|
|
1439
1460
|
initWindowObjectFunction();
|
|
1440
1461
|
}
|
package/cjs/types/config.d.ts
CHANGED
|
@@ -16,6 +16,10 @@ export interface IConfig {
|
|
|
16
16
|
enableBehavior?: boolean;
|
|
17
17
|
/** 启用异常信息上报 */
|
|
18
18
|
enableError?: boolean;
|
|
19
|
+
/** 启用异常截图上报 */
|
|
20
|
+
enableErrorScreenshot?: boolean;
|
|
21
|
+
/** 启用异常录像上报 */
|
|
22
|
+
enableErrorEvent?: boolean;
|
|
19
23
|
maxLength?: number;
|
|
20
24
|
/** 忽略上报的信息 */
|
|
21
25
|
ignore?: {
|
|
@@ -31,10 +35,16 @@ export interface IConfig {
|
|
|
31
35
|
};
|
|
32
36
|
/** 自定义payload */
|
|
33
37
|
customPayload?: string;
|
|
34
|
-
/** 上报 xhr
|
|
38
|
+
/** 上报 xhr 请求超过指定时间 */
|
|
35
39
|
XMLHttpRequestTimeout?: number;
|
|
36
40
|
/** 启用可视化埋点 */
|
|
37
41
|
enableVisualTrack?: boolean;
|
|
42
|
+
/** 启用页面卡顿上报 */
|
|
43
|
+
enableLagTrack?: boolean;
|
|
44
|
+
/** 上报页面卡顿的超时时间 */
|
|
45
|
+
lagTimeout?: number;
|
|
46
|
+
/** 是否启用页面录制 */
|
|
47
|
+
enableRecord: boolean;
|
|
38
48
|
}
|
|
39
49
|
type IParams = {
|
|
40
50
|
name: string;
|
package/esm/config/index.js
CHANGED
|
@@ -10,7 +10,11 @@ const Config = {
|
|
|
10
10
|
hash: false,
|
|
11
11
|
enableBehavior: true,
|
|
12
12
|
enableError: true,
|
|
13
|
+
enableErrorScreenshot: false,
|
|
14
|
+
enableErrorEvent: false,
|
|
13
15
|
enableVisualTrack: false,
|
|
16
|
+
enableLagTrack: true,
|
|
17
|
+
enableRecord: false,
|
|
14
18
|
ignore: {
|
|
15
19
|
urls: [],
|
|
16
20
|
errors: [],
|
|
@@ -22,7 +26,17 @@ const Config = {
|
|
|
22
26
|
* @param config 配置项
|
|
23
27
|
*/
|
|
24
28
|
function setConfig(config) {
|
|
29
|
+
var _a;
|
|
25
30
|
Object.assign(Config, config);
|
|
31
|
+
if (!Config.ignore)
|
|
32
|
+
Config.ignore = {};
|
|
33
|
+
if (Array.isArray((_a = Config.ignore) === null || _a === void 0 ? void 0 : _a.errors)) {
|
|
34
|
+
['ResizeObserver loop limit exceeded', 'ResizeObserver loop completed with undelivered notifications.', 'Cancel'].forEach((item) => {
|
|
35
|
+
if (!Config.ignore.errors.includes(item)) {
|
|
36
|
+
Config.ignore.errors.push(item);
|
|
37
|
+
}
|
|
38
|
+
});
|
|
39
|
+
}
|
|
26
40
|
}
|
|
27
41
|
|
|
28
42
|
export { Config, setConfig };
|
package/esm/handlers/error.d.ts
CHANGED
package/esm/handlers/error.js
CHANGED
|
@@ -7,21 +7,23 @@ import { setReportValue, getReport } from '../config/global.js';
|
|
|
7
7
|
import { report } from '../reporter.js';
|
|
8
8
|
|
|
9
9
|
const eventsMatrix = [[]];
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
eventsMatrix.
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
10
|
+
function enableRecordFunc() {
|
|
11
|
+
rrweb.record({
|
|
12
|
+
emit(event, isCheckout) {
|
|
13
|
+
// isCheckout 是一个标识,告诉你重新制作了快照
|
|
14
|
+
if (isCheckout) {
|
|
15
|
+
eventsMatrix.push([]);
|
|
16
|
+
}
|
|
17
|
+
if (eventsMatrix.length > 2) {
|
|
18
|
+
eventsMatrix.shift();
|
|
19
|
+
}
|
|
20
|
+
const lastEvents = eventsMatrix[eventsMatrix.length - 1];
|
|
21
|
+
lastEvents.push(event);
|
|
22
|
+
},
|
|
23
|
+
// 每30秒重新制作快照
|
|
24
|
+
checkoutEveryNms: 30 * 1000,
|
|
25
|
+
});
|
|
26
|
+
}
|
|
25
27
|
/**
|
|
26
28
|
* @description 错误事件触发后的操作
|
|
27
29
|
*/
|
|
@@ -173,4 +175,4 @@ function getFullScreenShoot(filename) {
|
|
|
173
175
|
});
|
|
174
176
|
}
|
|
175
177
|
|
|
176
|
-
export { getFullScreenShoot, getUserEvents, handleError, ignoreError, setCaughtError, setPromiseError, setResourceError };
|
|
178
|
+
export { enableRecordFunc, getFullScreenShoot, getUserEvents, handleError, ignoreError, setCaughtError, setPromiseError, setResourceError };
|
package/esm/index.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { Config, setConfig } from './config/index.js';
|
|
2
2
|
import { initReport, recordXMLHttpRequestLog, hackFetch } from './config/global.js';
|
|
3
3
|
import { monitorTrackSessionId } from './constant.js';
|
|
4
4
|
import { handlePageLag, _history, handleHistoryChange } from './handlers/pv.js';
|
|
5
|
-
import { handleError } from './handlers/error.js';
|
|
5
|
+
import { enableRecordFunc, handleError } from './handlers/error.js';
|
|
6
6
|
import { handleClick, handleBlur, handleScroll } from './handlers/user-activity.js';
|
|
7
7
|
import { initWindowObjectFunction, on, off, visualTrackFunc, handleLocationChange } from './utils/index.js';
|
|
8
8
|
|
|
@@ -18,8 +18,10 @@ class Track {
|
|
|
18
18
|
this.listenPageLag = () => {
|
|
19
19
|
this.observer = new PerformanceObserver((list) => {
|
|
20
20
|
list.getEntries().forEach((entry) => {
|
|
21
|
-
if (entry.duration >
|
|
21
|
+
if (entry.duration > (Config.lagTimeout || 800)) {
|
|
22
22
|
handlePageLag(entry.duration);
|
|
23
|
+
// eslint-disable-next-line no-console
|
|
24
|
+
console.log('监测到页面卡顿:', entry.duration, entry, location.href);
|
|
23
25
|
}
|
|
24
26
|
});
|
|
25
27
|
});
|
|
@@ -54,8 +56,9 @@ class Track {
|
|
|
54
56
|
Config.spa && this.addListenRouterChange();
|
|
55
57
|
Config.enableBehavior && this.addListenUserActivity();
|
|
56
58
|
Config.enableError && this.addListenJSUncaught();
|
|
57
|
-
this.visualTrack();
|
|
58
|
-
this.listenPageLag();
|
|
59
|
+
Config.enableVisualTrack && this.visualTrack();
|
|
60
|
+
Config.enableLagTrack && this.listenPageLag();
|
|
61
|
+
Config.enableRecord && enableRecordFunc();
|
|
59
62
|
this.addListenUnload();
|
|
60
63
|
initWindowObjectFunction();
|
|
61
64
|
}
|
package/esm/package.json.js
CHANGED
package/esm/reporter.js
CHANGED
|
@@ -256,7 +256,7 @@ function reportFunc(data) {
|
|
|
256
256
|
delete ERROR_MESSAGE_MAP[message];
|
|
257
257
|
}, 3000);
|
|
258
258
|
const { p, pid, host, bN, pt } = payload;
|
|
259
|
-
if ((_c = data.error) === null || _c === void 0 ? void 0 : _c.events) {
|
|
259
|
+
if (((_c = data.error) === null || _c === void 0 ? void 0 : _c.events) && Config.enableErrorEvent) {
|
|
260
260
|
hasErrorEvent = true;
|
|
261
261
|
const errorEvent = data.error.events;
|
|
262
262
|
const delayTime = Math.ceil(Math.random() * 10000);
|
|
@@ -267,17 +267,19 @@ function reportFunc(data) {
|
|
|
267
267
|
});
|
|
268
268
|
}, delayTime < 3500 ? 3500 : delayTime);
|
|
269
269
|
}
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
270
|
+
if (Config.enableErrorScreenshot) {
|
|
271
|
+
picturePromise = getFullScreenShoot(filename)
|
|
272
|
+
.then((file) => {
|
|
273
|
+
return new Promise((res) => {
|
|
274
|
+
xhrFunc(file.name, data.uuid, filename, file, res, (result) => {
|
|
275
|
+
payload.error.pic = result;
|
|
276
|
+
}, { p, pid, host, bN, pt });
|
|
277
|
+
});
|
|
278
|
+
})
|
|
279
|
+
.catch((err) => {
|
|
280
|
+
payload.error.picError = (err === null || err === void 0 ? void 0 : err.stack) || (err === null || err === void 0 ? void 0 : err.toString());
|
|
276
281
|
});
|
|
277
|
-
}
|
|
278
|
-
.catch((err) => {
|
|
279
|
-
payload.error.picError = (err === null || err === void 0 ? void 0 : err.stack) || (err === null || err === void 0 ? void 0 : err.toString());
|
|
280
|
-
});
|
|
282
|
+
}
|
|
281
283
|
}
|
|
282
284
|
}
|
|
283
285
|
return picturePromise
|
package/esm/types/config.d.ts
CHANGED
|
@@ -16,6 +16,10 @@ export interface IConfig {
|
|
|
16
16
|
enableBehavior?: boolean;
|
|
17
17
|
/** 启用异常信息上报 */
|
|
18
18
|
enableError?: boolean;
|
|
19
|
+
/** 启用异常截图上报 */
|
|
20
|
+
enableErrorScreenshot?: boolean;
|
|
21
|
+
/** 启用异常录像上报 */
|
|
22
|
+
enableErrorEvent?: boolean;
|
|
19
23
|
maxLength?: number;
|
|
20
24
|
/** 忽略上报的信息 */
|
|
21
25
|
ignore?: {
|
|
@@ -31,10 +35,16 @@ export interface IConfig {
|
|
|
31
35
|
};
|
|
32
36
|
/** 自定义payload */
|
|
33
37
|
customPayload?: string;
|
|
34
|
-
/** 上报 xhr
|
|
38
|
+
/** 上报 xhr 请求超过指定时间 */
|
|
35
39
|
XMLHttpRequestTimeout?: number;
|
|
36
40
|
/** 启用可视化埋点 */
|
|
37
41
|
enableVisualTrack?: boolean;
|
|
42
|
+
/** 启用页面卡顿上报 */
|
|
43
|
+
enableLagTrack?: boolean;
|
|
44
|
+
/** 上报页面卡顿的超时时间 */
|
|
45
|
+
lagTimeout?: number;
|
|
46
|
+
/** 是否启用页面录制 */
|
|
47
|
+
enableRecord: boolean;
|
|
38
48
|
}
|
|
39
49
|
type IParams = {
|
|
40
50
|
name: string;
|
package/index.js
CHANGED
|
@@ -38,7 +38,11 @@ var MonitorTrack = (function (uuid, ErrorStackParser, html2canvas, rrweb, axios,
|
|
|
38
38
|
hash: false,
|
|
39
39
|
enableBehavior: true,
|
|
40
40
|
enableError: true,
|
|
41
|
+
enableErrorScreenshot: false,
|
|
42
|
+
enableErrorEvent: false,
|
|
41
43
|
enableVisualTrack: false,
|
|
44
|
+
enableLagTrack: true,
|
|
45
|
+
enableRecord: false,
|
|
42
46
|
ignore: {
|
|
43
47
|
urls: [],
|
|
44
48
|
errors: [],
|
|
@@ -50,7 +54,17 @@ var MonitorTrack = (function (uuid, ErrorStackParser, html2canvas, rrweb, axios,
|
|
|
50
54
|
* @param config 配置项
|
|
51
55
|
*/
|
|
52
56
|
function setConfig(config) {
|
|
57
|
+
var _a;
|
|
53
58
|
Object.assign(Config, config);
|
|
59
|
+
if (!Config.ignore)
|
|
60
|
+
Config.ignore = {};
|
|
61
|
+
if (Array.isArray((_a = Config.ignore) === null || _a === void 0 ? void 0 : _a.errors)) {
|
|
62
|
+
['ResizeObserver loop limit exceeded', 'ResizeObserver loop completed with undelivered notifications.', 'Cancel'].forEach(function (item) {
|
|
63
|
+
if (!Config.ignore.errors.includes(item)) {
|
|
64
|
+
Config.ignore.errors.push(item);
|
|
65
|
+
}
|
|
66
|
+
});
|
|
67
|
+
}
|
|
54
68
|
}
|
|
55
69
|
|
|
56
70
|
/******************************************************************************
|
|
@@ -122,24 +136,26 @@ var MonitorTrack = (function (uuid, ErrorStackParser, html2canvas, rrweb, axios,
|
|
|
122
136
|
return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
|
|
123
137
|
};
|
|
124
138
|
|
|
125
|
-
var version = "1.
|
|
139
|
+
var version = "1.14.0";
|
|
126
140
|
|
|
127
141
|
var eventsMatrix = [[]];
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
eventsMatrix.
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
142
|
+
function enableRecordFunc() {
|
|
143
|
+
rrweb__namespace.record({
|
|
144
|
+
emit: function (event, isCheckout) {
|
|
145
|
+
// isCheckout 是一个标识,告诉你重新制作了快照
|
|
146
|
+
if (isCheckout) {
|
|
147
|
+
eventsMatrix.push([]);
|
|
148
|
+
}
|
|
149
|
+
if (eventsMatrix.length > 2) {
|
|
150
|
+
eventsMatrix.shift();
|
|
151
|
+
}
|
|
152
|
+
var lastEvents = eventsMatrix[eventsMatrix.length - 1];
|
|
153
|
+
lastEvents.push(event);
|
|
154
|
+
},
|
|
155
|
+
// 每30秒重新制作快照
|
|
156
|
+
checkoutEveryNms: 30 * 1000
|
|
157
|
+
});
|
|
158
|
+
}
|
|
143
159
|
/**
|
|
144
160
|
* @description 错误事件触发后的操作
|
|
145
161
|
*/
|
|
@@ -948,7 +964,7 @@ var MonitorTrack = (function (uuid, ErrorStackParser, html2canvas, rrweb, axios,
|
|
|
948
964
|
delete ERROR_MESSAGE_MAP[message_1];
|
|
949
965
|
}, 3000);
|
|
950
966
|
var p_1 = payload.p, pid_1 = payload.pid, host_1 = payload.host, bN_1 = payload.bN, pt_1 = payload.pt;
|
|
951
|
-
if ((_c = data.error) === null || _c === void 0 ? void 0 : _c.events) {
|
|
967
|
+
if (((_c = data.error) === null || _c === void 0 ? void 0 : _c.events) && Config.enableErrorEvent) {
|
|
952
968
|
hasErrorEvent = true;
|
|
953
969
|
var errorEvent_1 = data.error.events;
|
|
954
970
|
var delayTime = Math.ceil(Math.random() * 10000);
|
|
@@ -959,16 +975,18 @@ var MonitorTrack = (function (uuid, ErrorStackParser, html2canvas, rrweb, axios,
|
|
|
959
975
|
});
|
|
960
976
|
}, delayTime < 3500 ? 3500 : delayTime);
|
|
961
977
|
}
|
|
962
|
-
|
|
963
|
-
|
|
964
|
-
|
|
965
|
-
|
|
966
|
-
|
|
967
|
-
|
|
978
|
+
if (Config.enableErrorScreenshot) {
|
|
979
|
+
picturePromise = getFullScreenShoot(filename)
|
|
980
|
+
.then(function (file) {
|
|
981
|
+
return new Promise(function (res) {
|
|
982
|
+
xhrFunc(file.name, data.uuid, filename, file, res, function (result) {
|
|
983
|
+
payload.error.pic = result;
|
|
984
|
+
}, { p: p_1, pid: pid_1, host: host_1, bN: bN_1, pt: pt_1 });
|
|
985
|
+
});
|
|
986
|
+
})["catch"](function (err) {
|
|
987
|
+
payload.error.picError = (err === null || err === void 0 ? void 0 : err.stack) || (err === null || err === void 0 ? void 0 : err.toString());
|
|
968
988
|
});
|
|
969
|
-
}
|
|
970
|
-
payload.error.picError = (err === null || err === void 0 ? void 0 : err.stack) || (err === null || err === void 0 ? void 0 : err.toString());
|
|
971
|
-
});
|
|
989
|
+
}
|
|
972
990
|
}
|
|
973
991
|
}
|
|
974
992
|
return picturePromise
|
|
@@ -1449,8 +1467,10 @@ var MonitorTrack = (function (uuid, ErrorStackParser, html2canvas, rrweb, axios,
|
|
|
1449
1467
|
this.listenPageLag = function () {
|
|
1450
1468
|
_this.observer = new PerformanceObserver(function (list) {
|
|
1451
1469
|
list.getEntries().forEach(function (entry) {
|
|
1452
|
-
if (entry.duration >
|
|
1470
|
+
if (entry.duration > (Config.lagTimeout || 800)) {
|
|
1453
1471
|
handlePageLag(entry.duration);
|
|
1472
|
+
// eslint-disable-next-line no-console
|
|
1473
|
+
console.log('监测到页面卡顿:', entry.duration, entry, location.href);
|
|
1454
1474
|
}
|
|
1455
1475
|
});
|
|
1456
1476
|
});
|
|
@@ -1485,8 +1505,9 @@ var MonitorTrack = (function (uuid, ErrorStackParser, html2canvas, rrweb, axios,
|
|
|
1485
1505
|
Config.spa && this.addListenRouterChange();
|
|
1486
1506
|
Config.enableBehavior && this.addListenUserActivity();
|
|
1487
1507
|
Config.enableError && this.addListenJSUncaught();
|
|
1488
|
-
this.visualTrack();
|
|
1489
|
-
this.listenPageLag();
|
|
1508
|
+
Config.enableVisualTrack && this.visualTrack();
|
|
1509
|
+
Config.enableLagTrack && this.listenPageLag();
|
|
1510
|
+
Config.enableRecord && enableRecordFunc();
|
|
1490
1511
|
this.addListenUnload();
|
|
1491
1512
|
initWindowObjectFunction();
|
|
1492
1513
|
};
|