资源有限时,页面加载加速不应从“把所有东西都优化一遍”开始,而应先处理影响最大、验证成本最低的瓶颈。合理顺序是:先确认慢在服务器响应、网络传输还是浏览器渲染,再优先处理阻塞首屏的大资源、重复请求和过长的主线程任务。下面是一份可执行清单,每项都说明查什么、怎么查、结果说明什么。
要查的是:从请求发出到页面可交互,时间消耗在哪些阶段。怎么查:用浏览器开发者工具的“网络”和“性能”面板各录一次加载,或在命令行用 curl -w 查看 DNS、连接、首字节时间。结果说明:如果首字节时间很长,问题偏服务器或后端;如果首字节很快但资源下载久,问题偏网络与资源体积;如果下载快但页面迟迟不响应,问题偏脚本执行与渲染。适用条件:先测真实入口页,而不是首页或后台页,因为不同页面的瓶颈可能完全不同。
要查的是:哪些 CSS 和 JavaScript 在首屏出现前必须下载并执行。怎么查:在开发者工具中查看请求的优先级与发起者,检查 <head> 中同步加载的脚本和外链样式。结果说明:若某个脚本体积大且不在首屏使用,却阻塞了渲染,把它改为延迟加载或移到页面底部,通常收益明显。判断依据:首屏可见内容是否依赖该资源;不依赖的,就不应阻塞首屏。注意区分“可能原因”和“已定位原因”:脚本多不一定慢,只有实测它占用了关键路径,才算定位。
要查的是:文本资源是否启用压缩,图片是否按显示尺寸输出,是否存在重复加载同一库。怎么查:看响应头中的内容编码,比较图片原始尺寸与页面实际显示尺寸,在网络面板按文件名排序找重复项。结果说明:未压缩的 HTML、CSS、JS 传输体积会明显偏大;图片超出显示尺寸会造成无谓下载;同一库被多个组件重复引入会增加请求数。适用条件:先处理体积最大的几项,而不是追求全部资源都最小。压缩对文本收益高,对已压缩的图片和视频收益有限。
要查的是:页面加载期间是否有单个脚本任务长时间占用主线程。怎么查:在性能面板录制加载过程,查看长任务标记及其调用栈。结果说明:若长任务出现在首屏渲染前,用户会感到白屏或点击无响应;把它拆分为多个小任务,或推迟到首屏之后再执行,能改善可交互时间。判断结果:优化后重新录制,若长任务消失且首屏时间下降,说明处理有效;若没有变化,应回到上一阶段重新定位,而不是继续拆分脚本。
资源有限时,判断优先级的标准不是“哪项技术更先进”,而是“改完之后,入口页的首屏或可交互时间是否真的下降”。下一步:选一个真实入口页,按上面的顺序录一次加载数据,把最大瓶颈记下来,只改这一项并复测。