为什么我的Vue页面TTI指标这么高?优化后没明显改善?
我最近在优化一个Vue页面的性能,发现TTI指标一直卡在8秒以上。我尝试用了懒加载组件和代码分割,但测试下来TTI还是没降下来。这是我的页面组件代码:
{{ largeData }}
export default {
data() {
return {
largeData: null,
dataLoaded: false
}
},
mounted() {
// 这里有个复杂的数据处理
this.processData();
setTimeout(() => {
this.dataLoaded = true;
}, 5000);
},
methods: {
processData() {
let temp = [];
for(let i=0; i<100000; i++) {
temp.push(Math.random()*i);
}
this.largeData = temp.sort();
}
}
}
我用Lighthouse测了发现,在mounted钩子执行processData方法时,主线程被阻塞了很久。但这个数据处理是业务必需的,该怎么优化才能让TTI降下来呢?难道非得拆分到Web Worker里吗?
你提到懒加载和代码分割没效果,那是因为这些优化的是加载阶段的网络请求,并没有解决主线程阻塞的问题。现在关键点是把数据处理从主线程挪出去。
Web Worker是正解,别无他法。这东西就是为这种场景设计的。你可以这样改:
**1. 把处理逻辑放到worker.js**
**2. 页面组件里调用Worker**
这样主线程就完全释放了,TTI会明显下降。当然你也可以配合分页或虚拟滚动来优化渲染性能,但那是下一步的事了。
再说一遍,只要你在主线程做这种重计算,TTI就别想降下来。Web Worker不是加分项,是必选项。
这样就解放主线程了,TTI自然能下来。