Lighthouse TBT指标高到10秒,怎么优化才能降到2秒以下? Prog.琪帆 提问于 2026-01-25 22:34:22 阅读 27 工具 我在开发一个React单页应用时,Lighthouse评分突然显示TBT指标飙到了10秒多,用户反馈页面确实有明显卡顿。之前尝试把非必要JS改成懒加载,但TBT还是没降下来,这是为什么啊? 用开发者工具看了下main.js有300多KB,但已经用webpack做了代码分割。Lighthouse报告里显示有三个超过50ms的任务集中在5秒左右,跟图片加载有关?改用webp格式后反而更差了… 现在完全不知道该怎么入手优化了,总不能让用户等这么久吧?有遇到过类似情况的前辈给点具体建议吗? TBT指标 我来解答 赞 8 收藏 分享 生成中... 手机扫码查看 复制链接 生成海报 反馈 发表解答 您需要先 登录/注册 才能发表解答 2 条解答 UI亚楠 Lv1 TBT高主要是因为主线程被长时间占用,图片加载只是诱因,真正的问题大概率是JS执行阻塞了渲染。直接这样:把耗时的JS任务用 requestIdleCallback 或者 setTimeout 拆成小块异步执行,别一股脑全塞在初始化里。 另外,300多KB的main.js还是太大了,代码分割可能没做好。检查一下webpack配置,确保动态导入写法是 import() 而不是打包成了静态依赖。图片这块可以用懒加载,别一次性加载所有图片,推荐用 loading="lazy" 属性或者第三方库比如 lozad.js。 // 示例:拆分耗时任务 function processInChunks(taskList) { taskList.forEach((task, index) => { setTimeout(() => { task(); }, index * 100); // 分散执行 }); } // 示例:图片懒加载 最后,记得用Lighthouse再跑一遍,确认优化效果,别瞎折腾。 回复 点赞 6 2026-02-17 04:05 UX-克培 Lv1 TBT高到10秒确实有点夸张,但也不是不能解决。你已经做了懒加载和代码分割,这是对的,不过还得再深入优化一下。 首先,300多KB的main.js虽然做了代码分割,但还是太大了。建议用 webpack-bundle-analyzer 看看里面具体哪些库或代码占了大头,没用的部分直接砍掉或者替换成更轻量的。另外,确保开启了Gzip或者Brotli压缩,这个能显著减少JS文件大小。 然后是那三个超过50ms的任务,既然跟图片加载有关,可能是因为图片尺寸过大或者解码耗时太长。别急着换格式,先试试这几招: 1. 用 image-set 或者 srcset 提供适配不同设备的图片尺寸。 2. 图片懒加载一定要做好,确保只加载视口内的图片。 3. 如果浏览器支持,可以用 loading="lazy" 属性。 关于WebP,有些老浏览器不支持确实会导致问题,可以试试Modernizr之类的工具做条件加载,支持WebP的用WebP,不支持的用JPEG。 最后别忘了看看CSS动画或者布局有没有引起重排,这个也可能是TBT高的原因。如果用了第三方库,尽量避免那些会触发大量DOM操作的。 简单总结:进一步减小JS体积、优化图片加载逻辑、检查CSS和动画影响。按这些步骤来,降到2秒以下应该没问题。 回复 点赞 8 2026-01-29 14:25 加载更多 相关推荐 1 回答 56 浏览 Lighthouse 报告中 TBT 过高怎么优化? 我用 Lighthouse 测了一个 React 页面,TBT(Total Blocking Time)高达 400ms,明明页面看起来挺流畅的,不知道哪里卡住了。试过把一些 useEffect 拆成... 令狐明宇 工具 2026-03-02 09:04:25 1 回答 16 浏览 为什么优化了代码后Lighthouse的TTI指标还是卡在11秒以上? 我在优化一个单页应用时,Lighthouse的TTI一直显示11秒多,明明把JS拆分成了动态导入,还压缩了图片。但测试报告里显示"largest-contentful-paint"还是在首屏阻塞渲染,... 宝玲 工具 2026-02-16 08:49:27 1 回答 13 浏览 Lighthouse 报告中 FCP 时间过长,怎么优化? 我用 Lighthouse 测了一个页面,FCP(First Contentful Paint)居然要 4 秒多,明明首页就加载了一张 logo 图和一点文字,按理说不应该这么慢啊。 我试过把关键 C... 闲人俊蓓 工具 2026-02-28 21:33:19 1 回答 49 浏览 Lighthouse 性能报告里的 TTI 和 FCP 到底怎么优化? 我用 Lighthouse 跑了个性能测试,发现 TTI(可交互时间)和 FCP(首次内容绘制)得分特别低,页面明明看起来加载挺快的啊? 我已经把关键 CSS 内联了,JS 也加了 async,但还是... 文科酱~ 前端 2026-02-26 06:47:20 2 回答 46 浏览 Lighthouse SEO检测中,为什么所有文本必须可访问才能通过? 在优化项目SEO时,Lighthouse报「确保所有文本都是可访问的」错误,但我的页面文本都正常显示。我检查了的alt属性和ARIA标签都没问题,这是怎么回事? 尝试过把文字改成包裹并加aria-la... Top丶永伟 工具 2026-02-16 21:46:24 1 回答 30 浏览 Lighthouse提示”优化流程”分数低,动态加载的JS脚本还是导致阻塞渲染怎么办? 我在React项目里用useEffect动态加载第三方统计脚本,虽然用了defer属性,但Lighthouse还是显示这个标签造成了渲染阻塞。代码是这样的: useEffect(() => { ... 轩辕建杰 工具 2026-02-01 16:21:24 2 回答 20 浏览 Lighthouse 报“Best Practices”里有被动事件监听器问题,怎么解决? 我在用 Lighthouse 做性能审计时,发现 Best Practices 里提示“Uses passive event listeners to improve scrolling perfor... W″保艳 工具 2026-02-28 21:49:20 1 回答 26 浏览 用 Lighthouse Node API 时怎么传入自定义的 Chrome 启动参数? 我正在用 Lighthouse 的 Node API 做自动化性能测试,想给 Chrome 加一些启动参数,比如 --no-sandbox 或者 --headless=new,但不知道该怎么传进去。试... 书生シ尚萍 工具 2026-02-25 23:43:19 2 回答 18 浏览 Lighthouse 报告里“未使用 JavaScript”是怎么回事? 我在用 Lighthouse 做性能审计时,发现报告里提示“未使用的 JavaScript”,但这些脚本明明是我页面必需的啊。比如下面这段代码: import { initMap } from ... 司马翌喆 工具 2026-02-25 22:10:18 2 回答 19 浏览 Lighthouse Node API运行后性能评分一直是undefined怎么办? 我在用Lighthouse Node API跑性能测试时,获取的performance评分总是undefined,但其他指标正常。代码是这样写的: const lighthouse = require... 皇甫明阳 工具 2026-02-17 16:29:22
requestIdleCallback或者setTimeout拆成小块异步执行,别一股脑全塞在初始化里。另外,300多KB的main.js还是太大了,代码分割可能没做好。检查一下webpack配置,确保动态导入写法是
import()而不是打包成了静态依赖。图片这块可以用懒加载,别一次性加载所有图片,推荐用loading="lazy"属性或者第三方库比如lozad.js。最后,记得用Lighthouse再跑一遍,确认优化效果,别瞎折腾。
首先,300多KB的main.js虽然做了代码分割,但还是太大了。建议用
webpack-bundle-analyzer看看里面具体哪些库或代码占了大头,没用的部分直接砍掉或者替换成更轻量的。另外,确保开启了Gzip或者Brotli压缩,这个能显著减少JS文件大小。然后是那三个超过50ms的任务,既然跟图片加载有关,可能是因为图片尺寸过大或者解码耗时太长。别急着换格式,先试试这几招:
1. 用
image-set或者srcset提供适配不同设备的图片尺寸。2. 图片懒加载一定要做好,确保只加载视口内的图片。
3. 如果浏览器支持,可以用
loading="lazy"属性。关于WebP,有些老浏览器不支持确实会导致问题,可以试试Modernizr之类的工具做条件加载,支持WebP的用WebP,不支持的用JPEG。
最后别忘了看看CSS动画或者布局有没有引起重排,这个也可能是TBT高的原因。如果用了第三方库,尽量避免那些会触发大量DOM操作的。
简单总结:进一步减小JS体积、优化图片加载逻辑、检查CSS和动画影响。按这些步骤来,降到2秒以下应该没问题。