Skip to content

Commit 5c81670

Browse files
authored
Merge pull request #2 from EzStars/refactor/performance
Refactor/performance
2 parents cb54868 + fb76a44 commit 5c81670

21 files changed

Lines changed: 547 additions & 340 deletions

.gitignore

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,5 @@
22
**/dist/
33
**/node_modules/
44
**/.vitepress/cache
5-
**/.vitepress/dist
5+
**/.vitepress/dist
6+
**/.DS_Store

packages/monitor-sdk/src/cache.ts

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
import { deepClone } from './utils';
2+
3+
const cache = [];
4+
5+
export function clearCache() {
6+
cache.length = 0;
7+
}
8+
9+
export function addCache(data) {
10+
cache.push(data);
11+
}
12+
13+
export function getCache() {
14+
return deepClone(cache);
15+
}

packages/monitor-sdk/src/config.ts

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
const config = {
2+
url: 'http://127.0.0.1:8080/api',
3+
project: 'webEyesSDK',
4+
version: '0.0.1',
5+
appID: '1234567890',
6+
userID: '1234567890',
7+
isImageUpload: false,
8+
batchSize: 5,
9+
};
10+
11+
export function setConfig(options) {
12+
for (const key in config) {
13+
if (options[key] !== undefined) {
14+
config[key] = options[key];
15+
}
16+
}
17+
}
18+
19+
export default config;
Lines changed: 61 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,41 +1,68 @@
1-
//导入类型定义
2-
import { MonitorOptions, MonitorEvent } from './types';
3-
import reportData from '../report/index';
4-
import PerformanceMonitor from '../plugins/performance/index';
5-
import { dataInterface } from '../report/types';
1+
import performance from '../plugins/performance';
2+
import error from '../plugins/error';
3+
import { setConfig } from '../utils/config'; // Ensure setConfig is properly imported
64

7-
export class Monitor {
8-
private options: MonitorOptions;
9-
private performanceMonitor: PerformanceMonitor; // 持有性能监控实例
10-
private queue: MonitorEvent[] = []; // 事件队列
11-
12-
constructor(options: MonitorOptions) {
13-
this.options = {
14-
delay: 1000,
15-
...options,
5+
// Initialize the global SDK object with type safety
6+
declare global {
7+
interface Window {
8+
__EzMonitorSDK__?: {
9+
version: string;
10+
vue?: boolean;
11+
react?: boolean;
1612
};
17-
this.performanceMonitor = new PerformanceMonitor(); // 初始化性能监控
18-
this.init();
1913
}
14+
}
2015

21-
//初始化会发送数据到数据库
22-
private init(): void {
23-
console.log('初始化监听。。。');
16+
window.__EzMonitorSDK__ = window.__EzMonitorSDK__ || {
17+
version: '0.0.1',
18+
};
19+
20+
// 针对 Vue 项目的错误捕获
21+
export function install(Vue, options) {
22+
if (window.__EzMonitorSDK__?.vue) return;
23+
window.__EzMonitorSDK__!.vue = true;
24+
setConfig(options); // Ensure this function is defined and imported
25+
const handler = Vue.config.errorHandler;
26+
Vue.config.errorHandler = function (err, vm, info) {
27+
if (handler) {
28+
handler(err, vm, info);
29+
}
30+
const reportData = {
31+
type: 'error',
32+
subType: 'vue',
33+
info,
34+
startTime: window.performance.now(),
35+
pageURL: window.location.href,
36+
};
37+
console.log('vue error', reportData);
38+
};
39+
}
2440

25-
// 延迟上报(确保性能数据已收集)
26-
setTimeout(() => {
27-
// 合并性能数据和其他数据(如错误)
28-
const reportPayload: dataInterface = {
29-
performance: this.performanceMonitor.getMetrics(),
30-
event: this.queue,
31-
};
41+
// 针对 React 项目的错误捕获
42+
export function errorBoundary(err, info) {
43+
if (window.__EzMonitorSDK__?.react) return;
44+
window.__EzMonitorSDK__!.react = true;
45+
const reportData = {
46+
type: 'error',
47+
subType: 'react',
48+
info,
49+
startTime: window.performance.now(),
50+
pageURL: window.location.href,
51+
};
52+
console.log('react error', reportData);
53+
}
3254

33-
reportData({
34-
url: this.options.reportUrl,
35-
data: reportPayload, // 包含性能数据+其他数据
36-
delay: 0, // 立即发送(外层已有setTimeout)
37-
});
38-
}, this.options.delay);
39-
// 其他初始化逻辑(如错误监听)
40-
}
55+
// 初始化函数
56+
export function init(options) {
57+
setConfig(options); // Ensure configuration is set
58+
performance(); // Initialize performance monitoring
59+
error(); // Initialize error monitoring
4160
}
61+
62+
export default {
63+
install,
64+
errorBoundary,
65+
init,
66+
performance,
67+
error,
68+
};
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
export default function error() {
2+
// 捕获 JS \ CSS 资源加载错误
3+
window.addEventListener(
4+
'error',
5+
event => {
6+
const target = event.target;
7+
if (
8+
target instanceof HTMLImageElement ||
9+
target instanceof HTMLLinkElement ||
10+
target instanceof HTMLScriptElement
11+
) {
12+
const url =
13+
target instanceof HTMLImageElement ||
14+
target instanceof HTMLScriptElement
15+
? target.src
16+
: target instanceof HTMLLinkElement
17+
? target.href
18+
: '';
19+
const reportData = {
20+
type: 'error',
21+
subType: 'resource',
22+
url,
23+
html: target.outerHTML,
24+
pageUrl: window.location.href,
25+
pahts: event.composedPath(), // 事件捕获路径
26+
};
27+
// todo
28+
console.log('resource', reportData);
29+
}
30+
},
31+
true,
32+
);
33+
34+
// 捕获未处理的 Promise 错误
35+
window.addEventListener(
36+
'unhandledrejection',
37+
event => {
38+
const { reason } = event;
39+
const reportData = {
40+
type: 'error',
41+
subType: 'promise',
42+
reason: reason?.stack || reason,
43+
pageUrl: window.location.href,
44+
startTime: performance.now(),
45+
};
46+
// todo
47+
console.log('promise', reportData);
48+
},
49+
true,
50+
);
51+
52+
// 捕获未处理的 JS 错误
53+
window.onerror = function (message, source, lineno, colno, error) {
54+
const reportData = {
55+
type: 'error',
56+
subType: 'js',
57+
message,
58+
source,
59+
lineno,
60+
colno,
61+
error: error?.stack,
62+
pageUrl: window.location.href,
63+
startTime: performance.now(),
64+
};
65+
// todo
66+
console.log('js', reportData);
67+
};
68+
}
Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,13 @@
1-
import { PerformanceMonitor } from './utils/performance';
1+
import fetch from './utils/fetch';
2+
import { observerEntries } from './utils/observerEntries';
3+
import observerFCP from './utils/observerFcp';
4+
import observerLCP from './utils/observerLcp';
5+
import observerLoad from './utils/observerLoad';
26

3-
export default PerformanceMonitor;
7+
export default function performanceUtil() {
8+
fetch();
9+
observerEntries();
10+
observerFCP();
11+
observerLCP();
12+
observerLoad();
13+
}

packages/monitor-sdk/src/plugins/performance/types.ts

Lines changed: 0 additions & 9 deletions
This file was deleted.

packages/monitor-sdk/src/plugins/performance/utils/fcp&fp.ts

Lines changed: 0 additions & 37 deletions
This file was deleted.
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
const originalFetch = window.fetch;
2+
3+
function owerwriteFetch() {
4+
window.fetch = function newFetch(url, config) {
5+
const startTime = performance.now();
6+
const reportData = {
7+
type: 'performance',
8+
subType: 'fetch',
9+
url,
10+
startTime: startTime,
11+
endTime: 0,
12+
duration: 0,
13+
method: config?.method || 'GET',
14+
status: 0,
15+
success: false,
16+
};
17+
return originalFetch(url, config)
18+
.then(response => {
19+
const endTime = performance.now();
20+
const duration = endTime - startTime;
21+
reportData.endTime = endTime;
22+
reportData.duration = duration;
23+
reportData.status = response.status;
24+
reportData.success = response.ok;
25+
console.log('fetch', reportData);
26+
// 这里可以添加上报逻辑
27+
return response;
28+
})
29+
.catch(error => {
30+
const endTime = performance.now();
31+
const duration = endTime - startTime;
32+
reportData.endTime = endTime;
33+
reportData.duration = duration;
34+
reportData.status = error.status || 0;
35+
reportData.success = false;
36+
console.log('fetch error', reportData);
37+
// 这里可以添加上报逻辑
38+
return Promise.reject(error);
39+
});
40+
};
41+
}
42+
export default function fetch() {
43+
if (window.fetch) {
44+
owerwriteFetch();
45+
} else {
46+
console.warn('fetch is not supported in this browser');
47+
}
48+
}

packages/monitor-sdk/src/plugins/performance/utils/lcp.ts

Lines changed: 0 additions & 38 deletions
This file was deleted.

0 commit comments

Comments
 (0)