PerformanceObserver 在 Vue 里监听不到 longtask 是怎么回事?
我在 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>
你现在的写法是在 mounted 钩子里创建 observer,这时候页面 DOM 已经渲染完成了,很可能错过了一些初始加载阶段的长任务。
建议把 observer 创建放到 main.js 里,在 Vue 实例创建之前就初始化。代码可以这样改:
记住一定要尽早创建这个 observer,别走弯路了。还有个细节要注意,如果用的是开发环境,Vue 开发模式下可能会有额外的任务影响结果,建议在生产环境下测试更准确。
最后提醒一句,调试的时候可以用 Chrome 的 performance panel 查看实际的长任务情况,对排查问题很有帮助。
但这里有一个关键点,你得确保在页面上有足够长的任务才会触发 longtask 事件。有时候在开发环境中,页面加载很快,可能不会有长任务产生,所以观察者就收不到回调。你可以尝试在页面上制造一些长任务,比如模拟一个长时间的计算或者阻塞主线程的操作,这样就能看到效果了。
试试下面这段代码,它会在页面加载后创建一个长任务,看看能不能触发回调:
这段代码会在页面加载2秒后开始一个持续1秒的长任务,应该能触发 PerformanceObserver 的回调。希望这能帮到你,解决你的问题。