卡顿主因是主线程被长任务阻塞。用Performance面板抓取超50ms的红色/橙色长任务,结合Summary筛选“Long Tasks”,检查大数组遍历、深递归、同步DOM操作及第三方库同步方法,辅以performance.now()或console.time验证耗时,超100ms即影响交互流畅度。

直接看主线程有没有被长任务堵住。卡顿不是“慢”,而是某个同步操作霸占了线程,让渲染、事件响应全得排队等它结束。
用 Performance 面板抓长任务
打开 Chrome DevTools → Performance → 点 Record,复现卡顿操作(比如连点按钮、滚动列表),停止后重点看 Main 线程的火焰图:
- 红色或橙色的长条(超过 50ms)就是嫌疑对象,鼠标悬停能看清是哪个函数在执行
- 连续多个短任务堆在一起,也可能压垮帧率,注意观察是否密集出现
- 配合底部 Summary 面板,筛选 “Long Tasks” 类型,快速定位耗时最高的几项
检查代码里有没有隐性同步大活
很多卡顿不是来自网络或动画,而是你写的纯 JS 同步逻辑:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 超大数组的遍历、排序、深克隆(比如处理上万行导出数据时直接 for 循环拼字符串)
- 递归过深或未设终止条件的计算(如没加边界判断的树形结构遍历)
- 同步 DOM 批量操作,比如循环 1000 次改 innerHTML 或 style 属性
- 第三方库的同步方法调用,像某些 Excel 解析库的 .build()、图表库的 .render() 等,文档未必写明是否同步
用 performance.now() 快速验证可疑段
在怀疑的代码块前后加时间标记,确认是不是它拖慢了主线程:
立即学习“Java免费学习笔记(深入)”;
- console.time('heavy-loop') 和 console.timeEnd('heavy-loop') 是最轻量的方式
- 更精确可用 performance.mark() + performance.measure(),结果可导出分析
- 如果某段代码稳定跑 300ms 以上,基本可以确定它是阻塞源,不用再猜
辅助判断:看浏览器有没有弹“脚本无响应”
这不是报错,而是浏览器发出的明确信号:
- Chrome / Edge 在脚本执行超 10 秒时会弹提示框,Firefox 阈值约 10 秒,Safari 类似
- 哪怕没到阈值,只要用户明显感知到点击无反馈、动画断掉、Loading 停转,就说明已有任务 > 100ms,影响交互流畅度
- 这种卡顿通常不会报错,也不会出现在 Network 或 Console 里,只能靠 Performance 或代码审查发现

















