为什么我的PerformanceObserver获取不到mark标记的性能数据?
我用Performance API给页面关键节点加了performance.mark()标记,但通过PerformanceObserver获取数据时一直为空,这是怎么回事?
我按照文档写了这样的代码:
performance.mark('start-render');
// 执行了一些DOM操作
performance.mark('end-render');
const observer = new PerformanceObserver(list => {
console.log(list.getEntries()); // 这里输出空数组
});
observer.observe({ entryTypes: ['mark'] });
明明调用了mark方法,也设置了正确的entryTypes,但就是获取不到数据。我试过换成measure类型也是一样,还发现如果改成navigation类型反而能拿到导航数据。是不是有什么初始化步骤遗漏了?
PerformanceObserver 只会收到它创建之后才产生的性能条目,你那两个 performance.mark() 调用发生在 observer 之前,属于“历史数据”,observer 拿不到是正常的。这就像你打开录音机之前别人说的内容,当然录不进去。
标准写法应该是先注册 observer,再打点。把 observe 调用放在所有 mark 之前:
另外也可以考虑用 performance.getEntriesByType('mark') 直接同步读取所有已存在的 mark,但这和 Observer 的用途不一样,适合一次性采集的场景。
你提到换成 navigation 类型能拿到数据,是因为 navigation 条目生命周期早,通常在脚本执行前就已经生成了,而 observer 对这种持久条目有时能捕获到,但 mark 不行,它是严格按时间顺序的。
记住一点:Observer 必须提前注册,不然就漏数据。这是文档里强调的时序要求,不是可选的最佳实践。