vue-eye-sdk 1.0.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/dist/monitor.cjs.js +710 -0
- package/dist/monitor.cjs.js.map +1 -0
- package/dist/monitor.esm.js +703 -0
- package/dist/monitor.esm.js.map +1 -0
- package/dist/monitor.js +715 -0
- package/dist/monitor.js.map +1 -0
- package/package.json +52 -0
- package/readme.md +104 -0
|
@@ -0,0 +1,710 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
|
+
|
|
5
|
+
var config = {
|
|
6
|
+
url: '',
|
|
7
|
+
projectName: 'eyesdk',
|
|
8
|
+
appId: '123456',
|
|
9
|
+
userId: '123456',
|
|
10
|
+
isImageUpload: false,
|
|
11
|
+
batchSize: 5
|
|
12
|
+
};
|
|
13
|
+
function setConfig(options) {
|
|
14
|
+
for (var key in config) {
|
|
15
|
+
if (options[key]) {
|
|
16
|
+
config[key] = options[key];
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
function _arrayLikeToArray(r, a) {
|
|
22
|
+
(null == a || a > r.length) && (a = r.length);
|
|
23
|
+
for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e];
|
|
24
|
+
return n;
|
|
25
|
+
}
|
|
26
|
+
function _createForOfIteratorHelper(r, e) {
|
|
27
|
+
var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"];
|
|
28
|
+
if (!t) {
|
|
29
|
+
if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e) {
|
|
30
|
+
t && (r = t);
|
|
31
|
+
var n = 0,
|
|
32
|
+
F = function () {};
|
|
33
|
+
return {
|
|
34
|
+
s: F,
|
|
35
|
+
n: function () {
|
|
36
|
+
return n >= r.length ? {
|
|
37
|
+
done: true
|
|
38
|
+
} : {
|
|
39
|
+
done: false,
|
|
40
|
+
value: r[n++]
|
|
41
|
+
};
|
|
42
|
+
},
|
|
43
|
+
e: function (r) {
|
|
44
|
+
throw r;
|
|
45
|
+
},
|
|
46
|
+
f: F
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
|
|
50
|
+
}
|
|
51
|
+
var o,
|
|
52
|
+
a = true,
|
|
53
|
+
u = false;
|
|
54
|
+
return {
|
|
55
|
+
s: function () {
|
|
56
|
+
t = t.call(r);
|
|
57
|
+
},
|
|
58
|
+
n: function () {
|
|
59
|
+
var r = t.next();
|
|
60
|
+
return a = r.done, r;
|
|
61
|
+
},
|
|
62
|
+
e: function (r) {
|
|
63
|
+
u = true, o = r;
|
|
64
|
+
},
|
|
65
|
+
f: function () {
|
|
66
|
+
try {
|
|
67
|
+
a || null == t.return || t.return();
|
|
68
|
+
} finally {
|
|
69
|
+
if (u) throw o;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
function _defineProperty(e, r, t) {
|
|
75
|
+
return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, {
|
|
76
|
+
value: t,
|
|
77
|
+
enumerable: true,
|
|
78
|
+
configurable: true,
|
|
79
|
+
writable: true
|
|
80
|
+
}) : e[r] = t, e;
|
|
81
|
+
}
|
|
82
|
+
function ownKeys(e, r) {
|
|
83
|
+
var t = Object.keys(e);
|
|
84
|
+
if (Object.getOwnPropertySymbols) {
|
|
85
|
+
var o = Object.getOwnPropertySymbols(e);
|
|
86
|
+
r && (o = o.filter(function (r) {
|
|
87
|
+
return Object.getOwnPropertyDescriptor(e, r).enumerable;
|
|
88
|
+
})), t.push.apply(t, o);
|
|
89
|
+
}
|
|
90
|
+
return t;
|
|
91
|
+
}
|
|
92
|
+
function _objectSpread2(e) {
|
|
93
|
+
for (var r = 1; r < arguments.length; r++) {
|
|
94
|
+
var t = null != arguments[r] ? arguments[r] : {};
|
|
95
|
+
r % 2 ? ownKeys(Object(t), true).forEach(function (r) {
|
|
96
|
+
_defineProperty(e, r, t[r]);
|
|
97
|
+
}) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) {
|
|
98
|
+
Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r));
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
return e;
|
|
102
|
+
}
|
|
103
|
+
function _toPrimitive(t, r) {
|
|
104
|
+
if ("object" != typeof t || !t) return t;
|
|
105
|
+
var e = t[Symbol.toPrimitive];
|
|
106
|
+
if (void 0 !== e) {
|
|
107
|
+
var i = e.call(t, r);
|
|
108
|
+
if ("object" != typeof i) return i;
|
|
109
|
+
throw new TypeError("@@toPrimitive must return a primitive value.");
|
|
110
|
+
}
|
|
111
|
+
return ("string" === r ? String : Number)(t);
|
|
112
|
+
}
|
|
113
|
+
function _toPropertyKey(t) {
|
|
114
|
+
var i = _toPrimitive(t, "string");
|
|
115
|
+
return "symbol" == typeof i ? i : i + "";
|
|
116
|
+
}
|
|
117
|
+
function _typeof(o) {
|
|
118
|
+
"@babel/helpers - typeof";
|
|
119
|
+
|
|
120
|
+
return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) {
|
|
121
|
+
return typeof o;
|
|
122
|
+
} : function (o) {
|
|
123
|
+
return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o;
|
|
124
|
+
}, _typeof(o);
|
|
125
|
+
}
|
|
126
|
+
function _unsupportedIterableToArray(r, a) {
|
|
127
|
+
if (r) {
|
|
128
|
+
if ("string" == typeof r) return _arrayLikeToArray(r, a);
|
|
129
|
+
var t = {}.toString.call(r).slice(8, -1);
|
|
130
|
+
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;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
function deepCopy(target) {
|
|
135
|
+
if (_typeof(target) === 'object') {
|
|
136
|
+
var result = Array.isArray(target) ? [] : {};
|
|
137
|
+
for (var key in target) {
|
|
138
|
+
if (_typeof(target[key]) == 'object') {
|
|
139
|
+
result[key] = deepCopy(target[key]);
|
|
140
|
+
} else {
|
|
141
|
+
result[key] = target[key];
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
return result;
|
|
145
|
+
}
|
|
146
|
+
return target;
|
|
147
|
+
}
|
|
148
|
+
function generateUniqueId() {
|
|
149
|
+
return 'id-' + Date.now() + '-' + Math.random().toString(36).substring(2, 9);
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
var cache = [];
|
|
153
|
+
function getCache() {
|
|
154
|
+
return deepCopy(cache);
|
|
155
|
+
}
|
|
156
|
+
function addCache(data) {
|
|
157
|
+
cache.push(data);
|
|
158
|
+
}
|
|
159
|
+
function clearCache() {
|
|
160
|
+
cache.length = 0;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
var originalOpen$1 = XMLHttpRequest.prototype.open;
|
|
164
|
+
var originalSend$1 = XMLHttpRequest.prototype.send;
|
|
165
|
+
function report(data) {
|
|
166
|
+
if (!config.url) {
|
|
167
|
+
console.error('请设置上传 url 地址');
|
|
168
|
+
}
|
|
169
|
+
var reportData = JSON.stringify({
|
|
170
|
+
id: generateUniqueId(),
|
|
171
|
+
data: data
|
|
172
|
+
});
|
|
173
|
+
// 上报数据,使用图片的方式
|
|
174
|
+
if (config.isImageUpload) {
|
|
175
|
+
imgRequest(reportData);
|
|
176
|
+
} else {
|
|
177
|
+
// 优先使用 sendBeacon
|
|
178
|
+
if (window.navigator.sendBeacon) {
|
|
179
|
+
return beaconRequest(reportData);
|
|
180
|
+
} else {
|
|
181
|
+
xhrRequest(reportData);
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
// 批量上报数据
|
|
186
|
+
function lazyReportBatch(data) {
|
|
187
|
+
addCache(data);
|
|
188
|
+
var dataCache = getCache();
|
|
189
|
+
console.error('dataCache', dataCache);
|
|
190
|
+
if (dataCache.length && dataCache.length > config.batchSize) {
|
|
191
|
+
report(dataCache);
|
|
192
|
+
clearCache();
|
|
193
|
+
}
|
|
194
|
+
//
|
|
195
|
+
}
|
|
196
|
+
// 图片发送数据
|
|
197
|
+
function imgRequest(data) {
|
|
198
|
+
var img = new Image();
|
|
199
|
+
// http://127.0.0.1:8080/api?data=encodeURIComponent(data)
|
|
200
|
+
img.src = "".concat(config.url, "?data=").concat(encodeURIComponent(JSON.stringify(data)));
|
|
201
|
+
}
|
|
202
|
+
// 普通ajax发送请求数据
|
|
203
|
+
function xhrRequest(data) {
|
|
204
|
+
if (window.requestIdleCallback) {
|
|
205
|
+
window.requestIdleCallback(function () {
|
|
206
|
+
var xhr = new XMLHttpRequest();
|
|
207
|
+
originalOpen$1.call(xhr, 'post', config.url);
|
|
208
|
+
originalSend$1.call(xhr, JSON.stringify(data));
|
|
209
|
+
}, {
|
|
210
|
+
timeout: 3000
|
|
211
|
+
});
|
|
212
|
+
} else {
|
|
213
|
+
setTimeout(function () {
|
|
214
|
+
var xhr = new XMLHttpRequest();
|
|
215
|
+
originalOpen$1.call(xhr, 'post', url);
|
|
216
|
+
originalSend$1.call(xhr, JSON.stringify(data));
|
|
217
|
+
});
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
// const sendBeacon = isSupportSendBeacon() ? navigator.sendBeacon : xhrRequest
|
|
222
|
+
function beaconRequest(data) {
|
|
223
|
+
if (window.requestIdleCallback) {
|
|
224
|
+
window.requestIdleCallback(function () {
|
|
225
|
+
window.navigator.sendBeacon(config.url, data);
|
|
226
|
+
}, {
|
|
227
|
+
timeout: 3000
|
|
228
|
+
});
|
|
229
|
+
} else {
|
|
230
|
+
setTimeout(function () {
|
|
231
|
+
window.navigator.sendBeacon(config.url, data);
|
|
232
|
+
});
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
var originalFetch = window.fetch;
|
|
237
|
+
function overwriteFetch() {
|
|
238
|
+
window.fetch = function newFetch(url, config) {
|
|
239
|
+
var startTime = Date.now();
|
|
240
|
+
var reportData = {
|
|
241
|
+
type: 'performance',
|
|
242
|
+
subType: 'fetch',
|
|
243
|
+
url: url,
|
|
244
|
+
startTime: startTime,
|
|
245
|
+
method: config.method
|
|
246
|
+
};
|
|
247
|
+
return originalFetch(url, config).then(function (res) {
|
|
248
|
+
var endTime = Date.now();
|
|
249
|
+
reportData.endTime = endTime;
|
|
250
|
+
reportData.duration = endTime - startTime;
|
|
251
|
+
var data = res.clone();
|
|
252
|
+
reportData.status = data.status;
|
|
253
|
+
reportData.success = data.ok;
|
|
254
|
+
// todo 上报数据
|
|
255
|
+
lazyReportBatch(reportData);
|
|
256
|
+
return res;
|
|
257
|
+
}).catch(function (err) {
|
|
258
|
+
var endTime = Date.now();
|
|
259
|
+
reportData.endTime = endTime;
|
|
260
|
+
reportData.duration = endTime - startTime;
|
|
261
|
+
reportData.status = 0;
|
|
262
|
+
reportData.success = false;
|
|
263
|
+
// todo 上报数据
|
|
264
|
+
lazyReportBatch(reportData);
|
|
265
|
+
});
|
|
266
|
+
};
|
|
267
|
+
}
|
|
268
|
+
function fetch() {
|
|
269
|
+
overwriteFetch();
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
function observerEntries() {
|
|
273
|
+
if (document.readyState === 'complete') {
|
|
274
|
+
observerEvent();
|
|
275
|
+
} else {
|
|
276
|
+
var _onLoad = function onLoad() {
|
|
277
|
+
observerEvent();
|
|
278
|
+
window.removeEventListener('load', _onLoad, true);
|
|
279
|
+
};
|
|
280
|
+
window.addEventListener('load', _onLoad, true);
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
function observerEvent() {
|
|
284
|
+
var entryHandler = function entryHandler(list) {
|
|
285
|
+
var data = list.getEntries();
|
|
286
|
+
var _iterator = _createForOfIteratorHelper(data),
|
|
287
|
+
_step;
|
|
288
|
+
try {
|
|
289
|
+
for (_iterator.s(); !(_step = _iterator.n()).done;) {
|
|
290
|
+
var entry = _step.value;
|
|
291
|
+
if (observer) {
|
|
292
|
+
observer.disconnect();
|
|
293
|
+
}
|
|
294
|
+
var reportData = {
|
|
295
|
+
name: entry.name,
|
|
296
|
+
// 资源的名字
|
|
297
|
+
type: 'performance',
|
|
298
|
+
// 类型
|
|
299
|
+
subType: entry.entryType,
|
|
300
|
+
//类型
|
|
301
|
+
sourceType: entry.initiatorType,
|
|
302
|
+
// 资源类型
|
|
303
|
+
duration: entry.duration,
|
|
304
|
+
// 加载时间
|
|
305
|
+
dns: entry.domainLookupEnd - entry.domainLookupStart,
|
|
306
|
+
// dns解析时间
|
|
307
|
+
tcp: entry.connectEnd - entry.connectStart,
|
|
308
|
+
// tcp连接时间
|
|
309
|
+
redirect: entry.redirectEnd - entry.redirectStart,
|
|
310
|
+
// 重定向时间
|
|
311
|
+
ttfb: entry.responseStart,
|
|
312
|
+
// 首字节时间
|
|
313
|
+
protocol: entry.nextHopProtocol,
|
|
314
|
+
// 请求协议
|
|
315
|
+
responseBodySize: entry.encodedBodySize,
|
|
316
|
+
// 响应内容大小
|
|
317
|
+
responseHeaderSize: entry.transferSize - entry.encodedBodySize,
|
|
318
|
+
// 响应头部大小
|
|
319
|
+
transferSize: entry.transferSize,
|
|
320
|
+
// 请求内容大小
|
|
321
|
+
resourceSize: entry.decodedBodySize,
|
|
322
|
+
// 资源解压后的大小
|
|
323
|
+
startTime: performance.now()
|
|
324
|
+
};
|
|
325
|
+
console.log("=================loading===========");
|
|
326
|
+
lazyReportBatch(reportData);
|
|
327
|
+
// console.log(entry);
|
|
328
|
+
}
|
|
329
|
+
} catch (err) {
|
|
330
|
+
_iterator.e(err);
|
|
331
|
+
} finally {
|
|
332
|
+
_iterator.f();
|
|
333
|
+
}
|
|
334
|
+
};
|
|
335
|
+
var observer = new PerformanceObserver(entryHandler);
|
|
336
|
+
observer.observe({
|
|
337
|
+
type: ['resource'],
|
|
338
|
+
buffered: true
|
|
339
|
+
});
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
function observerLCP() {
|
|
343
|
+
var entryHandler = function entryHandler(list) {
|
|
344
|
+
if (observer) {
|
|
345
|
+
observer.disconnect();
|
|
346
|
+
}
|
|
347
|
+
var _iterator = _createForOfIteratorHelper(list.getEntries()),
|
|
348
|
+
_step;
|
|
349
|
+
try {
|
|
350
|
+
for (_iterator.s(); !(_step = _iterator.n()).done;) {
|
|
351
|
+
var entry = _step.value;
|
|
352
|
+
var json = entry.toJSON();
|
|
353
|
+
console.log(json);
|
|
354
|
+
var reportData = _objectSpread2(_objectSpread2({}, json), {}, {
|
|
355
|
+
type: 'performance',
|
|
356
|
+
subType: entry.name,
|
|
357
|
+
pageUrl: window.location.href
|
|
358
|
+
});
|
|
359
|
+
// 发送数据 todo;
|
|
360
|
+
lazyReportBatch(reportData);
|
|
361
|
+
}
|
|
362
|
+
} catch (err) {
|
|
363
|
+
_iterator.e(err);
|
|
364
|
+
} finally {
|
|
365
|
+
_iterator.f();
|
|
366
|
+
}
|
|
367
|
+
};
|
|
368
|
+
// 统计和计算lcp的时间
|
|
369
|
+
var observer = new PerformanceObserver(entryHandler);
|
|
370
|
+
// buffered: true 确保观察到所有paint事件
|
|
371
|
+
observer.observe({
|
|
372
|
+
type: 'largest-contentful-paint',
|
|
373
|
+
buffered: true
|
|
374
|
+
});
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
function observerFCP() {
|
|
378
|
+
var entryHandler = function entryHandler(list) {
|
|
379
|
+
var _iterator = _createForOfIteratorHelper(list.getEntries()),
|
|
380
|
+
_step;
|
|
381
|
+
try {
|
|
382
|
+
for (_iterator.s(); !(_step = _iterator.n()).done;) {
|
|
383
|
+
var entry = _step.value;
|
|
384
|
+
if (entry.name === 'first-contentful-paint') {
|
|
385
|
+
observer.disconnect();
|
|
386
|
+
var json = entry.toJSON();
|
|
387
|
+
console.log(json);
|
|
388
|
+
var reportData = _objectSpread2(_objectSpread2({}, json), {}, {
|
|
389
|
+
type: 'performance',
|
|
390
|
+
subType: entry.name,
|
|
391
|
+
pageUrl: window.location.href
|
|
392
|
+
});
|
|
393
|
+
// 发送数据 todo;
|
|
394
|
+
lazyReportBatch(reportData);
|
|
395
|
+
}
|
|
396
|
+
}
|
|
397
|
+
} catch (err) {
|
|
398
|
+
_iterator.e(err);
|
|
399
|
+
} finally {
|
|
400
|
+
_iterator.f();
|
|
401
|
+
}
|
|
402
|
+
};
|
|
403
|
+
// 统计和计算fcp的时间
|
|
404
|
+
var observer = new PerformanceObserver(entryHandler);
|
|
405
|
+
// buffered: true 确保观察到所有paint事件
|
|
406
|
+
observer.observe({
|
|
407
|
+
type: 'paint',
|
|
408
|
+
buffered: true
|
|
409
|
+
});
|
|
410
|
+
}
|
|
411
|
+
|
|
412
|
+
function observerLoad() {
|
|
413
|
+
window.addEventListener('pageShow', function (event) {
|
|
414
|
+
requestAnimationFrame(function () {
|
|
415
|
+
['load'].forEach(function (type) {
|
|
416
|
+
var reportData = {
|
|
417
|
+
type: 'performance',
|
|
418
|
+
subType: type,
|
|
419
|
+
pageUrl: window.location.href,
|
|
420
|
+
startTime: performance.now() - event.timeStamp
|
|
421
|
+
};
|
|
422
|
+
// 发送数据
|
|
423
|
+
lazyReportBatch(reportData);
|
|
424
|
+
});
|
|
425
|
+
}, true);
|
|
426
|
+
});
|
|
427
|
+
}
|
|
428
|
+
|
|
429
|
+
function observerPaint() {
|
|
430
|
+
var entryHandler = function entryHandler(list) {
|
|
431
|
+
var _iterator = _createForOfIteratorHelper(list.getEntries()),
|
|
432
|
+
_step;
|
|
433
|
+
try {
|
|
434
|
+
for (_iterator.s(); !(_step = _iterator.n()).done;) {
|
|
435
|
+
var entry = _step.value;
|
|
436
|
+
if (entry.name === 'first-paint') {
|
|
437
|
+
observer.disconnect();
|
|
438
|
+
var json = entry.toJSON();
|
|
439
|
+
console.log(json);
|
|
440
|
+
var reportData = _objectSpread2(_objectSpread2({}, json), {}, {
|
|
441
|
+
type: 'performance',
|
|
442
|
+
subType: entry.name,
|
|
443
|
+
pageUrl: window.location.href
|
|
444
|
+
});
|
|
445
|
+
// 发送数据 todo;
|
|
446
|
+
lazyReportBatch(reportData);
|
|
447
|
+
}
|
|
448
|
+
}
|
|
449
|
+
} catch (err) {
|
|
450
|
+
_iterator.e(err);
|
|
451
|
+
} finally {
|
|
452
|
+
_iterator.f();
|
|
453
|
+
}
|
|
454
|
+
};
|
|
455
|
+
// 统计和计算fp的时间
|
|
456
|
+
var observer = new PerformanceObserver(entryHandler);
|
|
457
|
+
// buffered: true 确保观察到所有paint事件
|
|
458
|
+
observer.observe({
|
|
459
|
+
type: 'paint',
|
|
460
|
+
buffered: true
|
|
461
|
+
});
|
|
462
|
+
}
|
|
463
|
+
|
|
464
|
+
var originalProto = XMLHttpRequest.prototype;
|
|
465
|
+
var originalSend = originalProto.send;
|
|
466
|
+
var originalOpen = originalProto.open;
|
|
467
|
+
function overwriteOpenAndSend() {
|
|
468
|
+
originalProto.open = function newOpen() {
|
|
469
|
+
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
|
|
470
|
+
args[_key] = arguments[_key];
|
|
471
|
+
}
|
|
472
|
+
this.url = args[1];
|
|
473
|
+
this.method = args[0];
|
|
474
|
+
originalOpen.apply(this, args);
|
|
475
|
+
};
|
|
476
|
+
originalProto.send = function newSend() {
|
|
477
|
+
var _this = this;
|
|
478
|
+
this.startTime = Date.now();
|
|
479
|
+
var _onLoaded = function onLoaded() {
|
|
480
|
+
_this.endTime = Date.now();
|
|
481
|
+
_this.duration = _this.endTime - _this.startTime;
|
|
482
|
+
var url = _this.url,
|
|
483
|
+
method = _this.method,
|
|
484
|
+
startTime = _this.startTime,
|
|
485
|
+
endTime = _this.endTime,
|
|
486
|
+
duration = _this.duration,
|
|
487
|
+
status = _this.status;
|
|
488
|
+
var reportData = {
|
|
489
|
+
status: status,
|
|
490
|
+
duration: duration,
|
|
491
|
+
startTime: startTime,
|
|
492
|
+
endTime: endTime,
|
|
493
|
+
url: url,
|
|
494
|
+
method: method.toUpperCase(),
|
|
495
|
+
type: 'performance',
|
|
496
|
+
success: status >= 200 && status < 300,
|
|
497
|
+
subType: 'xhr'
|
|
498
|
+
};
|
|
499
|
+
// todo 发送数据
|
|
500
|
+
lazyReportBatch(reportData);
|
|
501
|
+
_this.removeEventListener('loadend', _onLoaded, true);
|
|
502
|
+
};
|
|
503
|
+
this.addEventListener('loadend', _onLoaded, true);
|
|
504
|
+
for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
|
|
505
|
+
args[_key2] = arguments[_key2];
|
|
506
|
+
}
|
|
507
|
+
originalSend.apply(this, args);
|
|
508
|
+
};
|
|
509
|
+
}
|
|
510
|
+
function xhr() {
|
|
511
|
+
overwriteOpenAndSend();
|
|
512
|
+
}
|
|
513
|
+
|
|
514
|
+
function performance$1() {
|
|
515
|
+
fetch();
|
|
516
|
+
observerEntries();
|
|
517
|
+
observerLCP();
|
|
518
|
+
observerFCP();
|
|
519
|
+
observerLoad();
|
|
520
|
+
observerPaint();
|
|
521
|
+
xhr();
|
|
522
|
+
}
|
|
523
|
+
|
|
524
|
+
function error() {
|
|
525
|
+
// 捕获资源加载失败的错误: js css img
|
|
526
|
+
window.addEventListener('error', function (e) {
|
|
527
|
+
var target = e.target;
|
|
528
|
+
if (target.src || target.href) {
|
|
529
|
+
var url = target.src || target.href;
|
|
530
|
+
var reportData = {
|
|
531
|
+
type: 'error',
|
|
532
|
+
subType: 'resource',
|
|
533
|
+
url: url,
|
|
534
|
+
html: target.outerHTML,
|
|
535
|
+
pageUrl: window.location.href,
|
|
536
|
+
pahts: e.path
|
|
537
|
+
};
|
|
538
|
+
// todo 发送错误信息
|
|
539
|
+
lazyReportBatch(reportData);
|
|
540
|
+
}
|
|
541
|
+
}, true);
|
|
542
|
+
// 捕获js错误
|
|
543
|
+
window.onerror = function (msg, url, lineNo, columnNo, error) {
|
|
544
|
+
var reportData = {
|
|
545
|
+
type: 'error',
|
|
546
|
+
subType: 'js',
|
|
547
|
+
msg: msg,
|
|
548
|
+
url: url,
|
|
549
|
+
lineNo: lineNo,
|
|
550
|
+
columnNo: columnNo,
|
|
551
|
+
stack: error.stack,
|
|
552
|
+
pageUrl: window.location.href,
|
|
553
|
+
startTime: performance.now()
|
|
554
|
+
};
|
|
555
|
+
// todo 发送错误信息
|
|
556
|
+
lazyReportBatch(reportData);
|
|
557
|
+
};
|
|
558
|
+
// 捕获promise错误 asyn await
|
|
559
|
+
window.addEventListener('unhandledrejection', function (e) {
|
|
560
|
+
var _e$reason;
|
|
561
|
+
var reportData = {
|
|
562
|
+
type: 'error',
|
|
563
|
+
subType: 'promise',
|
|
564
|
+
reason: (_e$reason = e.reason) === null || _e$reason === void 0 ? void 0 : _e$reason.stack,
|
|
565
|
+
pageUrl: window.location.href,
|
|
566
|
+
startTime: e.timeStamp
|
|
567
|
+
};
|
|
568
|
+
// todo 发送错误信息
|
|
569
|
+
lazyReportBatch(reportData);
|
|
570
|
+
}, true);
|
|
571
|
+
}
|
|
572
|
+
|
|
573
|
+
function onClick() {
|
|
574
|
+
['mousedown', 'touchstart'].forEach(function (eventType) {
|
|
575
|
+
window.addEventListener(eventType, function (e) {
|
|
576
|
+
var target = e.target;
|
|
577
|
+
console.log('click', target);
|
|
578
|
+
if (target.tagName) {
|
|
579
|
+
var reportData = {
|
|
580
|
+
// scrollTop: document.documentElement.scrollTop,
|
|
581
|
+
type: 'behavior',
|
|
582
|
+
subType: 'click',
|
|
583
|
+
target: target.tagName,
|
|
584
|
+
startTime: e.timeStamp,
|
|
585
|
+
innerHtml: target.innerHTML,
|
|
586
|
+
outerHtml: target.outerHTML,
|
|
587
|
+
with: target.offsetWidth,
|
|
588
|
+
height: target.offsetHeight,
|
|
589
|
+
eventType: eventType,
|
|
590
|
+
path: e.path
|
|
591
|
+
};
|
|
592
|
+
lazyReportBatch(reportData);
|
|
593
|
+
}
|
|
594
|
+
});
|
|
595
|
+
});
|
|
596
|
+
}
|
|
597
|
+
|
|
598
|
+
function pageChange() {
|
|
599
|
+
// hash histroy
|
|
600
|
+
var oldUrl = '';
|
|
601
|
+
window.addEventListener('hashchange', function (event) {
|
|
602
|
+
console.error('hashchange', event);
|
|
603
|
+
var newUrl = event.newURL;
|
|
604
|
+
var reportData = {
|
|
605
|
+
form: oldUrl,
|
|
606
|
+
to: newUrl,
|
|
607
|
+
type: 'behavior',
|
|
608
|
+
subType: 'hashchange',
|
|
609
|
+
startTime: performance.now(),
|
|
610
|
+
uuid: generateUniqueId()
|
|
611
|
+
};
|
|
612
|
+
lazyReportBatch(reportData);
|
|
613
|
+
oldUrl = newUrl;
|
|
614
|
+
}, true);
|
|
615
|
+
var from = '';
|
|
616
|
+
window.addEventListener('popstate', function (event) {
|
|
617
|
+
console.error('popstate', event);
|
|
618
|
+
var to = window.location.href;
|
|
619
|
+
var reportData = {
|
|
620
|
+
form: from,
|
|
621
|
+
to: to,
|
|
622
|
+
type: 'behavior',
|
|
623
|
+
subType: 'popstate',
|
|
624
|
+
startTime: performance.now(),
|
|
625
|
+
uuid: generateUniqueId()
|
|
626
|
+
};
|
|
627
|
+
lazyReportBatch(reportData);
|
|
628
|
+
from = to;
|
|
629
|
+
}, true);
|
|
630
|
+
}
|
|
631
|
+
|
|
632
|
+
function pv() {
|
|
633
|
+
var reportData = {
|
|
634
|
+
type: 'behavior',
|
|
635
|
+
subType: 'pv',
|
|
636
|
+
startTime: performance.now(),
|
|
637
|
+
pageUrl: window.location.href,
|
|
638
|
+
referror: document.referrer,
|
|
639
|
+
uuid: generateUniqueId()
|
|
640
|
+
};
|
|
641
|
+
lazyReportBatch(reportData);
|
|
642
|
+
}
|
|
643
|
+
|
|
644
|
+
function behavior() {
|
|
645
|
+
onClick(), pageChange(), pv();
|
|
646
|
+
}
|
|
647
|
+
|
|
648
|
+
window.__webEyeSDK__ = {
|
|
649
|
+
version: '0.0.1'
|
|
650
|
+
};
|
|
651
|
+
|
|
652
|
+
// 针对Vue项目的错误捕获
|
|
653
|
+
function install(Vue, options) {
|
|
654
|
+
if (__webEyeSDK__.vue) return;
|
|
655
|
+
__webEyeSDK__.vue = true;
|
|
656
|
+
setConfig(options);
|
|
657
|
+
var handler = Vue.config.errorHandler;
|
|
658
|
+
// vue项目中 通过 Vue.config.errorHandler 捕获错误
|
|
659
|
+
Vue.config.errorHandler = function (err, vm, info) {
|
|
660
|
+
// todo: 上报具体的错误信息
|
|
661
|
+
var reportData = {
|
|
662
|
+
info: info,
|
|
663
|
+
error: err.stack,
|
|
664
|
+
subType: 'vue',
|
|
665
|
+
type: 'error',
|
|
666
|
+
startTime: window.performance.now(),
|
|
667
|
+
pageURL: window.location.href
|
|
668
|
+
};
|
|
669
|
+
console.log('vue error', reportData);
|
|
670
|
+
lazyReportBatch(reportData);
|
|
671
|
+
if (handler) {
|
|
672
|
+
handler.call(this, err, vm, info);
|
|
673
|
+
}
|
|
674
|
+
};
|
|
675
|
+
}
|
|
676
|
+
// 针对React项目的错误捕获
|
|
677
|
+
function errorBoundary(err, info) {
|
|
678
|
+
if (__webEyeSDK__.react) return;
|
|
679
|
+
__webEyeSDK__.react = true;
|
|
680
|
+
// todo: 上报具体的错误信息
|
|
681
|
+
var reportData = {
|
|
682
|
+
error: err === null || err === void 0 ? void 0 : err.stack,
|
|
683
|
+
info: info,
|
|
684
|
+
subType: 'react',
|
|
685
|
+
type: 'error',
|
|
686
|
+
startTime: window.performance.now(),
|
|
687
|
+
pageURL: window.location.href
|
|
688
|
+
};
|
|
689
|
+
lazyReportBatch(reportData);
|
|
690
|
+
}
|
|
691
|
+
function init(options) {
|
|
692
|
+
setConfig(options);
|
|
693
|
+
// performance();
|
|
694
|
+
error();
|
|
695
|
+
// behavior();
|
|
696
|
+
}
|
|
697
|
+
var webEyeSDK = {
|
|
698
|
+
install: install,
|
|
699
|
+
errorBoundary: errorBoundary,
|
|
700
|
+
performance: performance$1,
|
|
701
|
+
error: error,
|
|
702
|
+
behavior: behavior,
|
|
703
|
+
init: init
|
|
704
|
+
};
|
|
705
|
+
|
|
706
|
+
exports.default = webEyeSDK;
|
|
707
|
+
exports.errorBoundary = errorBoundary;
|
|
708
|
+
exports.init = init;
|
|
709
|
+
exports.install = install;
|
|
710
|
+
//# sourceMappingURL=monitor.cjs.js.map
|