PerformanceObserver 在 Vue 里监听不到 longtask 是怎么回事?

Dev · 闪闪 阅读 18

我在 Vue 项目里想用 PerformanceObserver 监控长任务(longtask),但完全收不到回调,是不是写法有问题?

已经确认浏览器支持 longtask(Chrome 100+),也加了 entryTypes: [‘longtask’],但 observer 就是不触发。试过把代码放到 mounted 和 nextTick 里都不行。

<script>
export default {
  mounted() {
    if (PerformanceObserver.supportedEntryTypes.includes('longtask')) {
      const observer = new PerformanceObserver((list) => {
        console.log('检测到长任务:', list.getEntries());
      });
      observer.observe({ entryTypes: ['longtask'] });
    }
  }
}
</script>
我来解答 赞 6 收藏
二维码
手机扫码查看
2 条解答
西门士媛
你遇到的问题我之前也踩过坑。首先确认一点,PerformanceObserver 监听 longtask 的时候,必须要在页面开始执行任务前就创建观察者,不然已经发生的长任务是捕捉不到的。

你现在的写法是在 mounted 钩子里创建 observer,这时候页面 DOM 已经渲染完成了,很可能错过了一些初始加载阶段的长任务。

建议把 observer 创建放到 main.js 里,在 Vue 实例创建之前就初始化。代码可以这样改:

if (window.PerformanceObserver && PerformanceObserver.supportedEntryTypes.includes('longtask')) {
const observer = new PerformanceObserver((list) => {
console.log('检测到长任务:', list.getEntries());
});
observer.observe({ entryTypes: ['longtask'] });
}


记住一定要尽早创建这个 observer,别走弯路了。还有个细节要注意,如果用的是开发环境,Vue 开发模式下可能会有额外的任务影响结果,建议在生产环境下测试更准确。

最后提醒一句,调试的时候可以用 Chrome 的 performance panel 查看实际的长任务情况,对排查问题很有帮助。
点赞
2026-03-26 19:15
Des.星宇
我之前踩过这个坑,这个问题挺常见的。你在 Vue 里使用 PerformanceObserver 监听 longtask,但发现回调没有触发。首先确认浏览器支持 longtask,这一步你已经做了。然后确保你的 observer 正确初始化并且 observe 方法也被正确调用,这些看起来你也都做对了。

但这里有一个关键点,你得确保在页面上有足够长的任务才会触发 longtask 事件。有时候在开发环境中,页面加载很快,可能不会有长任务产生,所以观察者就收不到回调。你可以尝试在页面上制造一些长任务,比如模拟一个长时间的计算或者阻塞主线程的操作,这样就能看到效果了。

试试下面这段代码,它会在页面加载后创建一个长任务,看看能不能触发回调:

export default {
mounted() {
if (PerformanceObserver.supportedEntryTypes.includes('longtask')) {
const observer = new PerformanceObserver((list) => {
console.log('检测到长任务:', list.getEntries());
});
observer.observe({ entryTypes: ['longtask'] });

// 制造一个长任务
setTimeout(() => {
let start = performance.now();
while (performance.now() - start < 1000); // 模拟一个耗时1秒的任务
}, 2000); // 在页面加载2秒后开始
}
}
}


这段代码会在页面加载2秒后开始一个持续1秒的长任务,应该能触发 PerformanceObserver 的回调。希望这能帮到你,解决你的问题。
点赞
2026-03-22 09:00