检查前后环节的依赖,核心不是看单个资源有多快,而是把一次页面加载拆成若干阶段,逐段确认“谁在等谁”。常见误解是:只要把图片压小、把服务器升级,加载速度就会提升。实际上,很多延迟来自依赖链条——关键脚本必须等上一个脚本执行完,字体必须等CSS解析完,接口必须等登录态返回。只有先画出依赖关系,才能判断该并行、该延后还是该删除。
打开浏览器开发者工具的“网络”面板,按时间顺序观察请求。如果第二个请求的开始时间几乎等于第一个请求的结束时间,它们很可能是串行依赖。典型例子是:app.js 下载并执行后,才发起接口请求;接口返回后,才渲染首屏内容。这时压缩app.js只能缩短第一段,后续等待仍然存在。
并行依赖则不同:多个图片、样式表同时下载,彼此不等待。判断依据是请求的起始时间是否重叠。重叠越多,说明并行度越高;如果大量请求被排成一条直线,就要检查是否存在阻塞脚本、同步接口或动态导入链。
关键路径指从HTML开始到首屏可见内容渲染完成,必须依次完成的最长依赖链。它不是所有请求的总和,而是那条“缺了它就无法继续”的链。检查步骤可以这样执行:
适用条件是:页面首屏内容明确,且你能复现一次完整加载。判断结果是:如果关键路径上超过一半时间花在等待某个第三方脚本或接口,那么优化重点就不是压缩静态资源,而是调整加载顺序或增加超时降级。
第一种误判是把“下载快”当成“执行快”。一个脚本下载只用了50毫秒,但执行时同步读取本地存储、计算大量数据,仍会阻塞渲染。检查方法是看开发者工具“性能”面板中的长任务,而不是只看网络面板的耗时。
第二种误判是把“接口返回快”当成“页面渲染快”。接口返回后,前端还要解析JSON、更新组件、触发重排。如果接口和渲染之间存在依赖,接口快并不等于首屏快。
第三种误判是把“预加载”当成万能解。预加载可以提前发起请求,但如果后续环节必须等待某个条件(例如用户登录态、特征开关),预加载的资源仍会被搁置。此时应先确认依赖条件是否可提前确定,再决定是否预加载。
多人协作中,返工往往来自“我以为你那边已经处理了”。减少返工的做法是:每次涉及加载速度的改动,都附上一张依赖清单,而不是只写“已优化”。清单至少包含四项:
例如,假设某页面把统计脚本放在<head>中同步加载,导致首屏渲染等待。改动方案可以是改为异步加载,并设置超时。验证时重新录制加载过程,确认统计脚本不再出现在关键路径上。这里“假设”仅用于说明方法,不代表任何真实项目结果。
加载速度检查容易和搜索引擎抓取混在一起。需要分清:robots.txt的抓取限制不等于可靠的索引移除;站点地图不保证收录;HTTPS不保证安全无漏洞或排名。这些属于抓取与索引范畴,不是前后环节依赖的直接判断依据。若页面加载慢的同时收录也差,应分别检查服务器响应、渲染依赖和抓取预算,而不是把两者当成同一个原因。
下一步,选一个首屏最慢的页面,按上面的四步画出关键路径,并把依赖清单交给负责对应环节的人。只有依赖关系被写清楚,网站加载速度提升才不会变成反复返工的猜谜游戏。