performance-sdk-web-xiangwang 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/README.md +255 -0
- package/dist/index.cjs.js +502 -0
- package/dist/index.cjs.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.esm.js +500 -0
- package/dist/index.esm.js.map +1 -0
- package/dist/index.umd.js +2 -0
- package/dist/index.umd.js.map +1 -0
- package/dist/interaction/FID.d.ts +1 -0
- package/dist/interaction/INP.d.ts +1 -0
- package/dist/interaction/index.d.ts +3 -0
- package/dist/interaction/longtask.d.ts +1 -0
- package/dist/loading/FCP.d.ts +1 -0
- package/dist/loading/FP.d.ts +1 -0
- package/dist/loading/LCP.d.ts +1 -0
- package/dist/loading/index.d.ts +4 -0
- package/dist/loading/load.d.ts +1 -0
- package/dist/network/entries.d.ts +1 -0
- package/dist/network/index.d.ts +2 -0
- package/dist/network/request.d.ts +1 -0
- package/dist/report/index.d.ts +6 -0
- package/dist/util/index.d.ts +5 -0
- package/dist/visualStability/CLS.d.ts +1 -0
- package/dist/visualStability/index.d.ts +1 -0
- package/package.json +33 -0
|
@@ -0,0 +1,500 @@
|
|
|
1
|
+
/******************************************************************************
|
|
2
|
+
Copyright (c) Microsoft Corporation.
|
|
3
|
+
|
|
4
|
+
Permission to use, copy, modify, and/or distribute this software for any
|
|
5
|
+
purpose with or without fee is hereby granted.
|
|
6
|
+
|
|
7
|
+
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
|
|
8
|
+
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
|
|
9
|
+
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
|
|
10
|
+
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
|
|
11
|
+
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
|
|
12
|
+
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
|
13
|
+
PERFORMANCE OF THIS SOFTWARE.
|
|
14
|
+
***************************************************************************** */
|
|
15
|
+
/* global Reflect, Promise, SuppressedError, Symbol, Iterator */
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
var __assign = function() {
|
|
19
|
+
__assign = Object.assign || function __assign(t) {
|
|
20
|
+
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
|
21
|
+
s = arguments[i];
|
|
22
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
|
|
23
|
+
}
|
|
24
|
+
return t;
|
|
25
|
+
};
|
|
26
|
+
return __assign.apply(this, arguments);
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
function __spreadArray(to, from, pack) {
|
|
30
|
+
if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
|
|
31
|
+
if (ar || !(i in from)) {
|
|
32
|
+
if (!ar) ar = Array.prototype.slice.call(from, 0, i);
|
|
33
|
+
ar[i] = from[i];
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
return to.concat(ar || Array.prototype.slice.call(from));
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) {
|
|
40
|
+
var e = new Error(message);
|
|
41
|
+
return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* 发送用户行为数据
|
|
46
|
+
* @param data - 用户行为数据
|
|
47
|
+
* @param url - 数据上报的URL
|
|
48
|
+
*/
|
|
49
|
+
var sendBehaviorData = function (data, url) {
|
|
50
|
+
// 1. 包装数据:加上一些公共信息(比如 UserAgent)
|
|
51
|
+
var dataToSend = __assign(__assign({}, data), { userAgent: navigator.userAgent, timestamp: Date.now() });
|
|
52
|
+
// 2. 优先使用 sendBeacon (最稳,且不阻塞)
|
|
53
|
+
if (navigator.sendBeacon) {
|
|
54
|
+
var blob = new Blob([JSON.stringify(dataToSend)], {
|
|
55
|
+
type: 'application/json',
|
|
56
|
+
});
|
|
57
|
+
navigator.sendBeacon(url, blob);
|
|
58
|
+
}
|
|
59
|
+
else {
|
|
60
|
+
// 3. 降级方案:使用 fetch + keepalive
|
|
61
|
+
fetch(url, {
|
|
62
|
+
method: 'POST',
|
|
63
|
+
headers: { 'Content-Type': 'application/json' },
|
|
64
|
+
body: JSON.stringify(dataToSend),
|
|
65
|
+
keepalive: true,
|
|
66
|
+
}).catch(function (error) { return console.error('Error sending behavior data:', error); });
|
|
67
|
+
}
|
|
68
|
+
};
|
|
69
|
+
|
|
70
|
+
function startFP(reportUrl) {
|
|
71
|
+
var entryHandler = function (list) {
|
|
72
|
+
for (var _i = 0, _a = list.getEntries(); _i < _a.length; _i++) {
|
|
73
|
+
var entry = _a[_i];
|
|
74
|
+
if (entry.entryType === 'paint' && entry.name === 'first-paint') {
|
|
75
|
+
observer.disconnect();
|
|
76
|
+
var json = entry.toJSON();
|
|
77
|
+
var reportData = __assign(__assign({}, json), { type: 'performance', name: entry.name, pageUrl: window.location.href });
|
|
78
|
+
sendBehaviorData(reportData, reportUrl);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
};
|
|
82
|
+
var observer = new PerformanceObserver(entryHandler);
|
|
83
|
+
observer.observe({ type: 'paint', buffered: true });
|
|
84
|
+
return function () { return observer.disconnect(); };
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
function startFCP(reportUrl) {
|
|
88
|
+
var entryHandler = function (list) {
|
|
89
|
+
for (var _i = 0, _a = list.getEntries(); _i < _a.length; _i++) {
|
|
90
|
+
var entry = _a[_i];
|
|
91
|
+
if (entry.entryType === 'paint' &&
|
|
92
|
+
entry.name === 'first-contentful-paint') {
|
|
93
|
+
observer.disconnect();
|
|
94
|
+
var json = entry.toJSON();
|
|
95
|
+
var reportData = __assign(__assign({}, json), { type: 'performance', name: entry.name, pageUrl: window.location.href });
|
|
96
|
+
sendBehaviorData(reportData, reportUrl);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
};
|
|
100
|
+
var observer = new PerformanceObserver(entryHandler);
|
|
101
|
+
observer.observe({ type: 'paint', buffered: true });
|
|
102
|
+
return function () { return observer.disconnect(); };
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
var getSelector = function (element) {
|
|
106
|
+
if (!element)
|
|
107
|
+
return '';
|
|
108
|
+
try {
|
|
109
|
+
var selector = element.tagName.toLowerCase();
|
|
110
|
+
if (element.id) {
|
|
111
|
+
selector += "#".concat(element.id);
|
|
112
|
+
}
|
|
113
|
+
var classAttr = element.getAttribute('class');
|
|
114
|
+
if (classAttr) {
|
|
115
|
+
var classes = classAttr.trim().split(/\s+/);
|
|
116
|
+
if (classes.length > 0) {
|
|
117
|
+
selector += ".".concat(classes.join('.'));
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
return selector;
|
|
121
|
+
}
|
|
122
|
+
catch (e) {
|
|
123
|
+
return '';
|
|
124
|
+
}
|
|
125
|
+
};
|
|
126
|
+
/**
|
|
127
|
+
* @param { Function } cb 回调函数
|
|
128
|
+
*/
|
|
129
|
+
var onUrlChange = function (cb) {
|
|
130
|
+
// 1. 监听浏览器前进/后退
|
|
131
|
+
window.addEventListener('popstate', cb);
|
|
132
|
+
// 2. 劫持 pushState (Vue/React 路由跳转常用)
|
|
133
|
+
var originalPush = history.pushState;
|
|
134
|
+
history.pushState = function () {
|
|
135
|
+
var args = [];
|
|
136
|
+
for (var _i = 0; _i < arguments.length; _i++) {
|
|
137
|
+
args[_i] = arguments[_i];
|
|
138
|
+
}
|
|
139
|
+
var result = originalPush.apply(this, args);
|
|
140
|
+
cb();
|
|
141
|
+
return result;
|
|
142
|
+
};
|
|
143
|
+
// 3. 劫持 replaceState
|
|
144
|
+
var originalReplace = history.replaceState;
|
|
145
|
+
history.replaceState = function () {
|
|
146
|
+
var args = [];
|
|
147
|
+
for (var _i = 0; _i < arguments.length; _i++) {
|
|
148
|
+
args[_i] = arguments[_i];
|
|
149
|
+
}
|
|
150
|
+
var result = originalReplace.apply(this, args);
|
|
151
|
+
cb();
|
|
152
|
+
return result;
|
|
153
|
+
};
|
|
154
|
+
};
|
|
155
|
+
|
|
156
|
+
function startLCP(reportUrl) {
|
|
157
|
+
var lcpEntry;
|
|
158
|
+
var hasReported = false;
|
|
159
|
+
var entryHandler = function (list) {
|
|
160
|
+
for (var _i = 0, _a = list.getEntries(); _i < _a.length; _i++) {
|
|
161
|
+
var entry = _a[_i];
|
|
162
|
+
// 浏览器会不断更新 LCP,我们只需要记录最新的
|
|
163
|
+
lcpEntry = entry;
|
|
164
|
+
}
|
|
165
|
+
};
|
|
166
|
+
var observer = new PerformanceObserver(entryHandler);
|
|
167
|
+
observer.observe({ type: 'largest-contentful-paint', buffered: true });
|
|
168
|
+
var report = function () {
|
|
169
|
+
if (hasReported || !lcpEntry)
|
|
170
|
+
return;
|
|
171
|
+
hasReported = true;
|
|
172
|
+
var json = lcpEntry.toJSON();
|
|
173
|
+
var reportData = __assign(__assign({}, json), { lcpTime: lcpEntry.startTime, elementSelector: getSelector(lcpEntry.element), type: 'performance', name: lcpEntry.name, pageUrl: window.location.href });
|
|
174
|
+
sendBehaviorData(reportData, reportUrl);
|
|
175
|
+
// 上报后即可断开
|
|
176
|
+
disconnect();
|
|
177
|
+
};
|
|
178
|
+
// 停止监听并清理
|
|
179
|
+
var disconnect = function () {
|
|
180
|
+
if (observer)
|
|
181
|
+
observer.disconnect();
|
|
182
|
+
['click', 'keydown', 'pointerdown'].forEach(function (type) {
|
|
183
|
+
window.removeEventListener(type, report, true);
|
|
184
|
+
});
|
|
185
|
+
document.removeEventListener('visibilitychange', onVisibilityChange);
|
|
186
|
+
};
|
|
187
|
+
// 1. 页面隐藏时上报
|
|
188
|
+
var onVisibilityChange = function () {
|
|
189
|
+
if (document.visibilityState === 'hidden') {
|
|
190
|
+
report();
|
|
191
|
+
}
|
|
192
|
+
};
|
|
193
|
+
// 2. 用户交互时上报(因为交互后 LCP 就不再产生/不再准确)
|
|
194
|
+
['click', 'keydown', 'pointerdown'].forEach(function (type) {
|
|
195
|
+
window.addEventListener(type, report, { once: true, capture: true });
|
|
196
|
+
});
|
|
197
|
+
document.addEventListener('visibilitychange', onVisibilityChange);
|
|
198
|
+
return disconnect;
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
function startLoad(reportUrl) {
|
|
202
|
+
var onPageShow = function (event) {
|
|
203
|
+
requestAnimationFrame(function () {
|
|
204
|
+
['load'].forEach(function (type) {
|
|
205
|
+
var reportData = {
|
|
206
|
+
type: 'performance',
|
|
207
|
+
subType: type,
|
|
208
|
+
pageUrl: window.location.href,
|
|
209
|
+
startTime: event.timeStamp,
|
|
210
|
+
delay: performance.now() - event.timeStamp,
|
|
211
|
+
};
|
|
212
|
+
sendBehaviorData(reportData, reportUrl);
|
|
213
|
+
});
|
|
214
|
+
});
|
|
215
|
+
};
|
|
216
|
+
window.addEventListener('pageshow', onPageShow, true);
|
|
217
|
+
return function () {
|
|
218
|
+
window.removeEventListener('pageshow', onPageShow, true);
|
|
219
|
+
};
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
function startFID(reportUrl) {
|
|
223
|
+
var entryHandler = function (list) {
|
|
224
|
+
for (var _i = 0, _a = list.getEntries(); _i < _a.length; _i++) {
|
|
225
|
+
var entry = _a[_i];
|
|
226
|
+
observer.disconnect();
|
|
227
|
+
var json = entry.toJSON();
|
|
228
|
+
var inputDelay = entry.processingStart - entry.startTime;
|
|
229
|
+
var reportData = __assign(__assign({}, json), { name: entry.name, inputDelay: inputDelay, duration: entry.duration, startTime: entry.startTime, type: 'performance', subType: 'first-input', pageUrl: window.location.href, elementSelector: getSelector(entry.target) });
|
|
230
|
+
sendBehaviorData(reportData, reportUrl);
|
|
231
|
+
}
|
|
232
|
+
};
|
|
233
|
+
var observer = new PerformanceObserver(entryHandler);
|
|
234
|
+
observer.observe({ type: 'first-input', buffered: true });
|
|
235
|
+
return function () { return observer.disconnect(); };
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
function startINP(reportUrl) {
|
|
239
|
+
var supported = typeof PerformanceObserver !== 'undefined' &&
|
|
240
|
+
PerformanceObserver.supportedEntryTypes &&
|
|
241
|
+
PerformanceObserver.supportedEntryTypes.indexOf('event') >= 0;
|
|
242
|
+
if (!supported)
|
|
243
|
+
return function () { };
|
|
244
|
+
var entryHandler = function (list) {
|
|
245
|
+
for (var _i = 0, _a = list.getEntries(); _i < _a.length; _i++) {
|
|
246
|
+
var entry = _a[_i];
|
|
247
|
+
// 过滤掉 duration 很短的交互,减少日志量,只关注慢交互(例如 > 40ms)
|
|
248
|
+
// 或者根据需求记录所有交互
|
|
249
|
+
if (entry.interactionId) {
|
|
250
|
+
// interactionId 存在意味着这是一个有意义的用户交互
|
|
251
|
+
var reportData = {
|
|
252
|
+
type: 'performance',
|
|
253
|
+
subType: 'interaction',
|
|
254
|
+
name: entry.name, // e.g., 'click', 'keydown'
|
|
255
|
+
duration: entry.duration, // 总耗时
|
|
256
|
+
startTime: entry.startTime,
|
|
257
|
+
processingStart: entry.processingStart,
|
|
258
|
+
processingEnd: entry.processingEnd,
|
|
259
|
+
inputDelay: entry.processingStart - entry.startTime, // 输入延迟
|
|
260
|
+
processingTime: entry.processingEnd - entry.processingStart, // 事件回调执行时间
|
|
261
|
+
presentationDelay: entry.duration - (entry.processingEnd - entry.startTime), // 渲染延迟
|
|
262
|
+
interactionId: entry.interactionId,
|
|
263
|
+
pageUrl: window.location.href,
|
|
264
|
+
};
|
|
265
|
+
sendBehaviorData(reportData, reportUrl);
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
};
|
|
269
|
+
var observer = new PerformanceObserver(entryHandler);
|
|
270
|
+
// durationThreshold: 16 (默认 104ms),设置为 16ms 可以捕获更多交互细节,或者设置为 40ms 关注卡顿
|
|
271
|
+
observer.observe({
|
|
272
|
+
type: 'event',
|
|
273
|
+
durationThreshold: 40,
|
|
274
|
+
buffered: true,
|
|
275
|
+
});
|
|
276
|
+
return function () { return observer.disconnect(); };
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
function startLongTask(reportUrl) {
|
|
280
|
+
var types = PerformanceObserver.supportedEntryTypes || [];
|
|
281
|
+
// 仅使用 LongTask,简单直接
|
|
282
|
+
if (types.indexOf('longtask') < 0)
|
|
283
|
+
return function () { };
|
|
284
|
+
var observer = new PerformanceObserver(function (list) {
|
|
285
|
+
var _a;
|
|
286
|
+
for (var _i = 0, _b = list.getEntries(); _i < _b.length; _i++) {
|
|
287
|
+
var entry = _b[_i];
|
|
288
|
+
// @ts-ignore
|
|
289
|
+
var attribution = ((_a = entry.attribution) === null || _a === void 0 ? void 0 : _a.map(function (a) { return ({
|
|
290
|
+
来源: a.name,
|
|
291
|
+
类型: a.containerType
|
|
292
|
+
}); })) || [];
|
|
293
|
+
var reportData = {
|
|
294
|
+
type: 'performance',
|
|
295
|
+
subType: 'longtask',
|
|
296
|
+
name: 'LongTask',
|
|
297
|
+
duration: entry.duration,
|
|
298
|
+
attribution: attribution,
|
|
299
|
+
startTime: entry.startTime,
|
|
300
|
+
pageUrl: window.location.href,
|
|
301
|
+
};
|
|
302
|
+
sendBehaviorData(reportData, reportUrl);
|
|
303
|
+
}
|
|
304
|
+
});
|
|
305
|
+
observer.observe({ type: 'longtask', buffered: true });
|
|
306
|
+
return function () { return observer.disconnect(); };
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
function startCLS(options) {
|
|
310
|
+
if (options === void 0) { options = {}; }
|
|
311
|
+
var reportUrl = options.reportUrl;
|
|
312
|
+
var clsValue = 0;
|
|
313
|
+
var clsEntries = [];
|
|
314
|
+
var entryHandler = function (list) {
|
|
315
|
+
var _loop_1 = function (entry) {
|
|
316
|
+
if (entry.hadRecentInput)
|
|
317
|
+
return "continue";
|
|
318
|
+
// 简单累加 (演示用,生产环境建议用 Session Window)
|
|
319
|
+
clsValue += entry.value;
|
|
320
|
+
// 记录导致偏移的元素
|
|
321
|
+
if (entry.sources) {
|
|
322
|
+
entry.sources.forEach(function (source) {
|
|
323
|
+
if (source.node) {
|
|
324
|
+
var clsEntry = {
|
|
325
|
+
selector: getSelector(source.node),
|
|
326
|
+
value: entry.value,
|
|
327
|
+
// 可以添加更多 debug 信息,如 previousRect, currentRect
|
|
328
|
+
};
|
|
329
|
+
clsEntries.push(clsEntry);
|
|
330
|
+
if (options.log) {
|
|
331
|
+
console.log('[CLS] Layout Shift Detected:', clsEntry);
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
});
|
|
335
|
+
}
|
|
336
|
+
};
|
|
337
|
+
for (var _i = 0, _a = list.getEntries(); _i < _a.length; _i++) {
|
|
338
|
+
var entry = _a[_i];
|
|
339
|
+
_loop_1(entry);
|
|
340
|
+
}
|
|
341
|
+
};
|
|
342
|
+
var observer = new PerformanceObserver(entryHandler);
|
|
343
|
+
observer.observe({ type: 'layout-shift', buffered: true });
|
|
344
|
+
var report = function (isFinal) {
|
|
345
|
+
var data = {
|
|
346
|
+
clsValue: clsValue,
|
|
347
|
+
clsEntries: __spreadArray([], clsEntries, true), // 包含详细的偏移来源
|
|
348
|
+
type: 'performance',
|
|
349
|
+
subType: 'layout-shift',
|
|
350
|
+
isFinal: isFinal, // 标记是否为最终值
|
|
351
|
+
pageUrl: window.location.href,
|
|
352
|
+
};
|
|
353
|
+
sendBehaviorData(data, reportUrl);
|
|
354
|
+
// 上报后清零,为下一个路由做准备
|
|
355
|
+
clsValue = 0;
|
|
356
|
+
clsEntries = [];
|
|
357
|
+
};
|
|
358
|
+
var onVisibilityChange = function () {
|
|
359
|
+
if (document.visibilityState === 'hidden')
|
|
360
|
+
report(true);
|
|
361
|
+
};
|
|
362
|
+
// 1. 页面关闭/隐藏时上报
|
|
363
|
+
document.addEventListener('visibilitychange', onVisibilityChange);
|
|
364
|
+
window.addEventListener('pagehide', function () { return report(true); });
|
|
365
|
+
// 2. 核心:SPA 路由切换时上报并重置
|
|
366
|
+
onUrlChange(function () {
|
|
367
|
+
// 稍微延迟一点,确保当前页面的最后一次偏移被记录
|
|
368
|
+
requestAnimationFrame(function () {
|
|
369
|
+
report(true);
|
|
370
|
+
});
|
|
371
|
+
});
|
|
372
|
+
return function () {
|
|
373
|
+
observer.disconnect();
|
|
374
|
+
document.removeEventListener('visibilitychange', onVisibilityChange);
|
|
375
|
+
};
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
function startEntries(reportUrl) {
|
|
379
|
+
var observer;
|
|
380
|
+
var observeEvent = function () {
|
|
381
|
+
var entryHandler = function (list) {
|
|
382
|
+
var data = list.getEntries();
|
|
383
|
+
for (var _i = 0, data_1 = data; _i < data_1.length; _i++) {
|
|
384
|
+
var entry = data_1[_i];
|
|
385
|
+
// 1. 过滤掉 API 请求 (由 startRequest 处理)
|
|
386
|
+
if (entry.initiatorType === 'fetch' ||
|
|
387
|
+
entry.initiatorType === 'xmlhttprequest') {
|
|
388
|
+
continue;
|
|
389
|
+
}
|
|
390
|
+
// 2. 防止死循环:过滤掉上报接口自身的请求
|
|
391
|
+
if (entry.name === reportUrl || entry.name.includes(reportUrl)) {
|
|
392
|
+
continue;
|
|
393
|
+
}
|
|
394
|
+
// 3. 过滤掉 Beacon 请求
|
|
395
|
+
if (entry.initiatorType === 'beacon') {
|
|
396
|
+
continue;
|
|
397
|
+
}
|
|
398
|
+
var reportData = {
|
|
399
|
+
name: entry.name, // 资源的名字
|
|
400
|
+
type: 'performance', // 类型
|
|
401
|
+
subType: entry.entryType, // 类型
|
|
402
|
+
sourceType: entry.initiatorType, // 资源类型
|
|
403
|
+
duration: entry.duration, // 加载时间
|
|
404
|
+
dns: entry.domainLookupEnd - entry.domainLookupStart, // dns解析时间
|
|
405
|
+
tcp: entry.connectEnd - entry.connectStart, // tcp连接时间
|
|
406
|
+
redirect: entry.redirectEnd - entry.redirectStart, // 重定向时间
|
|
407
|
+
ttfb: entry.responseStart, // 首字节时间
|
|
408
|
+
protocol: entry.nextHopProtocol, // 请求协议
|
|
409
|
+
responseBodySize: entry.encodedBodySize, // 响应内容大小
|
|
410
|
+
responseHeaderSize: entry.transferSize - entry.encodedBodySize, // 响应头大小
|
|
411
|
+
transferSize: entry.transferSize, // 请求内容大小
|
|
412
|
+
resourceSize: entry.decodedBodySize, // 资源解压后的大小
|
|
413
|
+
startTime: performance.now(),
|
|
414
|
+
};
|
|
415
|
+
//说下resourceSize、encodedBodySize、responseBodySize的区别
|
|
416
|
+
sendBehaviorData(reportData, reportUrl);
|
|
417
|
+
}
|
|
418
|
+
};
|
|
419
|
+
observer = new PerformanceObserver(entryHandler);
|
|
420
|
+
observer.observe({ type: 'resource', buffered: true });
|
|
421
|
+
};
|
|
422
|
+
if (document.readyState === 'complete') {
|
|
423
|
+
observeEvent();
|
|
424
|
+
}
|
|
425
|
+
else {
|
|
426
|
+
var onLoad_1 = function () {
|
|
427
|
+
observeEvent();
|
|
428
|
+
window.removeEventListener('load', onLoad_1, true);
|
|
429
|
+
};
|
|
430
|
+
window.addEventListener('load', onLoad_1, true);
|
|
431
|
+
}
|
|
432
|
+
return function () {
|
|
433
|
+
if (observer)
|
|
434
|
+
observer.disconnect();
|
|
435
|
+
};
|
|
436
|
+
}
|
|
437
|
+
|
|
438
|
+
function startRequest(reportUrl) {
|
|
439
|
+
var entryHandler = function (list) {
|
|
440
|
+
var data = list.getEntries();
|
|
441
|
+
for (var _i = 0, data_1 = data; _i < data_1.length; _i++) {
|
|
442
|
+
var entry = data_1[_i];
|
|
443
|
+
// 防止死循环:过滤掉上报接口自身的请求
|
|
444
|
+
if (entry.name === reportUrl || entry.name.includes(reportUrl)) {
|
|
445
|
+
continue;
|
|
446
|
+
}
|
|
447
|
+
// 过滤出 API 请求 (Fetch 和 XHR)
|
|
448
|
+
if (entry.initiatorType === 'fetch' ||
|
|
449
|
+
entry.initiatorType === 'xmlhttprequest') {
|
|
450
|
+
var reportData = {
|
|
451
|
+
name: entry.name, // 请求地址
|
|
452
|
+
type: 'performance',
|
|
453
|
+
subType: entry.entryType,
|
|
454
|
+
sourceType: entry.initiatorType,
|
|
455
|
+
duration: entry.duration, // 请求总耗时
|
|
456
|
+
dns: entry.domainLookupEnd - entry.domainLookupStart, // DNS 解析耗时
|
|
457
|
+
tcp: entry.connectEnd - entry.connectStart, // TCP 连接耗时
|
|
458
|
+
ttfb: entry.responseStart - entry.requestStart, // 首字节响应时间 (服务端处理时间)
|
|
459
|
+
transferSize: entry.transferSize, // 传输字节数
|
|
460
|
+
startTime: entry.startTime, // 请求开始时间
|
|
461
|
+
pageUrl: window.location.href,
|
|
462
|
+
};
|
|
463
|
+
sendBehaviorData(reportData, reportUrl);
|
|
464
|
+
}
|
|
465
|
+
}
|
|
466
|
+
};
|
|
467
|
+
// 这里不调用 disconnect(),以便持续监听后续产生的网络请求
|
|
468
|
+
var observer = new PerformanceObserver(entryHandler);
|
|
469
|
+
observer.observe({ type: 'resource', buffered: true });
|
|
470
|
+
return function () { return observer.disconnect(); };
|
|
471
|
+
}
|
|
472
|
+
|
|
473
|
+
var PerformanceMonitor = /** @class */ (function () {
|
|
474
|
+
function PerformanceMonitor(options) {
|
|
475
|
+
if (options === void 0) { options = {}; }
|
|
476
|
+
this.options = __assign({ log: true, reportUrl: '/api/performance' }, options);
|
|
477
|
+
}
|
|
478
|
+
PerformanceMonitor.prototype.init = function () {
|
|
479
|
+
var reportUrl = this.options.reportUrl;
|
|
480
|
+
// 1. 页面加载与渲染 (Loading & Rendering)
|
|
481
|
+
startFP(reportUrl);
|
|
482
|
+
startFCP(reportUrl);
|
|
483
|
+
startLCP(reportUrl);
|
|
484
|
+
startLoad(reportUrl); // Load / Pageshow
|
|
485
|
+
// 2. 交互响应 (Interaction)
|
|
486
|
+
startFID(reportUrl);
|
|
487
|
+
startINP(reportUrl); // INP
|
|
488
|
+
startLongTask(reportUrl); // JS Long Task
|
|
489
|
+
// 3. 视觉稳定性 (Visual Stability)
|
|
490
|
+
startCLS(this.options); // startCLS already takes options, we'll ensure it uses reportUrl
|
|
491
|
+
// 4. 资源与网络 (Resource & Network)
|
|
492
|
+
startEntries(reportUrl);
|
|
493
|
+
startRequest(reportUrl);
|
|
494
|
+
console.log('Performance Monitor Initialized');
|
|
495
|
+
};
|
|
496
|
+
return PerformanceMonitor;
|
|
497
|
+
}());
|
|
498
|
+
|
|
499
|
+
export { PerformanceMonitor as default };
|
|
500
|
+
//# sourceMappingURL=index.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.esm.js","sources":["../node_modules/.pnpm/@rollup+plugin-typescript@1_c1983916b8e911ede0136b2ece445679/node_modules/tslib/tslib.es6.js","../src/report/index.ts","../src/loading/FP.ts","../src/loading/FCP.ts","../src/util/index.ts","../src/loading/LCP.ts","../src/loading/load.ts","../src/interaction/FID.ts","../src/interaction/INP.ts","../src/interaction/longtask.ts","../src/visualStability/CLS.ts","../src/network/entries.ts","../src/network/request.ts","../src/index.ts"],"sourcesContent":["/******************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise, SuppressedError, Symbol, Iterator */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {\r\n function accept(f) { if (f !== void 0 && typeof f !== \"function\") throw new TypeError(\"Function expected\"); return f; }\r\n var kind = contextIn.kind, key = kind === \"getter\" ? \"get\" : kind === \"setter\" ? \"set\" : \"value\";\r\n var target = !descriptorIn && ctor ? contextIn[\"static\"] ? ctor : ctor.prototype : null;\r\n var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});\r\n var _, done = false;\r\n for (var i = decorators.length - 1; i >= 0; i--) {\r\n var context = {};\r\n for (var p in contextIn) context[p] = p === \"access\" ? {} : contextIn[p];\r\n for (var p in contextIn.access) context.access[p] = contextIn.access[p];\r\n context.addInitializer = function (f) { if (done) throw new TypeError(\"Cannot add initializers after decoration has completed\"); extraInitializers.push(accept(f || null)); };\r\n var result = (0, decorators[i])(kind === \"accessor\" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);\r\n if (kind === \"accessor\") {\r\n if (result === void 0) continue;\r\n if (result === null || typeof result !== \"object\") throw new TypeError(\"Object expected\");\r\n if (_ = accept(result.get)) descriptor.get = _;\r\n if (_ = accept(result.set)) descriptor.set = _;\r\n if (_ = accept(result.init)) initializers.unshift(_);\r\n }\r\n else if (_ = accept(result)) {\r\n if (kind === \"field\") initializers.unshift(_);\r\n else descriptor[key] = _;\r\n }\r\n }\r\n if (target) Object.defineProperty(target, contextIn.name, descriptor);\r\n done = true;\r\n};\r\n\r\nexport function __runInitializers(thisArg, initializers, value) {\r\n var useValue = arguments.length > 2;\r\n for (var i = 0; i < initializers.length; i++) {\r\n value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);\r\n }\r\n return useValue ? value : void 0;\r\n};\r\n\r\nexport function __propKey(x) {\r\n return typeof x === \"symbol\" ? x : \"\".concat(x);\r\n};\r\n\r\nexport function __setFunctionName(f, name, prefix) {\r\n if (typeof name === \"symbol\") name = name.description ? \"[\".concat(name.description, \"]\") : \"\";\r\n return Object.defineProperty(f, \"name\", { configurable: true, value: prefix ? \"\".concat(prefix, \" \", name) : name });\r\n};\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === \"function\" ? Iterator : Object).prototype);\r\n return g.next = verb(0), g[\"throw\"] = verb(1), g[\"return\"] = verb(2), typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (g && (g = 0, op[0] && (_ = 0)), _) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n var desc = Object.getOwnPropertyDescriptor(m, k);\r\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\r\n desc = { enumerable: true, get: function() { return m[k]; } };\r\n }\r\n Object.defineProperty(o, k2, desc);\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\r\n\r\nexport function __spreadArray(to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || Array.prototype.slice.call(from));\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = Object.create((typeof AsyncIterator === \"function\" ? AsyncIterator : Object).prototype), verb(\"next\"), verb(\"throw\"), verb(\"return\", awaitReturn), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function awaitReturn(f) { return function (v) { return Promise.resolve(v).then(f, reject); }; }\r\n function verb(n, f) { if (g[n]) { i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; if (f) i[n] = f(i[n]); } }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nvar ownKeys = function(o) {\r\n ownKeys = Object.getOwnPropertyNames || function (o) {\r\n var ar = [];\r\n for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;\r\n return ar;\r\n };\r\n return ownKeys(o);\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== \"default\") __createBinding(result, mod, k[i]);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n\r\nexport function __classPrivateFieldIn(state, receiver) {\r\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\r\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\r\n}\r\n\r\nexport function __addDisposableResource(env, value, async) {\r\n if (value !== null && value !== void 0) {\r\n if (typeof value !== \"object\" && typeof value !== \"function\") throw new TypeError(\"Object expected.\");\r\n var dispose, inner;\r\n if (async) {\r\n if (!Symbol.asyncDispose) throw new TypeError(\"Symbol.asyncDispose is not defined.\");\r\n dispose = value[Symbol.asyncDispose];\r\n }\r\n if (dispose === void 0) {\r\n if (!Symbol.dispose) throw new TypeError(\"Symbol.dispose is not defined.\");\r\n dispose = value[Symbol.dispose];\r\n if (async) inner = dispose;\r\n }\r\n if (typeof dispose !== \"function\") throw new TypeError(\"Object not disposable.\");\r\n if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };\r\n env.stack.push({ value: value, dispose: dispose, async: async });\r\n }\r\n else if (async) {\r\n env.stack.push({ async: true });\r\n }\r\n return value;\r\n\r\n}\r\n\r\nvar _SuppressedError = typeof SuppressedError === \"function\" ? SuppressedError : function (error, suppressed, message) {\r\n var e = new Error(message);\r\n return e.name = \"SuppressedError\", e.error = error, e.suppressed = suppressed, e;\r\n};\r\n\r\nexport function __disposeResources(env) {\r\n function fail(e) {\r\n env.error = env.hasError ? new _SuppressedError(e, env.error, \"An error was suppressed during disposal.\") : e;\r\n env.hasError = true;\r\n }\r\n var r, s = 0;\r\n function next() {\r\n while (r = env.stack.pop()) {\r\n try {\r\n if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);\r\n if (r.dispose) {\r\n var result = r.dispose.call(r.value);\r\n if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });\r\n }\r\n else s |= 1;\r\n }\r\n catch (e) {\r\n fail(e);\r\n }\r\n }\r\n if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();\r\n if (env.hasError) throw env.error;\r\n }\r\n return next();\r\n}\r\n\r\nexport function __rewriteRelativeImportExtension(path, preserveJsx) {\r\n if (typeof path === \"string\" && /^\\.\\.?\\//.test(path)) {\r\n return path.replace(/\\.(tsx)$|((?:\\.d)?)((?:\\.[^./]+?)?)\\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {\r\n return tsx ? preserveJsx ? \".jsx\" : \".js\" : d && (!ext || !cm) ? m : (d + ext + \".\" + cm.toLowerCase() + \"js\");\r\n });\r\n }\r\n return path;\r\n}\r\n\r\nexport default {\r\n __extends: __extends,\r\n __assign: __assign,\r\n __rest: __rest,\r\n __decorate: __decorate,\r\n __param: __param,\r\n __esDecorate: __esDecorate,\r\n __runInitializers: __runInitializers,\r\n __propKey: __propKey,\r\n __setFunctionName: __setFunctionName,\r\n __metadata: __metadata,\r\n __awaiter: __awaiter,\r\n __generator: __generator,\r\n __createBinding: __createBinding,\r\n __exportStar: __exportStar,\r\n __values: __values,\r\n __read: __read,\r\n __spread: __spread,\r\n __spreadArrays: __spreadArrays,\r\n __spreadArray: __spreadArray,\r\n __await: __await,\r\n __asyncGenerator: __asyncGenerator,\r\n __asyncDelegator: __asyncDelegator,\r\n __asyncValues: __asyncValues,\r\n __makeTemplateObject: __makeTemplateObject,\r\n __importStar: __importStar,\r\n __importDefault: __importDefault,\r\n __classPrivateFieldGet: __classPrivateFieldGet,\r\n __classPrivateFieldSet: __classPrivateFieldSet,\r\n __classPrivateFieldIn: __classPrivateFieldIn,\r\n __addDisposableResource: __addDisposableResource,\r\n __disposeResources: __disposeResources,\r\n __rewriteRelativeImportExtension: __rewriteRelativeImportExtension,\r\n};\r\n","/**\r\n * 发送用户行为数据\r\n * @param data - 用户行为数据\r\n * @param url - 数据上报的URL\r\n */\r\nexport const sendBehaviorData = (data: Record<string, any>, url: string) => {\r\n // 1. 包装数据:加上一些公共信息(比如 UserAgent)\r\n const dataToSend = {\r\n ...data,\r\n userAgent: navigator.userAgent,\r\n timestamp: Date.now(),\r\n };\r\n\r\n // 2. 优先使用 sendBeacon (最稳,且不阻塞)\r\n if (navigator.sendBeacon) {\r\n const blob = new Blob([JSON.stringify(dataToSend)], {\r\n type: 'application/json',\r\n });\r\n navigator.sendBeacon(url, blob);\r\n } else {\r\n // 3. 降级方案:使用 fetch + keepalive\r\n fetch(url, {\r\n method: 'POST',\r\n headers: { 'Content-Type': 'application/json' },\r\n body: JSON.stringify(dataToSend),\r\n keepalive: true,\r\n }).catch((error) => console.error('Error sending behavior data:', error));\r\n }\r\n};\r\n\r\n","\r\nimport { sendBehaviorData } from '../report';\r\n\r\nexport function startFP(reportUrl: string) {\r\n const entryHandler = (list: any) => {\r\n for (const entry of list.getEntries()) {\r\n if (entry.entryType === 'paint' && entry.name === 'first-paint') {\r\n observer.disconnect();\r\n const json = entry.toJSON();\r\n const reportData = {\r\n ...json,\r\n type: 'performance',\r\n name: entry.name,\r\n pageUrl: window.location.href,\r\n };\r\n sendBehaviorData(reportData, reportUrl);\r\n }\r\n }\r\n };\r\n\r\n const observer = new PerformanceObserver(entryHandler);\r\n observer.observe({ type: 'paint', buffered: true });\r\n return () => observer.disconnect();\r\n}\r\n","\r\nimport { sendBehaviorData } from '../report';\r\n\r\nexport function startFCP(reportUrl: string) {\r\n const entryHandler = (list: any) => {\r\n for (const entry of list.getEntries()) {\r\n if (\r\n entry.entryType === 'paint' &&\r\n entry.name === 'first-contentful-paint'\r\n ) {\r\n observer.disconnect();\r\n const json = entry.toJSON();\r\n const reportData = {\r\n ...json,\r\n type: 'performance',\r\n name: entry.name,\r\n pageUrl: window.location.href,\r\n };\r\n sendBehaviorData(reportData, reportUrl);\r\n }\r\n }\r\n };\r\n\r\n const observer = new PerformanceObserver(entryHandler);\r\n observer.observe({ type: 'paint', buffered: true });\r\n return () => observer.disconnect();\r\n}\r\n","\r\nexport const getSelector = (element: any) => {\r\n if (!element) return '';\r\n try {\r\n let selector = element.tagName.toLowerCase();\r\n if (element.id) {\r\n selector += `#${element.id}`;\r\n }\r\n const classAttr = element.getAttribute('class');\r\n if (classAttr) {\r\n const classes = classAttr.trim().split(/\\s+/);\r\n if (classes.length > 0) {\r\n selector += `.${classes.join('.')}`;\r\n }\r\n }\r\n return selector;\r\n } catch (e) {\r\n return '';\r\n }\r\n};\r\n\r\n/** \r\n * @param { Function } cb 回调函数\r\n */\r\nexport const onUrlChange = (cb: () => void) => {\r\n // 1. 监听浏览器前进/后退\r\n window.addEventListener('popstate', cb);\r\n\r\n // 2. 劫持 pushState (Vue/React 路由跳转常用)\r\n const originalPush = history.pushState;\r\n history.pushState = function (...args) {\r\n const result = originalPush.apply(this, args);\r\n cb();\r\n return result;\r\n };\r\n\r\n // 3. 劫持 replaceState\r\n const originalReplace = history.replaceState;\r\n history.replaceState = function (...args) {\r\n const result = originalReplace.apply(this, args);\r\n cb();\r\n return result;\r\n };\r\n};\r\n","\r\n\r\nimport { getSelector } from '../util/index';\r\nimport { sendBehaviorData } from '../report';\r\n\r\nexport function startLCP(reportUrl: string) {\r\n let lcpEntry: any;\r\n let hasReported = false;\r\n\r\n const entryHandler = (list: any) => {\r\n for (const entry of list.getEntries()) {\r\n // 浏览器会不断更新 LCP,我们只需要记录最新的\r\n lcpEntry = entry;\r\n }\r\n };\r\n\r\n const observer = new PerformanceObserver(entryHandler);\r\n observer.observe({ type: 'largest-contentful-paint', buffered: true });\r\n\r\n const report = () => {\r\n if (hasReported || !lcpEntry) return;\r\n\r\n hasReported = true;\r\n const json = lcpEntry.toJSON();\r\n const reportData = {\r\n ...json,\r\n lcpTime: lcpEntry.startTime,\r\n elementSelector: getSelector(lcpEntry.element),\r\n type: 'performance',\r\n name: lcpEntry.name,\r\n pageUrl: window.location.href,\r\n };\r\n sendBehaviorData(reportData, reportUrl);\r\n\r\n // 上报后即可断开\r\n disconnect();\r\n };\r\n\r\n // 停止监听并清理\r\n const disconnect = () => {\r\n if (observer) observer.disconnect();\r\n ['click', 'keydown', 'pointerdown'].forEach((type) => {\r\n window.removeEventListener(type, report, true);\r\n });\r\n document.removeEventListener('visibilitychange', onVisibilityChange);\r\n };\r\n\r\n // 1. 页面隐藏时上报\r\n const onVisibilityChange = () => {\r\n if (document.visibilityState === 'hidden') {\r\n report();\r\n }\r\n };\r\n\r\n // 2. 用户交互时上报(因为交互后 LCP 就不再产生/不再准确)\r\n ['click', 'keydown', 'pointerdown'].forEach((type) => {\r\n window.addEventListener(type, report, { once: true, capture: true });\r\n });\r\n document.addEventListener('visibilitychange', onVisibilityChange);\r\n\r\n return disconnect;\r\n}\r\n","import { sendBehaviorData } from '../report';\r\n\r\nexport function startLoad(reportUrl: string) {\r\n const onPageShow = (event: any) => {\r\n requestAnimationFrame(() => {\r\n ['load'].forEach((type) => {\r\n const reportData = {\r\n type: 'performance',\r\n subType: type,\r\n pageUrl: window.location.href,\r\n startTime: event.timeStamp,\r\n delay: performance.now() - event.timeStamp,\r\n };\r\n sendBehaviorData(reportData, reportUrl);\r\n });\r\n });\r\n };\r\n\r\n window.addEventListener('pageshow', onPageShow, true);\r\n\r\n return () => {\r\n window.removeEventListener('pageshow', onPageShow, true);\r\n };\r\n}\r\n","\r\nimport { getSelector } from '../util/index';\r\nimport { sendBehaviorData } from '../report';\r\n\r\nexport function startFID(reportUrl: string) {\r\n const entryHandler = (list: any) => {\r\n for (const entry of list.getEntries()) {\r\n observer.disconnect();\r\n const json = entry.toJSON();\r\n const inputDelay = entry.processingStart - entry.startTime;\r\n const reportData = {\r\n ...json,\r\n name: entry.name,\r\n inputDelay,\r\n duration: entry.duration,\r\n startTime: entry.startTime,\r\n type: 'performance',\r\n subType: 'first-input',\r\n pageUrl: window.location.href,\r\n elementSelector: getSelector(entry.target),\r\n };\r\n sendBehaviorData(reportData, reportUrl);\r\n }\r\n };\r\n\r\n const observer = new PerformanceObserver(entryHandler);\r\n observer.observe({ type: 'first-input', buffered: true });\r\n return () => observer.disconnect();\r\n}\r\n","import { sendBehaviorData } from '../report';\r\n\r\nexport function startINP(reportUrl: string) {\r\n const supported =\r\n typeof PerformanceObserver !== 'undefined' &&\r\n PerformanceObserver.supportedEntryTypes &&\r\n PerformanceObserver.supportedEntryTypes.indexOf('event') >= 0;\r\n\r\n if (!supported) return () => {};\r\n\r\n const entryHandler = (list: any) => {\r\n for (const entry of list.getEntries()) {\r\n // 过滤掉 duration 很短的交互,减少日志量,只关注慢交互(例如 > 40ms)\r\n // 或者根据需求记录所有交互\r\n if (entry.interactionId) {\r\n // interactionId 存在意味着这是一个有意义的用户交互\r\n const reportData = {\r\n type: 'performance',\r\n subType: 'interaction',\r\n name: entry.name, // e.g., 'click', 'keydown'\r\n duration: entry.duration, // 总耗时\r\n startTime: entry.startTime,\r\n processingStart: entry.processingStart,\r\n processingEnd: entry.processingEnd,\r\n inputDelay: entry.processingStart - entry.startTime, // 输入延迟\r\n processingTime: entry.processingEnd - entry.processingStart, // 事件回调执行时间\r\n presentationDelay:\r\n entry.duration - (entry.processingEnd - entry.startTime), // 渲染延迟\r\n interactionId: entry.interactionId,\r\n pageUrl: window.location.href,\r\n };\r\n sendBehaviorData(reportData, reportUrl);\r\n }\r\n }\r\n };\r\n\r\n const observer = new PerformanceObserver(entryHandler);\r\n // durationThreshold: 16 (默认 104ms),设置为 16ms 可以捕获更多交互细节,或者设置为 40ms 关注卡顿\r\n observer.observe({\r\n type: 'event',\r\n durationThreshold: 40,\r\n buffered: true,\r\n } as any);\r\n return () => observer.disconnect();\r\n}","import { sendBehaviorData } from '../report';\r\n\r\nexport function startLongTask(reportUrl: string) {\r\n const types = PerformanceObserver.supportedEntryTypes || [];\r\n \r\n // 仅使用 LongTask,简单直接\r\n if (types.indexOf('longtask') < 0) return () => {};\r\n\r\n const observer = new PerformanceObserver((list) => {\r\n for (const entry of list.getEntries()) {\r\n // @ts-ignore\r\n const attribution = entry.attribution?.map((a: any) => ({\r\n 来源: a.name,\r\n 类型: a.containerType\r\n })) || [];\r\n\r\n const reportData = {\r\n type: 'performance',\r\n subType: 'longtask',\r\n name: 'LongTask',\r\n duration: entry.duration,\r\n attribution: attribution,\r\n startTime: entry.startTime,\r\n pageUrl: window.location.href,\r\n };\r\n\r\n sendBehaviorData(reportData, reportUrl);\r\n }\r\n });\r\n\r\n observer.observe({ type: 'longtask', buffered: true });\r\n return () => observer.disconnect();\r\n}","\r\nimport { onUrlChange, getSelector } from '../util';\r\nimport { sendBehaviorData } from '../report';\r\n\r\nexport function startCLS(options: any = {}) {\r\n const reportUrl = options.reportUrl;\r\n let clsValue = 0;\r\n let clsEntries: any[] = [];\r\n\r\n const entryHandler = (list: any) => {\r\n for (const entry of list.getEntries()) {\r\n if (entry.hadRecentInput) continue;\r\n\r\n // 简单累加 (演示用,生产环境建议用 Session Window)\r\n clsValue += entry.value;\r\n\r\n // 记录导致偏移的元素\r\n if (entry.sources) {\r\n entry.sources.forEach((source: any) => {\r\n if (source.node) {\r\n const clsEntry = {\r\n selector: getSelector(source.node),\r\n value: entry.value,\r\n // 可以添加更多 debug 信息,如 previousRect, currentRect\r\n };\r\n clsEntries.push(clsEntry);\r\n \r\n if (options.log) {\r\n console.log('[CLS] Layout Shift Detected:', clsEntry);\r\n }\r\n }\r\n });\r\n }\r\n }\r\n };\r\n\r\n const observer = new PerformanceObserver(entryHandler);\r\n observer.observe({ type: 'layout-shift', buffered: true });\r\n\r\n const report = (isFinal = false) => {\r\n const data = {\r\n clsValue,\r\n clsEntries: [...clsEntries], // 包含详细的偏移来源\r\n type: 'performance',\r\n subType: 'layout-shift',\r\n isFinal, // 标记是否为最终值\r\n pageUrl: window.location.href,\r\n };\r\n sendBehaviorData(data, reportUrl);\r\n\r\n // 上报后清零,为下一个路由做准备\r\n clsValue = 0;\r\n clsEntries = [];\r\n };\r\n\r\n const onVisibilityChange = () => {\r\n if (document.visibilityState === 'hidden') report(true);\r\n };\r\n\r\n // 1. 页面关闭/隐藏时上报\r\n document.addEventListener('visibilitychange', onVisibilityChange);\r\n window.addEventListener('pagehide', () => report(true));\r\n\r\n // 2. 核心:SPA 路由切换时上报并重置\r\n onUrlChange(() => {\r\n // 稍微延迟一点,确保当前页面的最后一次偏移被记录\r\n requestAnimationFrame(() => {\r\n report(true);\r\n });\r\n });\r\n\r\n return () => {\r\n observer.disconnect();\r\n document.removeEventListener('visibilitychange', onVisibilityChange);\r\n };\r\n}\r\n","\r\nimport { sendBehaviorData } from '../report';\r\n\r\nexport function startEntries(reportUrl: string) {\r\n let observer: any;\r\n\r\n const observeEvent = () => {\r\n const entryHandler = (list: any) => {\r\n const data = list.getEntries();\r\n for (const entry of data) {\r\n // 1. 过滤掉 API 请求 (由 startRequest 处理)\r\n if (\r\n entry.initiatorType === 'fetch' ||\r\n entry.initiatorType === 'xmlhttprequest'\r\n ) {\r\n continue;\r\n }\r\n\r\n // 2. 防止死循环:过滤掉上报接口自身的请求\r\n if (entry.name === reportUrl || entry.name.includes(reportUrl)) {\r\n continue;\r\n }\r\n\r\n // 3. 过滤掉 Beacon 请求\r\n if (entry.initiatorType === 'beacon') {\r\n continue;\r\n }\r\n\r\n const reportData = {\r\n name: entry.name, // 资源的名字\r\n type: 'performance', // 类型\r\n subType: entry.entryType, // 类型\r\n sourceType: entry.initiatorType, // 资源类型\r\n duration: entry.duration, // 加载时间\r\n dns: entry.domainLookupEnd - entry.domainLookupStart, // dns解析时间\r\n tcp: entry.connectEnd - entry.connectStart, // tcp连接时间\r\n redirect: entry.redirectEnd - entry.redirectStart, // 重定向时间\r\n ttfb: entry.responseStart, // 首字节时间\r\n protocol: entry.nextHopProtocol, // 请求协议\r\n responseBodySize: entry.encodedBodySize, // 响应内容大小\r\n responseHeaderSize: entry.transferSize - entry.encodedBodySize, // 响应头大小\r\n transferSize: entry.transferSize, // 请求内容大小\r\n resourceSize: entry.decodedBodySize, // 资源解压后的大小\r\n startTime: performance.now(),\r\n };\r\n //说下resourceSize、encodedBodySize、responseBodySize的区别\r\n sendBehaviorData(reportData, reportUrl);\r\n }\r\n };\r\n\r\n observer = new PerformanceObserver(entryHandler);\r\n observer.observe({ type: 'resource', buffered: true });\r\n };\r\n\r\n if (document.readyState === 'complete') {\r\n observeEvent();\r\n } else {\r\n const onLoad = () => {\r\n observeEvent();\r\n window.removeEventListener('load', onLoad, true);\r\n };\r\n window.addEventListener('load', onLoad, true);\r\n }\r\n\r\n return () => {\r\n if (observer) observer.disconnect();\r\n };\r\n}\r\n","\r\nimport { sendBehaviorData } from '../report';\r\n\r\nexport function startRequest(reportUrl: string) {\r\n const entryHandler = (list: any) => {\r\n const data = list.getEntries();\r\n for (const entry of data) {\r\n // 防止死循环:过滤掉上报接口自身的请求\r\n if (entry.name === reportUrl || entry.name.includes(reportUrl)) {\r\n continue;\r\n }\r\n\r\n // 过滤出 API 请求 (Fetch 和 XHR)\r\n if (\r\n entry.initiatorType === 'fetch' ||\r\n entry.initiatorType === 'xmlhttprequest'\r\n ) {\r\n const reportData = {\r\n name: entry.name, // 请求地址\r\n type: 'performance',\r\n subType: entry.entryType,\r\n sourceType: entry.initiatorType,\r\n duration: entry.duration, // 请求总耗时\r\n dns: entry.domainLookupEnd - entry.domainLookupStart, // DNS 解析耗时\r\n tcp: entry.connectEnd - entry.connectStart, // TCP 连接耗时\r\n ttfb: entry.responseStart - entry.requestStart, // 首字节响应时间 (服务端处理时间)\r\n transferSize: entry.transferSize, // 传输字节数\r\n startTime: entry.startTime, // 请求开始时间\r\n pageUrl: window.location.href,\r\n };\r\n sendBehaviorData(reportData, reportUrl);\r\n }\r\n }\r\n };\r\n\r\n // 这里不调用 disconnect(),以便持续监听后续产生的网络请求\r\n const observer = new PerformanceObserver(entryHandler);\r\n observer.observe({ type: 'resource', buffered: true });\r\n return () => observer.disconnect();\r\n}\r\n","\r\nimport { startFP, startFCP, startLCP, startLoad } from './loading';\r\nimport { startFID, startINP, startLongTask } from './interaction';\r\nimport { startCLS } from './visualStability';\r\nimport { startEntries, startRequest } from './network';\r\n\r\nexport default class PerformanceMonitor {\r\n options;\r\n constructor(options: any = {}) {\r\n this.options = {\r\n log: true, // 开发模式下开启日志\r\n reportUrl: '/api/performance', // 默认上报地址\r\n ...options,\r\n };\r\n }\r\n\r\n init() {\r\n const { reportUrl } = this.options;\r\n // 1. 页面加载与渲染 (Loading & Rendering)\r\n startFP(reportUrl);\r\n startFCP(reportUrl);\r\n startLCP(reportUrl);\r\n startLoad(reportUrl); // Load / Pageshow\r\n\r\n // 2. 交互响应 (Interaction)\r\n startFID(reportUrl);\r\n startINP(reportUrl); // INP\r\n startLongTask(reportUrl); // JS Long Task\r\n\r\n // 3. 视觉稳定性 (Visual Stability)\r\n startCLS(this.options); // startCLS already takes options, we'll ensure it uses reportUrl\r\n\r\n // 4. 资源与网络 (Resource & Network)\r\n startEntries(reportUrl);\r\n startRequest(reportUrl);\r\n\r\n console.log('Performance Monitor Initialized');\r\n }\r\n}\r\n"],"names":[],"mappings":"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","x_google_ignoreList":[0]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
!function(e,n){"object"==typeof exports&&"undefined"!=typeof module?module.exports=n():"function"==typeof define&&define.amd?define(n):(e="undefined"!=typeof globalThis?globalThis:e||self).PerformanceSDK=n()}(this,function(){"use strict";var e=function(){return e=Object.assign||function(e){for(var n,t=1,r=arguments.length;t<r;t++)for(var o in n=arguments[t])Object.prototype.hasOwnProperty.call(n,o)&&(e[o]=n[o]);return e},e.apply(this,arguments)};function n(e,n,t){if(t||2===arguments.length)for(var r,o=0,i=n.length;o<i;o++)!r&&o in n||(r||(r=Array.prototype.slice.call(n,0,o)),r[o]=n[o]);return e.concat(r||Array.prototype.slice.call(n))}"function"==typeof SuppressedError&&SuppressedError;var t=function(n,t){var r=e(e({},n),{userAgent:navigator.userAgent,timestamp:Date.now()});if(navigator.sendBeacon){var o=new Blob([JSON.stringify(r)],{type:"application/json"});navigator.sendBeacon(t,o)}else fetch(t,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(r),keepalive:!0}).catch(function(e){return console.error("Error sending behavior data:",e)})};var r=function(e){if(!e)return"";try{var n=e.tagName.toLowerCase();e.id&&(n+="#".concat(e.id));var t=e.getAttribute("class");if(t){var r=t.trim().split(/\s+/);r.length>0&&(n+=".".concat(r.join(".")))}return n}catch(e){return""}};function o(e){void 0===e&&(e={});var o=e.reportUrl,i=0,a=[],c=new PerformanceObserver(function(n){for(var t=function(n){if(n.hadRecentInput)return"continue";i+=n.value,n.sources&&n.sources.forEach(function(t){if(t.node){var o={selector:r(t.node),value:n.value};a.push(o),e.log&&console.log("[CLS] Layout Shift Detected:",o)}})},o=0,c=n.getEntries();o<c.length;o++){t(c[o])}});c.observe({type:"layout-shift",buffered:!0});var s=function(e){var r={clsValue:i,clsEntries:n([],a,!0),type:"performance",subType:"layout-shift",isFinal:e,pageUrl:window.location.href};t(r,o),i=0,a=[]},f=function(){"hidden"===document.visibilityState&&s(!0)};return document.addEventListener("visibilitychange",f),window.addEventListener("pagehide",function(){return s(!0)}),function(e){window.addEventListener("popstate",e);var n=history.pushState;history.pushState=function(){for(var t=[],r=0;r<arguments.length;r++)t[r]=arguments[r];var o=n.apply(this,t);return e(),o};var t=history.replaceState;history.replaceState=function(){for(var n=[],r=0;r<arguments.length;r++)n[r]=arguments[r];var o=t.apply(this,n);return e(),o}}(function(){requestAnimationFrame(function(){s(!0)})}),function(){c.disconnect(),document.removeEventListener("visibilitychange",f)}}return function(){function n(n){void 0===n&&(n={}),this.options=e({log:!0,reportUrl:"/api/performance"},n)}return n.prototype.init=function(){var n=this.options.reportUrl;!function(n){var r=new PerformanceObserver(function(o){for(var i=0,a=o.getEntries();i<a.length;i++){var c=a[i];if("paint"===c.entryType&&"first-paint"===c.name){r.disconnect();var s=c.toJSON(),f=e(e({},s),{type:"performance",name:c.name,pageUrl:window.location.href});t(f,n)}}});r.observe({type:"paint",buffered:!0})}(n),function(n){var r=new PerformanceObserver(function(o){for(var i=0,a=o.getEntries();i<a.length;i++){var c=a[i];if("paint"===c.entryType&&"first-contentful-paint"===c.name){r.disconnect();var s=c.toJSON(),f=e(e({},s),{type:"performance",name:c.name,pageUrl:window.location.href});t(f,n)}}});r.observe({type:"paint",buffered:!0})}(n),function(n){var o,i=!1,a=new PerformanceObserver(function(e){for(var n=0,t=e.getEntries();n<t.length;n++){var r=t[n];o=r}});a.observe({type:"largest-contentful-paint",buffered:!0});var c=function(){if(!i&&o){i=!0;var a=o.toJSON(),c=e(e({},a),{lcpTime:o.startTime,elementSelector:r(o.element),type:"performance",name:o.name,pageUrl:window.location.href});t(c,n),s()}},s=function(){a&&a.disconnect(),["click","keydown","pointerdown"].forEach(function(e){window.removeEventListener(e,c,!0)}),document.removeEventListener("visibilitychange",f)},f=function(){"hidden"===document.visibilityState&&c()};["click","keydown","pointerdown"].forEach(function(e){window.addEventListener(e,c,{once:!0,capture:!0})}),document.addEventListener("visibilitychange",f)}(n),function(e){var n=function(n){requestAnimationFrame(function(){["load"].forEach(function(r){var o={type:"performance",subType:r,pageUrl:window.location.href,startTime:n.timeStamp,delay:performance.now()-n.timeStamp};t(o,e)})})};window.addEventListener("pageshow",n,!0)}(n),function(n){var o=new PerformanceObserver(function(i){for(var a=0,c=i.getEntries();a<c.length;a++){var s=c[a];o.disconnect();var f=s.toJSON(),p=s.processingStart-s.startTime,u=e(e({},f),{name:s.name,inputDelay:p,duration:s.duration,startTime:s.startTime,type:"performance",subType:"first-input",pageUrl:window.location.href,elementSelector:r(s.target)});t(u,n)}});o.observe({type:"first-input",buffered:!0})}(n),function(e){if(!("undefined"!=typeof PerformanceObserver&&PerformanceObserver.supportedEntryTypes&&PerformanceObserver.supportedEntryTypes.indexOf("event")>=0))return function(){};var n=new PerformanceObserver(function(n){for(var r=0,o=n.getEntries();r<o.length;r++){var i=o[r];if(i.interactionId){var a={type:"performance",subType:"interaction",name:i.name,duration:i.duration,startTime:i.startTime,processingStart:i.processingStart,processingEnd:i.processingEnd,inputDelay:i.processingStart-i.startTime,processingTime:i.processingEnd-i.processingStart,presentationDelay:i.duration-(i.processingEnd-i.startTime),interactionId:i.interactionId,pageUrl:window.location.href};t(a,e)}}});n.observe({type:"event",durationThreshold:40,buffered:!0})}(n),function(e){if((PerformanceObserver.supportedEntryTypes||[]).indexOf("longtask")<0)return function(){};var n=new PerformanceObserver(function(n){for(var r,o=0,i=n.getEntries();o<i.length;o++){var a=i[o],c=(null===(r=a.attribution)||void 0===r?void 0:r.map(function(e){return{"来源":e.name,"类型":e.containerType}}))||[],s={type:"performance",subType:"longtask",name:"LongTask",duration:a.duration,attribution:c,startTime:a.startTime,pageUrl:window.location.href};t(s,e)}});n.observe({type:"longtask",buffered:!0})}(n),o(this.options),function(e){var n,r=function(){(n=new PerformanceObserver(function(n){for(var r=0,o=n.getEntries();r<o.length;r++){var i=o[r];if("fetch"!==i.initiatorType&&"xmlhttprequest"!==i.initiatorType&&i.name!==e&&!i.name.includes(e)&&"beacon"!==i.initiatorType){var a={name:i.name,type:"performance",subType:i.entryType,sourceType:i.initiatorType,duration:i.duration,dns:i.domainLookupEnd-i.domainLookupStart,tcp:i.connectEnd-i.connectStart,redirect:i.redirectEnd-i.redirectStart,ttfb:i.responseStart,protocol:i.nextHopProtocol,responseBodySize:i.encodedBodySize,responseHeaderSize:i.transferSize-i.encodedBodySize,transferSize:i.transferSize,resourceSize:i.decodedBodySize,startTime:performance.now()};t(a,e)}}})).observe({type:"resource",buffered:!0})};if("complete"===document.readyState)r();else{var o=function(){r(),window.removeEventListener("load",o,!0)};window.addEventListener("load",o,!0)}}(n),function(e){var n=new PerformanceObserver(function(n){for(var r=0,o=n.getEntries();r<o.length;r++){var i=o[r];if(i.name!==e&&!i.name.includes(e)&&("fetch"===i.initiatorType||"xmlhttprequest"===i.initiatorType)){var a={name:i.name,type:"performance",subType:i.entryType,sourceType:i.initiatorType,duration:i.duration,dns:i.domainLookupEnd-i.domainLookupStart,tcp:i.connectEnd-i.connectStart,ttfb:i.responseStart-i.requestStart,transferSize:i.transferSize,startTime:i.startTime,pageUrl:window.location.href};t(a,e)}}});n.observe({type:"resource",buffered:!0})}(n),console.log("Performance Monitor Initialized")},n}()});
|
|
2
|
+
//# sourceMappingURL=index.umd.js.map
|