自定义性能上报数据怎么避免重复发送?
我在做前端性能监控,用 PerformanceObserver 收集了首屏时间,但发现每次页面刷新都会重复上报相同的数据。
试过加 localStorage 标记,但用户清缓存就失效了。有没有更靠谱的方式确保每条记录只上报一次?
现在上报逻辑是这样的:
const observer = new PerformanceObserver((list) => {
for (const entry of list.getEntries()) {
if (entry.name === 'first-contentful-paint') {
fetch('/report', {
method: 'POST',
body: JSON.stringify({ fcp: entry.startTime })
});
}
}
});
observer.observe({ entryTypes: ['paint'] });
下面是详细的步骤:
1. 创建 IndexedDB 数据库:我们需要在应用启动时检查是否存在相应的数据库和对象存储空间,如果不存在则创建它们。
2. 保存已上报的数据:每次成功上报数据后,我们将这条数据的唯一标识(比如 FCP 时间戳)保存到 IndexedDB 中。
3. 检查数据是否已上报:在准备上报数据之前,先从 IndexedDB 中查询这条数据的标识是否存在。如果存在,则跳过上报;否则执行上报操作。
下面是具体的代码实现:
这里需要注意的是,IndexedDB 的操作是异步的,所以我们需要处理各种事件回调。通过这种方式,我们可以在浏览器端可靠地记录已经上报的数据,避免重复发送相同的性能指标。