为什么优化了代码后Lighthouse的TTI指标还是卡在11秒以上?
我在优化一个单页应用时,Lighthouse的TTI一直显示11秒多,明明把JS拆分成了动态导入,还压缩了图片。但测试报告里显示”largest-contentful-paint”还是在首屏阻塞渲染,main.js文件虽然只有200kb,但评分就是提不上去。尝试过用预加载关键资源,但开发者工具网络面板还是显示…
代码结构大概是这样的:
<html>
<head>
<link href="/styles.css" rel="external nofollow" rel="stylesheet">
<script src="/main.js" defer></script>
</head>
<body>
<div id="app"></div>
<script type="module">
import('./lazy-module.js')
</script>
</body>
</html>
这样写有问题吗?为什么首屏加载时间还是卡在TTI指标上?
main.js虽然是defer加载,但它可能还是太大了,即使压缩到200kb,解析和执行的时间也会拖慢TTI。优化建议如下:
先把关键CSS内联到HTML里,减少外链CSS的请求时间。像你这种单页应用,首屏样式其实不需要太多,直接写在head里就行:
然后,
main.js虽然用了defer,但200kb对首屏来说还是太重了。你可以试试把首屏初始化逻辑单独拆出来,用一个小的bootstrap.js来处理首屏渲染,剩下的逻辑再动态加载:另外,动态导入的
lazy-module.js最好也加上预加载,避免它成为瓶颈:最后,确保服务器启用了Gzip或Brotli压缩,特别是对JS和CSS文件。如果服务器没配置好,文件传输时间会很长。
按照上面这些改完后,重新跑一下Lighthouse,TTI应该能降到6秒以内。如果还不行,可能是第三方库或者图片资源的问题,可以用开发者工具的Performance面板具体分析一下主线程的耗时分布,找到真正的瓶颈。
复制这些改法,基本能解决问题。