监控用户访问界面时发生的卡顿可以帮助前端开发人员识别和解决性能问题。以下是一个详细的代码示例,展示如何使用 JavaScript 监控用户界面卡顿并记录相关信息。
1. 使用 PerformanceObserver
PerformanceObserver 是一个用于监听性能事件的 API,可以监控多种性能指标,如长任务(Long Tasks)。长任务是指执行时间超过 50 毫秒的任务,通常会导致用户界面卡顿。
示例代码:
// 创建一个 PerformanceObserver 实例
const observer = new PerformanceObserver((list) => {
list.getEntries().forEach((entry) => {
if (entry.duration > 50) {
console.log('Long Task detected:', entry);
// 在这里可以添加代码,将卡顿信息发送到服务器或进行其他处理
}
});
});
// 开始观察长任务
observer.observe({ entryTypes: ['longtask'] });
2. 使用 requestAnimationFrame
requestAnimationFrame 是一个用于在浏览器下一次重绘之前执行指定回调函数的 API。通过测量连续两次 requestAnimationFrame 回调之间的时间间隔,可以检测页面的卡顿。
示例代码:
let lastFrameTime = performance.now();
function checkFrame() {
const now = performance.now();
const delta = now - lastFrameTime;
if (delta > 50) {
console.log(`Frame took too long: ${delta.toFixed(2)}ms`);
// 在这里可以添加代码,将卡顿信息发送到服务器或进行其他处理
}
lastFrameTime = now;
requestAnimationFrame(checkFrame);
}
// 开始监控帧时间
requestAnimationFrame(checkFrame);
3. 结合 PerformanceObserver 和 requestAnimationFrame
可以结合 PerformanceObserver 和 requestAnimationFrame 来更全面地监控用户界面卡顿。
示例代码:
// 使用 PerformanceObserver 监控长任务
const longTaskObserver = new PerformanceObserver((list) => {
list.getEntries().forEach((entry) => {
if (entry.duration > 50) {
console.log('Long Task detected:', entry);
// 在这里可以添加代码,将卡顿信息发送到服务器或进行其他处理
}
});
});
longTaskObserver.observe({ entryTypes: ['longtask'] });
// 使用 requestAnimationFrame 监控帧时间
let lastFrameTime = performance.now();
function checkFrame() {
const now = performance.now();
const delta = now - lastFrameTime;
if (delta > 50) {
console.log(`Frame took too long: ${delta.toFixed(2)}ms`);
// 在这里可以添加代码,将卡顿信息发送到服务器或进行其他处理
}
lastFrameTime = now;
requestAnimationFrame(checkFrame);
}
requestAnimationFrame(checkFrame);
4. 将卡顿信息发送到服务器
为了进一步分析和处理卡顿问题,可以将卡顿信息发送到服务器。下面是一个示例,展示如何使用 fetch 将卡顿信息发送到服务器。
示例代码:
function sendLagInfo(info) {
fetch('https://your-server.com/log-lag', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify(info),
})
.then(response => response.json())
.then(data => console.log('Success:', data))
.catch((error) => console.error('Error:', error));
}
// 使用 PerformanceObserver 监控长任务并发送信息
const longTaskObserver = new PerformanceObserver((list) => {
list.getEntries().forEach((entry) => {
if (entry.duration > 50) {
console.log('Long Task detected:', entry);
sendLagInfo({
type: 'longtask',
duration: entry.duration,
startTime: entry.startTime,
});
}
});
});
longTaskObserver.observe({ entryTypes: ['longtask'] });
// 使用 requestAnimationFrame 监控帧时间并发送信息
let lastFrameTime = performance.now();
function checkFrame() {
const now = performance.now();
const delta = now - lastFrameTime;
if (delta > 50) {
console.log(`Frame took too long: ${delta.toFixed(2)}ms`);
sendLagInfo({
type: 'frame',
duration: delta,
timestamp: now,
});
}
lastFrameTime = now;
requestAnimationFrame(checkFrame);
}
requestAnimationFrame(checkFrame);
通过上述代码,可以有效地监控用户界面卡顿,并将相关信息发送到服务器进行进一步分析和处理。这样可以帮助你识别性能瓶颈并优化网页性能,提高用户体验。当然这只是简单示例,企业级的项目中还需要考虑其他因素。