网页加载速度提升遇到卡顿时,最该做的不是马上压缩图片或换服务器,而是按用户请求到页面呈现的顺序,逐段检查前后依赖:前一段的输出是否成为后一段的输入,延迟到底发生在哪一环。第一次接触这个问题,起点是画出一条从浏览器发起请求到页面可交互的链路,下一步是给每一段打上耗时标记,再判断哪一段在等前一段。
一次页面加载通常可以拆成:DNS 解析、建立连接、发送请求、服务器处理、返回响应、浏览器解析 HTML、发现并请求子资源、执行脚本、渲染。它们不是并列的,而是前后依赖:没有 HTML 响应,浏览器就发现不了 CSS 和脚本;没有 CSS,渲染可能被阻塞;脚本若阻塞解析,后面的资源请求会被推迟。检查依赖,就是确认每一段的开始时间是否被上一段拖住。
可以按下面顺序观察:
浏览器开发者工具的 Network 和 Performance 面板能给出每项资源的排队、等待、下载耗时。判断依赖时重点看两类现象:一是某项资源的开始时间明显晚于另一项资源的结束时间,说明存在串行依赖;二是某项资源本身很快,但页面可交互时间很晚,说明瓶颈在脚本执行或渲染阶段,而不是网络。
这里要区分“可能原因”和“已经定位的原因”。例如首屏图片很晚才出现,可能是图片体积大,也可能是它被脚本动态插入,还可能是请求被前面的资源挤占。只有时间线显示它确实在等待某个脚本执行完,才能说依赖关系是主因。
如果确认某段在等前一段,处理方向是缩短关键路径,而不是平均优化所有资源。常见可执行动作包括:
适用条件是:时间线已经显示某段在等待。判断结果是,若处理后排队的开始时间提前、可交互时间下降,说明依赖被打破;若没有变化,说明瓶颈在别处,需要回到时间线重新定位。
改动后要复查三件事:关键资源的请求顺序是否更合理;服务器响应时间是否稳定;页面可交互时间是否真的提前。还要注意,把脚本改成异步后,如果脚本之间本身有执行顺序依赖,可能出现报错或功能异常,这时需要用模块化或显式等待来保证顺序。
另外,robots.txt 的抓取限制不等于可靠的索引移除,站点地图也不保证收录;这些属于抓取与索引层面,和加载速度的依赖检查不是同一件事。若页面同时存在收录问题,应分开排查。
下一步:打开浏览器开发者工具,录制一次完整加载,按“请求—响应—解析—执行—渲染”标出每段耗时,找出第一处明显的等待,再针对那一段做一次改动并复测。