Lighthouse TBT指标高到10秒,怎么优化才能降到2秒以下? Prog.琪帆 提问于 2026-01-25 22:34:22 阅读 36 工具 我在开发一个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再跑一遍,确认优化效果,别瞎折腾。 回复 点赞 7 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 加载更多 相关推荐 2 回答 74 浏览 Lighthouse 报告中 TBT 过高怎么优化? 我用 Lighthouse 测了一个 React 页面,TBT(Total Blocking Time)高达 400ms,明明页面看起来挺流畅的,不知道哪里卡住了。试过把一些 useEffect 拆成... 令狐明宇 工具 2026-03-02 09:04:25 1 回答 29 浏览 Lighthouse 报 Total Blocking Time 过高怎么办? 我用 Lighthouse 测性能时,TBT(Total Blocking Time)总是超过 200ms,明明页面看起来挺快的,但分数被拉得很低。我试过把一些第三方脚本 defer 了,但没太大改善... 司马文亭 工具 2026-03-26 16:50:21 2 回答 59 浏览 Lighthouse 的 Speed Index 到底怎么算的?为什么优化后反而变差了? 我最近在优化一个电商首页,用 Lighthouse 测速时发现 Speed Index 一直卡在 4s 多。明明我已经做了懒加载、压缩图片、移除阻塞资源这些操作,但跑完 Lighthouse 后 Sp... 南宫淇钧 工具 2026-03-09 19:28:22 2 回答 27 浏览 为什么优化了代码后Lighthouse的TTI指标还是卡在11秒以上? 我在优化一个单页应用时,Lighthouse的TTI一直显示11秒多,明明把JS拆分成了动态导入,还压缩了图片。但测试报告里显示"largest-contentful-paint"还是在首屏阻塞渲染,... 宝玲 工具 2026-02-16 08:49:27 1 回答 64 浏览 PWA在Lighthouse中总是拿不到100分,离线功能到底怎么配? 我用Workbox生成了service worker,本地测试离线也能加载页面,但Lighthouse评分里“Offline support”这一项还是不通过,提示“Does not register... Top丶子聪 前端 2026-03-20 11:07:19 2 回答 25 浏览 Lighthouse 报告中 FCP 时间过长,怎么优化? 我用 Lighthouse 测了一个页面,FCP(First Contentful Paint)居然要 4 秒多,明明首页就加载了一张 logo 图和一点文字,按理说不应该这么慢啊。 我试过把关键 C... 闲人俊蓓 工具 2026-02-28 21:33:19 1 回答 83 浏览 Lighthouse 性能报告里的 TTI 和 FCP 到底怎么优化? 我用 Lighthouse 跑了个性能测试,发现 TTI(可交互时间)和 FCP(首次内容绘制)得分特别低,页面明明看起来加载挺快的啊? 我已经把关键 CSS 内联了,JS 也加了 async,但还是... 文科酱~ 前端 2026-02-26 06:47:20 2 回答 62 浏览 Lighthouse SEO检测中,为什么所有文本必须可访问才能通过? 在优化项目SEO时,Lighthouse报「确保所有文本都是可访问的」错误,但我的页面文本都正常显示。我检查了的alt属性和ARIA标签都没问题,这是怎么回事? 尝试过把文字改成包裹并加aria-la... Top丶永伟 工具 2026-02-16 21:46:24 2 回答 40 浏览 Lighthouse提示”优化流程”分数低,动态加载的JS脚本还是导致阻塞渲染怎么办? 我在React项目里用useEffect动态加载第三方统计脚本,虽然用了defer属性,但Lighthouse还是显示这个标签造成了渲染阻塞。代码是这样的: useEffect(() => { ... 轩辕建杰 工具 2026-02-01 16:21:24 1 回答 25 浏览 Lighthouse 报无障碍问题:按钮缺少可访问名称怎么办? 我在用 Lighthouse 做审计时,总提示“按钮没有可访问的名称”,但我的按钮明明有文字啊,比如 提交 这种。为啥还会报错? 后来我试过加 aria-label,也试过用 span 包文字,但有些... 天琪🍀 工具 2026-03-30 13:28:11
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秒以下应该没问题。