跳至正文
精选文章 · Google SEO

JS压缩后还是卡:下载体积和主线程执行成本要分开看

// / / 光算科技

JS开启压缩后仍然卡顿,要分别检查传输体积和浏览器执行成本。gzip、Brotli主要减少网络传输的字节;minify通常移除空白、缩短标识等;这些操作不会自动取消页面原本要做的计算、事件处理和DOM更新。Network变轻了,Performance里的主线程长任务仍可能存在。

先确认“体积变小”指哪一个数

Network中传输大小与资源解码后的大小可能不同,缓存命中时的显示也不同。构建目录里的文件大小、线上压缩后的响应大小和浏览器实际收到的字节,不应混在一列里比较。先查看Content-Encoding及缓存来源,再确认生产是否真正发送了预期版本。

一个高度重复的脚本文件可能压缩得很小,解码后仍包含大量待解析的代码。反过来,一个不太好压缩的资源也不一定执行昂贵。仅凭压缩比例排序,无法判断哪个组件最影响用户操作。源代码映射文件的请求也应按实际加载场景区分,不要把开发工具取回的调试资源直接当成每位用户的执行成本。

原创示意:压缩文件经过传输后进入处理器,说明字节减少与任务执行是两个阶段

原创物件插画:较少传输字节不等于没有执行工作。图形不按真实耗时比例绘制,也不展示客户优化成绩。

在Performance里找具体任务

录制页面加载及真正卡顿的操作,找到主线程长任务,再沿调用栈查看脚本来源。web.dev长任务文档把超过50毫秒的任务定义为长任务。这个定义用于定位调度问题,不是说每个任务都应卡在某个固定值,也不是一个独立的“页面合格分数”。

加载时的脚本解析、编译与执行,和用户点击后触发的业务工作,应分别看。INP优化文档说明,脚本下载之后浏览器仍需解析、编译并执行,这些工作可能增加用户输入延迟。因此即使请求来自缓存,也不代表不会占用主线程。

不要把Performance里的所有时间都归给JavaScript源文件。脚本改了很多DOM,后续样式计算和布局也可能昂贵。若处理函数很短,但更新后迟迟没有下一帧,要继续查渲染部分;若CPU很闲却在等待资源,则先看网络或应用依赖,不要盲目把代码拆成更多文件。

Coverage里的灰色代码不是删除清单

Chrome DevTools Coverage文档说明,录制会在重新加载后继续覆盖用户交互。它显示的是这次记录中使用与未使用的字节,不是对整个产品所有分支的证明。首屏未执行的代码,可能属于表单错误处理、语言切换、客服或下一步流程。

先定义覆盖路径,再启动录制:首次加载、菜单操作、产品规格切换、授权范围内的表单校验、错误状态及回访。对业务关键但难以在当前环境触发的分支单独标记,不能因为灰色多就删除。可用源码映射定位到可维护的模块,不要直接编辑构建压缩文件。

Coverage适合帮助发现“某类页面加载了完全不需要的模块”。例如假设只在选型计算器页面使用的重型库,被放入所有文章页公共包,可以评估按页面加载。但应先查共享依赖和入口引用,确认拆分后不会重复加载多份库,或让真正需要它的页面出现瀑布式等待。

拆包、延后加载和拆任务各解决什么

拆包主要改变资源组织和加载时机。动态导入可以避免立即加载暂时不用的功能,但用户第一次打开该功能时仍要下载和执行。若把所有成本都推到第一次点击,导航测试可能更好看,交互体验反而更差。要根据真实路径决定是否提前准备某些资源,并测量首次交互。

拆任务关注浏览器能否在工作之间处理输入和绘制。可以减少重复计算、限制一次处理的数据量,并在合适的依赖边界让出主线程。scheduler.yield()需要兼容处理;普通定时器可作为一种退回方式。只把整个大函数延迟执行,并没有减少它运行时的阻塞长度。

纯计算适合评估Web Worker,但它不能直接修改DOM,还会增加消息传输与状态同步成本。若核心问题是反复读取布局再写样式,应优化读写顺序和DOM更新范围,而非把所有代码搬进Worker。具体交互拆分可参考表单INP主线程排查

不要用异步属性掩盖执行顺序问题

async和defer主要影响脚本获取及执行调度,它们不保证昂贵脚本变成后台计算。改属性前要核对依赖、初始化顺序和DOM可用条件。组件依赖被打乱,报错后少执行了一大块工作,也可能让测试变快;这是功能损坏,不是优化成果。

第三方脚本还可能通过定时器持续工作。即使首屏结束,它也会影响后来的输入。可以先在浏览器做精确资源阻断对照帮助归因,但公共追踪、客服和同意组件的修改要有独立权限,不能借清理无用JS顺手删除业务资产。

最后交付两套检查结果

第一套记录资源:实际版本、压缩方式、传输字节、缓存状态、按页面加载情况。第二套记录行为:复现路径、任务来源、调用栈、交互阶段及功能回归。两套都保留相同环境下的原始材料,才能解释“下载已减少但按钮仍卡”这种结果。

光算谷歌SEO服务列有网站代码优化与移动端适配,脚本诊断、开发重构和验证如何分工可按项目确定。本文没有运行客户bundle改造,也没有宣称压缩后的固定节省比例。应以实际页面的下载和执行记录决定下一步,而非把开启压缩开关当成性能工作的终点。