monitor-track 1.13.0 → 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/README.md CHANGED
@@ -43,9 +43,12 @@ 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 | 启用页面卡顿信息上报 |
48
50
  | lagTimeout | number | 否 | 400 | 页面卡顿上报的阈值时间(毫秒) |
51
+ | enableRecord | boolean | 否 | false | 启用页面录制 |
49
52
  | ignore | 见下方 ignore | 否 | false | 忽略上报的信息 |
50
53
  | customPayload | string | 否 | false | 自定义 payload |
51
54
  | enable | boolean | 否 | false | 是否开启日志收集,默认关闭 |
@@ -1,3 +1,4 @@
1
+ export declare function enableRecordFunc(): void;
1
2
  /**
2
3
  * @description 错误事件触发后的操作
3
4
  */
package/cjs/index.js CHANGED
@@ -44,8 +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,
48
- enableLagTrack: false,
50
+ enableLagTrack: true,
51
+ enableRecord: false,
49
52
  ignore: {
50
53
  urls: [],
51
54
  errors: [],
@@ -57,27 +60,39 @@ const Config = {
57
60
  * @param config 配置项
58
61
  */
59
62
  function setConfig(config) {
63
+ var _a;
60
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
+ }
61
74
  }
62
75
 
63
- var version = "1.13.0";
76
+ var version = "1.14.0";
64
77
 
65
78
  const eventsMatrix = [[]];
66
- rrweb__namespace.record({
67
- emit(event, isCheckout) {
68
- // isCheckout 是一个标识,告诉你重新制作了快照
69
- if (isCheckout) {
70
- eventsMatrix.push([]);
71
- }
72
- if (eventsMatrix.length > 2) {
73
- eventsMatrix.shift();
74
- }
75
- const lastEvents = eventsMatrix[eventsMatrix.length - 1];
76
- lastEvents.push(event);
77
- },
78
- // 每30秒重新制作快照
79
- checkoutEveryNms: 30 * 1000,
80
- });
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
+ }
81
96
  /**
82
97
  * @description 错误事件触发后的操作
83
98
  */
@@ -903,7 +918,7 @@ function reportFunc(data) {
903
918
  delete ERROR_MESSAGE_MAP[message];
904
919
  }, 3000);
905
920
  const { p, pid, host, bN, pt } = payload;
906
- 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) {
907
922
  hasErrorEvent = true;
908
923
  const errorEvent = data.error.events;
909
924
  const delayTime = Math.ceil(Math.random() * 10000);
@@ -914,17 +929,19 @@ function reportFunc(data) {
914
929
  });
915
930
  }, delayTime < 3500 ? 3500 : delayTime);
916
931
  }
917
- picturePromise = getFullScreenShoot(filename)
918
- .then((file) => {
919
- return new Promise((res) => {
920
- xhrFunc(file.name, data.uuid, filename, file, res, (result) => {
921
- payload.error.pic = result;
922
- }, { p, pid, host, bN, pt });
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());
923
943
  });
924
- })
925
- .catch((err) => {
926
- payload.error.picError = (err === null || err === void 0 ? void 0 : err.stack) || (err === null || err === void 0 ? void 0 : err.toString());
927
- });
944
+ }
928
945
  }
929
946
  }
930
947
  return picturePromise
@@ -1398,8 +1415,10 @@ class Track {
1398
1415
  this.listenPageLag = () => {
1399
1416
  this.observer = new PerformanceObserver((list) => {
1400
1417
  list.getEntries().forEach((entry) => {
1401
- if (entry.duration > (Config.lagTimeout || 400)) {
1418
+ if (entry.duration > (Config.lagTimeout || 800)) {
1402
1419
  handlePageLag(entry.duration);
1420
+ // eslint-disable-next-line no-console
1421
+ console.log('监测到页面卡顿:', entry.duration, entry, location.href);
1403
1422
  }
1404
1423
  });
1405
1424
  });
@@ -1436,6 +1455,7 @@ class Track {
1436
1455
  Config.enableError && this.addListenJSUncaught();
1437
1456
  Config.enableVisualTrack && this.visualTrack();
1438
1457
  Config.enableLagTrack && this.listenPageLag();
1458
+ Config.enableRecord && enableRecordFunc();
1439
1459
  this.addListenUnload();
1440
1460
  initWindowObjectFunction();
1441
1461
  }
@@ -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?: {
@@ -37,8 +41,10 @@ export interface IConfig {
37
41
  enableVisualTrack?: boolean;
38
42
  /** 启用页面卡顿上报 */
39
43
  enableLagTrack?: boolean;
40
- /** 上报 页面卡顿的超时时间 */
44
+ /** 上报页面卡顿的超时时间 */
41
45
  lagTimeout?: number;
46
+ /** 是否启用页面录制 */
47
+ enableRecord: boolean;
42
48
  }
43
49
  type IParams = {
44
50
  name: string;
@@ -10,8 +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,
14
- enableLagTrack: false,
16
+ enableLagTrack: true,
17
+ enableRecord: false,
15
18
  ignore: {
16
19
  urls: [],
17
20
  errors: [],
@@ -23,7 +26,17 @@ const Config = {
23
26
  * @param config 配置项
24
27
  */
25
28
  function setConfig(config) {
29
+ var _a;
26
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
+ }
27
40
  }
28
41
 
29
42
  export { Config, setConfig };
@@ -1,3 +1,4 @@
1
+ export declare function enableRecordFunc(): void;
1
2
  /**
2
3
  * @description 错误事件触发后的操作
3
4
  */
@@ -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
- rrweb.record({
11
- emit(event, isCheckout) {
12
- // isCheckout 是一个标识,告诉你重新制作了快照
13
- if (isCheckout) {
14
- eventsMatrix.push([]);
15
- }
16
- if (eventsMatrix.length > 2) {
17
- eventsMatrix.shift();
18
- }
19
- const lastEvents = eventsMatrix[eventsMatrix.length - 1];
20
- lastEvents.push(event);
21
- },
22
- // 每30秒重新制作快照
23
- checkoutEveryNms: 30 * 1000,
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
@@ -2,7 +2,7 @@ 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 > (Config.lagTimeout || 400)) {
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
  });
@@ -56,6 +58,7 @@ class Track {
56
58
  Config.enableError && this.addListenJSUncaught();
57
59
  Config.enableVisualTrack && this.visualTrack();
58
60
  Config.enableLagTrack && this.listenPageLag();
61
+ Config.enableRecord && enableRecordFunc();
59
62
  this.addListenUnload();
60
63
  initWindowObjectFunction();
61
64
  }
@@ -1,3 +1,3 @@
1
- var version = "1.13.0";
1
+ var version = "1.14.0";
2
2
 
3
3
  export { version };
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
- picturePromise = getFullScreenShoot(filename)
271
- .then((file) => {
272
- return new Promise((res) => {
273
- xhrFunc(file.name, data.uuid, filename, file, res, (result) => {
274
- payload.error.pic = result;
275
- }, { p, pid, host, bN, pt });
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
@@ -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?: {
@@ -37,8 +41,10 @@ export interface IConfig {
37
41
  enableVisualTrack?: boolean;
38
42
  /** 启用页面卡顿上报 */
39
43
  enableLagTrack?: boolean;
40
- /** 上报 页面卡顿的超时时间 */
44
+ /** 上报页面卡顿的超时时间 */
41
45
  lagTimeout?: number;
46
+ /** 是否启用页面录制 */
47
+ enableRecord: boolean;
42
48
  }
43
49
  type IParams = {
44
50
  name: string;
package/index.js CHANGED
@@ -38,8 +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,
42
- enableLagTrack: false,
44
+ enableLagTrack: true,
45
+ enableRecord: false,
43
46
  ignore: {
44
47
  urls: [],
45
48
  errors: [],
@@ -51,7 +54,17 @@ var MonitorTrack = (function (uuid, ErrorStackParser, html2canvas, rrweb, axios,
51
54
  * @param config 配置项
52
55
  */
53
56
  function setConfig(config) {
57
+ var _a;
54
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
+ }
55
68
  }
56
69
 
57
70
  /******************************************************************************
@@ -123,24 +136,26 @@ var MonitorTrack = (function (uuid, ErrorStackParser, html2canvas, rrweb, axios,
123
136
  return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
124
137
  };
125
138
 
126
- var version = "1.13.0";
139
+ var version = "1.14.0";
127
140
 
128
141
  var eventsMatrix = [[]];
129
- rrweb__namespace.record({
130
- emit: function (event, isCheckout) {
131
- // isCheckout 是一个标识,告诉你重新制作了快照
132
- if (isCheckout) {
133
- eventsMatrix.push([]);
134
- }
135
- if (eventsMatrix.length > 2) {
136
- eventsMatrix.shift();
137
- }
138
- var lastEvents = eventsMatrix[eventsMatrix.length - 1];
139
- lastEvents.push(event);
140
- },
141
- // 每30秒重新制作快照
142
- checkoutEveryNms: 30 * 1000
143
- });
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
+ }
144
159
  /**
145
160
  * @description 错误事件触发后的操作
146
161
  */
@@ -949,7 +964,7 @@ var MonitorTrack = (function (uuid, ErrorStackParser, html2canvas, rrweb, axios,
949
964
  delete ERROR_MESSAGE_MAP[message_1];
950
965
  }, 3000);
951
966
  var p_1 = payload.p, pid_1 = payload.pid, host_1 = payload.host, bN_1 = payload.bN, pt_1 = payload.pt;
952
- 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) {
953
968
  hasErrorEvent = true;
954
969
  var errorEvent_1 = data.error.events;
955
970
  var delayTime = Math.ceil(Math.random() * 10000);
@@ -960,16 +975,18 @@ var MonitorTrack = (function (uuid, ErrorStackParser, html2canvas, rrweb, axios,
960
975
  });
961
976
  }, delayTime < 3500 ? 3500 : delayTime);
962
977
  }
963
- picturePromise = getFullScreenShoot(filename)
964
- .then(function (file) {
965
- return new Promise(function (res) {
966
- xhrFunc(file.name, data.uuid, filename, file, res, function (result) {
967
- payload.error.pic = result;
968
- }, { p: p_1, pid: pid_1, host: host_1, bN: bN_1, pt: pt_1 });
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());
969
988
  });
970
- })["catch"](function (err) {
971
- payload.error.picError = (err === null || err === void 0 ? void 0 : err.stack) || (err === null || err === void 0 ? void 0 : err.toString());
972
- });
989
+ }
973
990
  }
974
991
  }
975
992
  return picturePromise
@@ -1450,8 +1467,10 @@ var MonitorTrack = (function (uuid, ErrorStackParser, html2canvas, rrweb, axios,
1450
1467
  this.listenPageLag = function () {
1451
1468
  _this.observer = new PerformanceObserver(function (list) {
1452
1469
  list.getEntries().forEach(function (entry) {
1453
- if (entry.duration > (Config.lagTimeout || 400)) {
1470
+ if (entry.duration > (Config.lagTimeout || 800)) {
1454
1471
  handlePageLag(entry.duration);
1472
+ // eslint-disable-next-line no-console
1473
+ console.log('监测到页面卡顿:', entry.duration, entry, location.href);
1455
1474
  }
1456
1475
  });
1457
1476
  });
@@ -1488,6 +1507,7 @@ var MonitorTrack = (function (uuid, ErrorStackParser, html2canvas, rrweb, axios,
1488
1507
  Config.enableError && this.addListenJSUncaught();
1489
1508
  Config.enableVisualTrack && this.visualTrack();
1490
1509
  Config.enableLagTrack && this.listenPageLag();
1510
+ Config.enableRecord && enableRecordFunc();
1491
1511
  this.addListenUnload();
1492
1512
  initWindowObjectFunction();
1493
1513
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "monitor-track",
3
- "version": "1.13.0",
3
+ "version": "1.14.0",
4
4
  "description": "前端监控及埋点SDK工具javascript版本",
5
5
  "main": "cjs/index.js",
6
6
  "module": "esm/index.js",