@antglobal/rlog-sdk 0.0.1755855517-dev.11 → 0.0.1755855517-dev.12
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/dist/esm/lib/api.d.ts +10 -0
- package/dist/esm/lib/api.d.ts.map +1 -1
- package/dist/esm/lib/api.js +47 -31
- package/dist/esm/lib/config.d.ts +1 -0
- package/dist/esm/lib/config.d.ts.map +1 -1
- package/dist/esm/lib/config.js +2 -0
- package/dist/esm/lib/error.d.ts.map +1 -1
- package/dist/esm/lib/error.js +65 -138
- package/dist/esm/lib/init.d.ts.map +1 -1
- package/dist/esm/lib/init.js +10 -2
- package/dist/esm/lib/net.d.ts.map +1 -1
- package/dist/esm/lib/net.js +31 -0
- package/dist/esm/lib/router-monitor.d.ts.map +1 -1
- package/dist/esm/lib/router-monitor.js +100 -0
- package/dist/esm/lib/upload-worker-manager.d.ts +37 -0
- package/dist/esm/lib/upload-worker-manager.d.ts.map +1 -0
- package/dist/esm/lib/upload-worker-manager.js +482 -0
- package/dist/esm/lib/upload-worker.d.ts +59 -0
- package/dist/esm/lib/upload-worker.d.ts.map +1 -0
- package/dist/esm/lib/upload-worker.js +26 -0
- package/dist/esm/lib/uploader.d.ts +5 -0
- package/dist/esm/lib/uploader.d.ts.map +1 -1
- package/dist/esm/lib/uploader.js +58 -10
- package/dist/lib/lib/api.d.ts +10 -0
- package/dist/lib/lib/api.d.ts.map +1 -1
- package/dist/lib/lib/api.js +48 -31
- package/dist/lib/lib/config.d.ts +1 -0
- package/dist/lib/lib/config.d.ts.map +1 -1
- package/dist/lib/lib/config.js +2 -0
- package/dist/lib/lib/error.d.ts.map +1 -1
- package/dist/lib/lib/error.js +65 -138
- package/dist/lib/lib/init.d.ts.map +1 -1
- package/dist/lib/lib/init.js +10 -2
- package/dist/lib/lib/net.d.ts.map +1 -1
- package/dist/lib/lib/net.js +31 -0
- package/dist/lib/lib/router-monitor.d.ts.map +1 -1
- package/dist/lib/lib/router-monitor.js +100 -0
- package/dist/lib/lib/upload-worker-manager.d.ts +37 -0
- package/dist/lib/lib/upload-worker-manager.d.ts.map +1 -0
- package/dist/lib/lib/upload-worker-manager.js +491 -0
- package/dist/lib/lib/upload-worker.d.ts +59 -0
- package/dist/lib/lib/upload-worker.d.ts.map +1 -0
- package/dist/lib/lib/upload-worker.js +32 -0
- package/dist/lib/lib/uploader.d.ts +5 -0
- package/dist/lib/lib/uploader.d.ts.map +1 -1
- package/dist/lib/lib/uploader.js +58 -10
- package/dist/rlog-sdk.min.js +1 -1
- package/package.json +3 -2
package/dist/esm/lib/api.d.ts
CHANGED
|
@@ -4,6 +4,16 @@ type UploadOptions = {
|
|
|
4
4
|
deviceId: string;
|
|
5
5
|
appId: string;
|
|
6
6
|
};
|
|
7
|
+
/**
|
|
8
|
+
* 构建上传查询参数(纯函数,供 Worker 管理器复用)
|
|
9
|
+
* @param opts 包含 appId、deviceId、data 的选项
|
|
10
|
+
* @returns 查询参数键值对
|
|
11
|
+
*/
|
|
12
|
+
export declare function buildQueryParams(opts: {
|
|
13
|
+
appId: string;
|
|
14
|
+
deviceId: string;
|
|
15
|
+
data: any[];
|
|
16
|
+
}): Record<string, string>;
|
|
7
17
|
export declare const upload: (opt: UploadOptions) => Promise<void>;
|
|
8
18
|
export {};
|
|
9
19
|
//# sourceMappingURL=api.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../../src/lib/api.ts"],"names":[],"mappings":"AAKA,KAAK,aAAa,GAAG;IACnB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,GAAG,EAAE,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAqBF,eAAO,MAAM,MAAM,QAAe,aAAa,
|
|
1
|
+
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../../src/lib/api.ts"],"names":[],"mappings":"AAKA,KAAK,aAAa,GAAG;IACnB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,GAAG,EAAE,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAqBF;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE;IACrC,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,GAAG,EAAE,CAAC;CACb,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAyBzB;AAED,eAAO,MAAM,MAAM,QAAe,aAAa,kBAsC9C,CAAC"}
|
package/dist/esm/lib/api.js
CHANGED
|
@@ -23,32 +23,48 @@ var cacheUrlParams = function cacheUrlParams() {
|
|
|
23
23
|
var getCachedParam = function getCachedParam(paramName) {
|
|
24
24
|
return sessionStorage.getItem("rlog-".concat(paramName));
|
|
25
25
|
};
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* 构建上传查询参数(纯函数,供 Worker 管理器复用)
|
|
29
|
+
* @param opts 包含 appId、deviceId、data 的选项
|
|
30
|
+
* @returns 查询参数键值对
|
|
31
|
+
*/
|
|
32
|
+
export function buildQueryParams(opts) {
|
|
33
|
+
var _opts$data, _opts$data2;
|
|
34
|
+
// 缓存URL中的参数
|
|
35
|
+
cacheUrlParams();
|
|
36
|
+
var lastIndex = opts.data && opts.data.length > 0 ? opts.data.length - 1 : -1;
|
|
37
|
+
var queryParams = {
|
|
38
|
+
deviceId: opts.deviceId,
|
|
39
|
+
appId: opts.appId,
|
|
40
|
+
startTime: (_opts$data = opts.data) === null || _opts$data === void 0 || (_opts$data = _opts$data[0]) === null || _opts$data === void 0 ? void 0 : _opts$data.timestamp,
|
|
41
|
+
endTime: (_opts$data2 = opts.data) === null || _opts$data2 === void 0 || (_opts$data2 = _opts$data2[lastIndex]) === null || _opts$data2 === void 0 ? void 0 : _opts$data2.timestamp
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
// 从配置中获取需要上报的参数名称列表
|
|
45
|
+
var config = getConfig();
|
|
46
|
+
var paramsToReport = config.urlParamsToCache || ['taskId']; // 默认上报taskId
|
|
47
|
+
|
|
48
|
+
// 添加缓存的参数到查询字符串中
|
|
49
|
+
paramsToReport.forEach(function (paramName) {
|
|
50
|
+
var paramValue = getCachedParam(paramName);
|
|
51
|
+
if (paramValue) {
|
|
52
|
+
queryParams[paramName] = paramValue;
|
|
53
|
+
}
|
|
54
|
+
});
|
|
55
|
+
return queryParams;
|
|
56
|
+
}
|
|
26
57
|
export var upload = /*#__PURE__*/function () {
|
|
27
58
|
var _ref = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(opt) {
|
|
28
|
-
var
|
|
29
|
-
var lastIndex, queryParams, config, paramsToReport, queryString, api, formData, customHeaders, response, responseData, error;
|
|
59
|
+
var queryParams, queryString, api, formData, customHeaders, response, responseData, error;
|
|
30
60
|
return _regeneratorRuntime().wrap(function _callee$(_context) {
|
|
31
61
|
while (1) switch (_context.prev = _context.next) {
|
|
32
62
|
case 0:
|
|
33
|
-
//
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
// 构建查询字符串
|
|
37
|
-
lastIndex = opt.data && opt.data.length > 0 ? opt.data.length - 1 : -1;
|
|
38
|
-
queryParams = {
|
|
39
|
-
deviceId: opt.deviceId,
|
|
63
|
+
// 构建查询参数
|
|
64
|
+
queryParams = buildQueryParams({
|
|
40
65
|
appId: opt.appId,
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
}; // 从配置中获取需要上报的参数名称列表
|
|
44
|
-
config = getConfig();
|
|
45
|
-
paramsToReport = config.urlParamsToCache || ['taskId']; // 默认上报taskId
|
|
46
|
-
// 添加缓存的参数到查询字符串中
|
|
47
|
-
paramsToReport.forEach(function (paramName) {
|
|
48
|
-
var paramValue = getCachedParam(paramName);
|
|
49
|
-
if (paramValue) {
|
|
50
|
-
queryParams[paramName] = paramValue;
|
|
51
|
-
}
|
|
66
|
+
deviceId: opt.deviceId,
|
|
67
|
+
data: opt.data
|
|
52
68
|
});
|
|
53
69
|
queryString = new URLSearchParams(queryParams);
|
|
54
70
|
api = "".concat(opt.url).concat(queryString ? "?".concat(queryString) : '');
|
|
@@ -57,33 +73,33 @@ export var upload = /*#__PURE__*/function () {
|
|
|
57
73
|
|
|
58
74
|
// 获取自定义请求头
|
|
59
75
|
customHeaders = getCustomHeaders();
|
|
60
|
-
_context.next =
|
|
76
|
+
_context.next = 8;
|
|
61
77
|
return post(api, formData, {
|
|
62
78
|
headers: customHeaders
|
|
63
79
|
});
|
|
64
|
-
case
|
|
80
|
+
case 8:
|
|
65
81
|
response = _context.sent;
|
|
66
|
-
_context.prev =
|
|
82
|
+
_context.prev = 9;
|
|
67
83
|
responseData = typeof response.data === 'string' ? JSON.parse(response.data) : response.data;
|
|
68
|
-
_context.next =
|
|
84
|
+
_context.next = 16;
|
|
69
85
|
break;
|
|
70
|
-
case
|
|
71
|
-
_context.prev =
|
|
72
|
-
_context.t0 = _context["catch"](
|
|
86
|
+
case 13:
|
|
87
|
+
_context.prev = 13;
|
|
88
|
+
_context.t0 = _context["catch"](9);
|
|
73
89
|
return _context.abrupt("return");
|
|
74
|
-
case
|
|
90
|
+
case 16:
|
|
75
91
|
if (!(responseData && _typeof(responseData) === 'object' && responseData.success === false)) {
|
|
76
|
-
_context.next =
|
|
92
|
+
_context.next = 20;
|
|
77
93
|
break;
|
|
78
94
|
}
|
|
79
95
|
error = new Error(responseData.errorMessage || 'Upload failed with success=false'); // 将完整的响应数据附加到错误对象上
|
|
80
96
|
error.responseData = responseData;
|
|
81
97
|
throw error;
|
|
82
|
-
case
|
|
98
|
+
case 20:
|
|
83
99
|
case "end":
|
|
84
100
|
return _context.stop();
|
|
85
101
|
}
|
|
86
|
-
}, _callee, null, [[
|
|
102
|
+
}, _callee, null, [[9, 13]]);
|
|
87
103
|
}));
|
|
88
104
|
return function upload(_x) {
|
|
89
105
|
return _ref.apply(this, arguments);
|
package/dist/esm/lib/config.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/lib/config.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,mBAAmB;IAElC,MAAM,CAAC,EAAE,OAAO,CAAC;IAEjB,KAAK,CAAC,EAAE,CACJ,QAAQ,GACR,OAAO,GACP,OAAO,GACP,YAAY,GACZ,OAAO,GACP,KAAK,GACL,QAAQ,GACR,OAAO,GACP,OAAO,GACP,gBAAgB,GAChB,UAAU,GACV,MAAM,GACN,KAAK,GACL,OAAO,GACP,MAAM,GACN,SAAS,GACT,SAAS,GACT,OAAO,GACP,MAAM,CACT,EAAE,CAAC;IAEJ,eAAe,CAAC,EAAE,MAAM,CAAC;IAEzB,gBAAgB,CAAC,EAAE;QAEjB,iBAAiB,CAAC,EAAE,MAAM,CAAC;QAE3B,cAAc,CAAC,EAAE,MAAM,CAAC;QAExB,YAAY,CAAC,EAAE,MAAM,CAAC;KACvB,CAAC;CACH;AAGD,MAAM,WAAW,kBAAkB;IAEjC,cAAc,CAAC,EAAE,MAAM,CAAC;IAExB,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAGD,MAAM,WAAW,SAAS;IAExB,MAAM,EAAE,OAAO,CAAC;IAEhB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAE1B,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB,QAAQ,CAAC,EAAE;QAET,MAAM,CAAC,EAAE,MAAM,CAAC;QAEhB,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;QAE7B,MAAM,CAAC,EAAE,MAAM,CAAC;QAEhB,KAAK,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC;KACxB,CAAC;IAGF,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAE9B,WAAW,CAAC,EAAE,OAAO,CAAC;IAEtB,cAAc,EAAE,MAAM,CAAC;IAEvB,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAG5B,wBAAwB,CAAC,EAAE,OAAO,CAAC;IAGnC,OAAO,CAAC,EAAE,mBAAmB,CAAC;IAG9B,IAAI,CAAC,EAAE,OAAO,CAAC;IAGf,aAAa,CAAC,EAAE;QACd,MAAM,CAAC,EAAE,OAAO,CAAC;QAEjB,eAAe,CAAC,EAAE,OAAO,CAAC;QAC1B,kBAAkB,CAAC,EAAE,OAAO,CAAC;QAC7B,iBAAiB,CAAC,EAAE,OAAO,CAAC;QAC5B,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;KACzB,CAAC;IAGF,UAAU,CAAC,EAAE,OAAO,CAAC;IAGrB,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IAG/B,YAAY,CAAC,EAAE,kBAAkB,CAAC;CACnC;
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/lib/config.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,mBAAmB;IAElC,MAAM,CAAC,EAAE,OAAO,CAAC;IAEjB,KAAK,CAAC,EAAE,CACJ,QAAQ,GACR,OAAO,GACP,OAAO,GACP,YAAY,GACZ,OAAO,GACP,KAAK,GACL,QAAQ,GACR,OAAO,GACP,OAAO,GACP,gBAAgB,GAChB,UAAU,GACV,MAAM,GACN,KAAK,GACL,OAAO,GACP,MAAM,GACN,SAAS,GACT,SAAS,GACT,OAAO,GACP,MAAM,CACT,EAAE,CAAC;IAEJ,eAAe,CAAC,EAAE,MAAM,CAAC;IAEzB,gBAAgB,CAAC,EAAE;QAEjB,iBAAiB,CAAC,EAAE,MAAM,CAAC;QAE3B,cAAc,CAAC,EAAE,MAAM,CAAC;QAExB,YAAY,CAAC,EAAE,MAAM,CAAC;KACvB,CAAC;CACH;AAGD,MAAM,WAAW,kBAAkB;IAEjC,cAAc,CAAC,EAAE,MAAM,CAAC;IAExB,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAGD,MAAM,WAAW,SAAS;IAExB,MAAM,EAAE,OAAO,CAAC;IAEhB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAE1B,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB,QAAQ,CAAC,EAAE;QAET,MAAM,CAAC,EAAE,MAAM,CAAC;QAEhB,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;QAE7B,MAAM,CAAC,EAAE,MAAM,CAAC;QAEhB,KAAK,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC;KACxB,CAAC;IAGF,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAE9B,WAAW,CAAC,EAAE,OAAO,CAAC;IAEtB,cAAc,EAAE,MAAM,CAAC;IAEvB,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAG5B,wBAAwB,CAAC,EAAE,OAAO,CAAC;IAGnC,OAAO,CAAC,EAAE,mBAAmB,CAAC;IAG9B,IAAI,CAAC,EAAE,OAAO,CAAC;IAGf,aAAa,CAAC,EAAE;QACd,MAAM,CAAC,EAAE,OAAO,CAAC;QAEjB,eAAe,CAAC,EAAE,OAAO,CAAC;QAC1B,kBAAkB,CAAC,EAAE,OAAO,CAAC;QAC7B,iBAAiB,CAAC,EAAE,OAAO,CAAC;QAC5B,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;KACzB,CAAC;IAGF,UAAU,CAAC,EAAE,OAAO,CAAC;IAGrB,KAAK,CAAC,EAAE,OAAO,CAAC;IAGhB,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IAG/B,YAAY,CAAC,EAAE,kBAAkB,CAAC;CACnC;AA+CD;;;;GAIG;AACH,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAuC3E;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC,SAAS,CAAC,GAAG,IAAI,CAEhE;AAED;;;GAGG;AACH,wBAAgB,SAAS,IAAI,SAAS,CAErC;AAED;;;GAGG;AACH,wBAAsB,iBAAiB,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAoBtE"}
|
package/dist/esm/lib/config.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"error.d.ts","sourceRoot":"","sources":["../../../src/lib/error.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"error.d.ts","sourceRoot":"","sources":["../../../src/lib/error.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAS/C;;GAEG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,YAAY,GAAG,IAAI,GAAG,IAAI,CAElE;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,YAAY,GAAG,IAAI,CAErD;AAGD,eAAO,MAAM,oBAAoB,SAAU,GAAG,SAmB7C,CAAC;AAqEF,wBAAgB,gBAAgB,SAS/B;AAGD,wBAAgB,mBAAmB,SAWlC"}
|
package/dist/esm/lib/error.js
CHANGED
|
@@ -3,12 +3,12 @@ import { getConfig } from "./config";
|
|
|
3
3
|
import { record } from 'rrweb';
|
|
4
4
|
import logger from "./logger";
|
|
5
5
|
|
|
6
|
-
// 存储事件监听器的引用,用于清理
|
|
7
|
-
var eventListeners = [];
|
|
8
|
-
|
|
9
6
|
// 错误触发器引用(错误采集模式下由 init.ts 注入)
|
|
10
7
|
var errorTriggerInstance = null;
|
|
11
8
|
|
|
9
|
+
// 标记是否已初始化
|
|
10
|
+
var isInitialized = false;
|
|
11
|
+
|
|
12
12
|
/**
|
|
13
13
|
* 设置错误触发器实例(错误采集模式下由 init.ts 调用)
|
|
14
14
|
*/
|
|
@@ -45,156 +45,83 @@ export var sendErrorToAnalytics = function sendErrorToAnalytics(data) {
|
|
|
45
45
|
}
|
|
46
46
|
};
|
|
47
47
|
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
url: event.target.src || event.target.href || event.target.src,
|
|
62
|
-
message: errorEvent.message,
|
|
63
|
-
userAgent: navigator.userAgent,
|
|
64
|
-
timestamp: Date.now(),
|
|
65
|
-
location: window.location.href
|
|
66
|
-
};
|
|
67
|
-
sendErrorToAnalytics(_errorData);
|
|
68
|
-
return false;
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
// JavaScript 运行时错误
|
|
72
|
-
var message = errorEvent.message,
|
|
73
|
-
filename = errorEvent.filename,
|
|
74
|
-
lineno = errorEvent.lineno,
|
|
75
|
-
colno = errorEvent.colno,
|
|
76
|
-
error = errorEvent.error;
|
|
77
|
-
var errorData = {
|
|
78
|
-
type: 'JS_ERROR',
|
|
79
|
-
message: message,
|
|
80
|
-
file: filename,
|
|
81
|
-
line: lineno,
|
|
82
|
-
column: colno,
|
|
83
|
-
stack: error === null || error === void 0 ? void 0 : error.stack,
|
|
48
|
+
/**
|
|
49
|
+
* JavaScript 运行时错误 & 资源加载错误处理
|
|
50
|
+
*/
|
|
51
|
+
function handleError(event) {
|
|
52
|
+
var errorEvent = event;
|
|
53
|
+
|
|
54
|
+
// 检查是否是资源加载错误
|
|
55
|
+
if (event.target !== window) {
|
|
56
|
+
var _errorData = {
|
|
57
|
+
type: 'RESOURCE_ERROR',
|
|
58
|
+
resourceType: event.target.tagName,
|
|
59
|
+
url: event.target.src || event.target.href || event.target.src,
|
|
60
|
+
message: errorEvent.message,
|
|
84
61
|
userAgent: navigator.userAgent,
|
|
85
62
|
timestamp: Date.now(),
|
|
86
63
|
location: window.location.href
|
|
87
64
|
};
|
|
88
|
-
sendErrorToAnalytics(
|
|
89
|
-
|
|
90
|
-
// 控制台保留原始错误显示
|
|
65
|
+
sendErrorToAnalytics(_errorData);
|
|
91
66
|
return false;
|
|
92
|
-
}
|
|
93
|
-
window.addEventListener('error', errorHandler, true);
|
|
94
|
-
eventListeners.push({
|
|
95
|
-
target: window,
|
|
96
|
-
type: 'error',
|
|
97
|
-
listener: errorHandler,
|
|
98
|
-
options: true
|
|
99
|
-
});
|
|
67
|
+
}
|
|
100
68
|
|
|
101
|
-
//
|
|
102
|
-
var
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
69
|
+
// JavaScript 运行时错误
|
|
70
|
+
var message = errorEvent.message,
|
|
71
|
+
filename = errorEvent.filename,
|
|
72
|
+
lineno = errorEvent.lineno,
|
|
73
|
+
colno = errorEvent.colno,
|
|
74
|
+
error = errorEvent.error;
|
|
75
|
+
var errorData = {
|
|
76
|
+
type: 'JS_ERROR',
|
|
77
|
+
message: message,
|
|
78
|
+
file: filename,
|
|
79
|
+
line: lineno,
|
|
80
|
+
column: colno,
|
|
81
|
+
stack: error === null || error === void 0 ? void 0 : error.stack,
|
|
82
|
+
userAgent: navigator.userAgent,
|
|
83
|
+
timestamp: Date.now(),
|
|
84
|
+
location: window.location.href
|
|
115
85
|
};
|
|
116
|
-
|
|
117
|
-
eventListeners.push({
|
|
118
|
-
target: window,
|
|
119
|
-
type: 'unhandledrejection',
|
|
120
|
-
listener: unhandledRejectionHandler
|
|
121
|
-
});
|
|
86
|
+
sendErrorToAnalytics(errorData);
|
|
122
87
|
|
|
123
|
-
//
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
type: 'PAGE_LOAD',
|
|
127
|
-
url: window.location.href,
|
|
128
|
-
timestamp: Date.now()
|
|
129
|
-
});
|
|
130
|
-
};
|
|
131
|
-
window.addEventListener('load', loadHandler);
|
|
132
|
-
eventListeners.push({
|
|
133
|
-
target: window,
|
|
134
|
-
type: 'load',
|
|
135
|
-
listener: loadHandler
|
|
136
|
-
});
|
|
88
|
+
// 控制台保留原始错误显示
|
|
89
|
+
return false;
|
|
90
|
+
}
|
|
137
91
|
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
92
|
+
/**
|
|
93
|
+
* 未处理的 Promise 错误处理
|
|
94
|
+
*/
|
|
95
|
+
function handleUnhandledRejection(event) {
|
|
96
|
+
var rejectionEvent = event;
|
|
97
|
+
var reason = rejectionEvent.reason || 'Unknown rejection';
|
|
98
|
+
var errorData = {
|
|
99
|
+
type: 'PROMISE_REJECTION',
|
|
100
|
+
message: typeof reason === 'string' ? reason : reason.message,
|
|
101
|
+
stack: _typeof(reason) === 'object' ? reason.stack : null,
|
|
102
|
+
timestamp: Date.now(),
|
|
103
|
+
location: window.location.href
|
|
145
104
|
};
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
listener: beforeUnloadHandler
|
|
151
|
-
});
|
|
105
|
+
sendErrorToAnalytics(errorData);
|
|
106
|
+
// 阻止默认控制台报错
|
|
107
|
+
event.preventDefault();
|
|
108
|
+
}
|
|
152
109
|
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
window.addEventListener('online', onlineHandler);
|
|
161
|
-
eventListeners.push({
|
|
162
|
-
target: window,
|
|
163
|
-
type: 'online',
|
|
164
|
-
listener: onlineHandler
|
|
165
|
-
});
|
|
166
|
-
var offlineHandler = function offlineHandler() {
|
|
167
|
-
sendErrorToAnalytics({
|
|
168
|
-
type: 'NETWORK_OFFLINE',
|
|
169
|
-
timestamp: Date.now()
|
|
170
|
-
});
|
|
171
|
-
};
|
|
172
|
-
window.addEventListener('offline', offlineHandler);
|
|
173
|
-
eventListeners.push({
|
|
174
|
-
target: window,
|
|
175
|
-
type: 'offline',
|
|
176
|
-
listener: offlineHandler
|
|
177
|
-
});
|
|
110
|
+
// 初始化错误处理
|
|
111
|
+
export function initErrorHandler() {
|
|
112
|
+
if (isInitialized) return;
|
|
113
|
+
logger.log('Error handling is enabled');
|
|
114
|
+
window.addEventListener('error', handleError, true);
|
|
115
|
+
window.addEventListener('unhandledrejection', handleUnhandledRejection);
|
|
116
|
+
isInitialized = true;
|
|
178
117
|
}
|
|
179
118
|
|
|
180
119
|
// 清理错误监听器
|
|
181
120
|
export function cleanupErrorHandler() {
|
|
121
|
+
if (!isInitialized) return;
|
|
182
122
|
logger.log('Cleaning up error handlers');
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
var target = _ref.target,
|
|
187
|
-
type = _ref.type,
|
|
188
|
-
listener = _ref.listener,
|
|
189
|
-
options = _ref.options;
|
|
190
|
-
try {
|
|
191
|
-
target.removeEventListener(type, listener, options);
|
|
192
|
-
} catch (error) {
|
|
193
|
-
logger.warn("Failed to remove event listener for ".concat(type), error);
|
|
194
|
-
}
|
|
195
|
-
});
|
|
196
|
-
|
|
197
|
-
// 清空监听器数组
|
|
198
|
-
eventListeners.length = 0;
|
|
123
|
+
window.removeEventListener('error', handleError, true);
|
|
124
|
+
window.removeEventListener('unhandledrejection', handleUnhandledRejection);
|
|
125
|
+
isInitialized = false;
|
|
199
126
|
logger.log('Error handlers cleaned up successfully');
|
|
200
127
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../../src/lib/init.ts"],"names":[],"mappings":"AAqBA;;;;GAIG;AACH,wBAAgB,UAAU,CACxB,OAAO,GAAE;IAAE,SAAS,CAAC,EAAE,OAAO,CAAA;CAAO,EACrC,OAAO,GAAE,MAAuB,GAC/B,IAAI,CAiDN;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,IAAI,CAEvC;AAED;;;;;GAKG;AACH,wBAAgB,QAAQ,CACtB,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,YAAY,CAAC,EAAE,MAAM,GACpB,IAAI,
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../../src/lib/init.ts"],"names":[],"mappings":"AAqBA;;;;GAIG;AACH,wBAAgB,UAAU,CACxB,OAAO,GAAE;IAAE,SAAS,CAAC,EAAE,OAAO,CAAA;CAAO,EACrC,OAAO,GAAE,MAAuB,GAC/B,IAAI,CAiDN;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,IAAI,CAEvC;AAED;;;;;GAKG;AACH,wBAAgB,QAAQ,CACtB,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,YAAY,CAAC,EAAE,MAAM,GACpB,IAAI,CAiEN"}
|
package/dist/esm/lib/init.js
CHANGED
|
@@ -97,6 +97,7 @@ export function initRLog(serv, appId, cdnConfigUrl) {
|
|
|
97
97
|
|
|
98
98
|
// 初始化配置管理器
|
|
99
99
|
initConfigManager(cdnConfigUrl).then(function () {
|
|
100
|
+
var _config$error;
|
|
100
101
|
// 获取配置
|
|
101
102
|
var config = getConfig();
|
|
102
103
|
|
|
@@ -133,8 +134,15 @@ export function initRLog(serv, appId, cdnConfigUrl) {
|
|
|
133
134
|
// 初始化路由监控
|
|
134
135
|
initRouterMonitor(config.routerMonitor);
|
|
135
136
|
|
|
136
|
-
//
|
|
137
|
-
|
|
137
|
+
// 判断是否启用错误监听上报:
|
|
138
|
+
// 1. 错误采集模式下强制启用(错误捕获模式必须依赖错误监听初始化)
|
|
139
|
+
// 2. 非错误模式下,根据用户 error 配置决定,默认不启用
|
|
140
|
+
var enableError = isErrorMode || ((_config$error = config.error) !== null && _config$error !== void 0 ? _config$error : false);
|
|
141
|
+
if (enableError) {
|
|
142
|
+
initErrorHandler();
|
|
143
|
+
} else {
|
|
144
|
+
logger.log('Error handling is disabled by config');
|
|
145
|
+
}
|
|
138
146
|
}).catch(function (error) {
|
|
139
147
|
logger.error('Failed to initialize SDK', error);
|
|
140
148
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"net.d.ts","sourceRoot":"","sources":["../../../src/lib/net.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AAE/B,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAM/C;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,YAAY,GAAG,IAAI,GAAG,IAAI,CAErE;AA2ID,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAgBpD;
|
|
1
|
+
{"version":3,"file":"net.d.ts","sourceRoot":"","sources":["../../../src/lib/net.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AAE/B,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAM/C;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,YAAY,GAAG,IAAI,GAAG,IAAI,CAErE;AA2ID,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAgBpD;AAiCD,wBAAgB,QAAQ,CAAC,CAAC,EAAE,OAAO,MAAM,QAsPxC;AAGD,wBAAgB,UAAU,IAAI,IAAI,CAiBjC;AAGD,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAQrD;AAED,wBAAgB,gBAAgB,IAAI,MAAM,EAAE,CAE3C;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAOrD;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,EAAE,CAE3C;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAsBxD;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,GAAG,IAAI,CAEjD;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAEtE;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAEzD"}
|
package/dist/esm/lib/net.js
CHANGED
|
@@ -13,6 +13,7 @@ function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o =
|
|
|
13
13
|
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }
|
|
14
14
|
function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
|
|
15
15
|
function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
|
|
16
|
+
import { record } from 'rrweb';
|
|
16
17
|
import { getConfig } from "./config";
|
|
17
18
|
import logger from "./logger";
|
|
18
19
|
|
|
@@ -153,6 +154,28 @@ export function shouldRecordUrl(url) {
|
|
|
153
154
|
return isUrlInWhitelist(url, whiteListUrls);
|
|
154
155
|
}
|
|
155
156
|
|
|
157
|
+
// 网络状态变化事件处理
|
|
158
|
+
function handleOnline() {
|
|
159
|
+
try {
|
|
160
|
+
record.addCustomEvent('network-status', {
|
|
161
|
+
type: 'NETWORK_ONLINE',
|
|
162
|
+
timestamp: Date.now()
|
|
163
|
+
});
|
|
164
|
+
} catch (error) {
|
|
165
|
+
logger.warn('Failed to add NETWORK_ONLINE event (recording may have stopped)', error);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
function handleOffline() {
|
|
169
|
+
try {
|
|
170
|
+
record.addCustomEvent('network-status', {
|
|
171
|
+
type: 'NETWORK_OFFLINE',
|
|
172
|
+
timestamp: Date.now()
|
|
173
|
+
});
|
|
174
|
+
} catch (error) {
|
|
175
|
+
logger.warn('Failed to add NETWORK_OFFLINE event (recording may have stopped)', error);
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
|
|
156
179
|
// 存储原始方法
|
|
157
180
|
var origOpen = XMLHttpRequest.prototype.open;
|
|
158
181
|
var origSend = XMLHttpRequest.prototype.send;
|
|
@@ -387,6 +410,10 @@ export function watchXhr(r) {
|
|
|
387
410
|
return _ref3.apply(this, arguments);
|
|
388
411
|
};
|
|
389
412
|
}();
|
|
413
|
+
|
|
414
|
+
// 监听网络连接状态变化
|
|
415
|
+
window.addEventListener('online', handleOnline);
|
|
416
|
+
window.addEventListener('offline', handleOffline);
|
|
390
417
|
}
|
|
391
418
|
|
|
392
419
|
// 恢复原始方法
|
|
@@ -400,6 +427,10 @@ export function restoreXhr() {
|
|
|
400
427
|
if (origFetch) {
|
|
401
428
|
window.fetch = origFetch;
|
|
402
429
|
}
|
|
430
|
+
|
|
431
|
+
// 移除网络状态监听器
|
|
432
|
+
window.removeEventListener('online', handleOnline);
|
|
433
|
+
window.removeEventListener('offline', handleOffline);
|
|
403
434
|
isHooked = false;
|
|
404
435
|
logger.log('Network monitoring restored');
|
|
405
436
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"router-monitor.d.ts","sourceRoot":"","sources":["../../../src/lib/router-monitor.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,KAAK,SAAS,EAAa,MAAM,UAAU,CAAC;AAIrD,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,cAAc,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,WAAW,GAAG,cAAc,GAAG,UAAU,GAAG,YAAY,CAAC;IACjE,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AA2ID;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,CAAC,eAAe,CAAC,GAAG,IAAI,CAuB3E;
|
|
1
|
+
{"version":3,"file":"router-monitor.d.ts","sourceRoot":"","sources":["../../../src/lib/router-monitor.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,KAAK,SAAS,EAAa,MAAM,UAAU,CAAC;AAIrD,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,cAAc,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,WAAW,GAAG,cAAc,GAAG,UAAU,GAAG,YAAY,CAAC;IACjE,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AA2ID;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,CAAC,eAAe,CAAC,GAAG,IAAI,CAuB3E;AAuFD;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,CAAC,EAAE,SAAS,CAAC,eAAe,CAAC,QA4CpE;AAED;;GAEG;AACH,wBAAgB,mBAAmB;;;;EAMlC;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,QAG1D;AAED;;GAEG;AACH,wBAAgB,iBAAiB,SA8BhC"}
|
|
@@ -170,6 +170,91 @@ export function updateRouterConfig(config) {
|
|
|
170
170
|
}
|
|
171
171
|
}
|
|
172
172
|
|
|
173
|
+
/**
|
|
174
|
+
* 处理页面加载事件
|
|
175
|
+
*/
|
|
176
|
+
function handlePageLoad() {
|
|
177
|
+
try {
|
|
178
|
+
record.addCustomEvent('page-lifecycle', {
|
|
179
|
+
type: 'PAGE_LOAD',
|
|
180
|
+
url: window.location.href,
|
|
181
|
+
timestamp: Date.now()
|
|
182
|
+
});
|
|
183
|
+
} catch (error) {
|
|
184
|
+
logger.warn('Failed to add PAGE_LOAD event (recording may have stopped)', error);
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
/**
|
|
189
|
+
* 处理页面卸载事件
|
|
190
|
+
*/
|
|
191
|
+
function handlePageUnload() {
|
|
192
|
+
try {
|
|
193
|
+
record.addCustomEvent('page-lifecycle', {
|
|
194
|
+
type: 'PAGE_UNLOAD',
|
|
195
|
+
url: window.location.href,
|
|
196
|
+
timestamp: Date.now()
|
|
197
|
+
});
|
|
198
|
+
} catch (error) {
|
|
199
|
+
logger.warn('Failed to add PAGE_UNLOAD event (recording may have stopped)', error);
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
/**
|
|
204
|
+
* 处理页面隐藏事件(移动端友好,替代 beforeunload)
|
|
205
|
+
* pagehide 在移动端浏览器中比 beforeunload 更可靠
|
|
206
|
+
*/
|
|
207
|
+
function handlePageHide(event) {
|
|
208
|
+
try {
|
|
209
|
+
record.addCustomEvent('page-lifecycle', {
|
|
210
|
+
type: 'PAGE_HIDE',
|
|
211
|
+
url: window.location.href,
|
|
212
|
+
timestamp: Date.now(),
|
|
213
|
+
persisted: event.persisted // 页面是否进入 bfcache
|
|
214
|
+
});
|
|
215
|
+
} catch (error) {
|
|
216
|
+
logger.warn('Failed to add PAGE_HIDE event (recording may have stopped)', error);
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
/**
|
|
221
|
+
* 处理页面显示事件(移动端友好,支持 bfcache 恢复检测)
|
|
222
|
+
* pageshow 在页面从 bfcache 恢复时也会触发
|
|
223
|
+
*/
|
|
224
|
+
function handlePageShow(event) {
|
|
225
|
+
try {
|
|
226
|
+
record.addCustomEvent('page-lifecycle', {
|
|
227
|
+
type: 'PAGE_SHOW',
|
|
228
|
+
url: window.location.href,
|
|
229
|
+
timestamp: Date.now(),
|
|
230
|
+
persisted: event.persisted // 是否从 bfcache 恢复
|
|
231
|
+
});
|
|
232
|
+
|
|
233
|
+
// 如果是从 bfcache 恢复,重置路由计时器
|
|
234
|
+
if (event.persisted) {
|
|
235
|
+
routeStartTime = Date.now();
|
|
236
|
+
}
|
|
237
|
+
} catch (error) {
|
|
238
|
+
logger.warn('Failed to add PAGE_SHOW event (recording may have stopped)', error);
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
/**
|
|
243
|
+
* 处理页面可见性变化事件(移动端切换应用/标签页)
|
|
244
|
+
*/
|
|
245
|
+
function handleVisibilityChange() {
|
|
246
|
+
try {
|
|
247
|
+
var isHidden = document.visibilityState === 'hidden';
|
|
248
|
+
record.addCustomEvent('page-lifecycle', {
|
|
249
|
+
type: isHidden ? 'PAGE_VISIBILITY_HIDDEN' : 'PAGE_VISIBILITY_VISIBLE',
|
|
250
|
+
url: window.location.href,
|
|
251
|
+
timestamp: Date.now()
|
|
252
|
+
});
|
|
253
|
+
} catch (error) {
|
|
254
|
+
logger.warn('Failed to add visibility change event (recording may have stopped)', error);
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
|
|
173
258
|
/**
|
|
174
259
|
* 初始化路由监控
|
|
175
260
|
*/
|
|
@@ -205,6 +290,16 @@ export function initRouterMonitor(config) {
|
|
|
205
290
|
if (routerConfig.trackHashChange) {
|
|
206
291
|
window.addEventListener('hashchange', handleHashChange);
|
|
207
292
|
}
|
|
293
|
+
|
|
294
|
+
// 监听页面生命周期事件
|
|
295
|
+
window.addEventListener('load', handlePageLoad);
|
|
296
|
+
window.addEventListener('beforeunload', handlePageUnload);
|
|
297
|
+
|
|
298
|
+
// 监听移动端页面生命周期事件
|
|
299
|
+
// pagehide/pageshow 在移动端比 beforeunload 更可靠
|
|
300
|
+
window.addEventListener('pagehide', handlePageHide);
|
|
301
|
+
window.addEventListener('pageshow', handlePageShow);
|
|
302
|
+
document.addEventListener('visibilitychange', handleVisibilityChange);
|
|
208
303
|
isInitialized = true;
|
|
209
304
|
}
|
|
210
305
|
|
|
@@ -243,6 +338,11 @@ export function stopRouterMonitor() {
|
|
|
243
338
|
if (typeof window !== 'undefined') {
|
|
244
339
|
window.removeEventListener('popstate', handlePopState);
|
|
245
340
|
window.removeEventListener('hashchange', handleHashChange);
|
|
341
|
+
window.removeEventListener('load', handlePageLoad);
|
|
342
|
+
window.removeEventListener('beforeunload', handlePageUnload);
|
|
343
|
+
window.removeEventListener('pagehide', handlePageHide);
|
|
344
|
+
window.removeEventListener('pageshow', handlePageShow);
|
|
345
|
+
document.removeEventListener('visibilitychange', handleVisibilityChange);
|
|
246
346
|
}
|
|
247
347
|
|
|
248
348
|
// 重置状态
|