安排图片与资源加载的核心不是“把图片压得越小越好”,而是按首屏可见、首屏外、交互后才出现这三类需求分层处理:首屏关键图片优先加载并明确尺寸,首屏外图片延迟加载,图标和装饰类资源尽量用矢量或字体替代,脚本和样式则按是否阻塞渲染决定加载顺序。对第一次接触这个问题的人来说,起点是先分清哪些资源影响首次看到内容,下一步是给每张图补上宽高并检查加载优先级。
很多人把加载优化等同于压缩图片,于是把所有图片统一压到很低质量,结果页面确实变小了,但首屏主图变模糊、商品细节看不清,用户仍然要等关键资源到位。体积只是因素之一,真正影响体验的是资源什么时候开始加载、加载时是否阻塞其他内容、加载后是否引起布局跳动。一张体积不大但放在首屏、又没有预留尺寸的图片,可能比一张稍大但延迟加载的图片更影响观感。
另一个误解是“全部延迟加载最省事”。如果把首屏主图也加上延迟加载,浏览器要等脚本执行后才去请求图片,反而推迟了用户看到核心内容的时间。所以起点不是统一规则,而是先给资源分类。
可以按下面的判断方式处理:
判断依据很简单:问一句“用户不操作、不滚动时,是否必须看到它”。是,就优先;否,就推迟。这个标准比按图片体积判断更贴近实际体验。
图片加载前后如果占位高度不同,文字会被推来推去,这是很常见的体验问题。处理方式是在 HTML 中写出宽高,或用 CSS 设定宽高比。例如一张 800×450 的图片,可以写成 <img src="photo.jpg" width="800" height="450" alt="示例图片">,再用 CSS 让它自适应容器宽度。这样浏览器在图片下载完成前就能预留正确空间。
适用条件是图片尺寸比例固定;如果图片比例会随内容变化,就改用容器加宽高比的方式预留。检查结果是:刷新页面时,图片位置的内容不应出现明显上下移动。
图片之外,CSS 和 JavaScript 的安排同样影响加载。普通样式表会阻塞渲染,应尽量精简并放在文档头部;普通脚本会阻塞解析,若与首屏内容无关,可加上延迟执行或异步加载。但不要把所有脚本都改成异步,因为存在依赖顺序的脚本一旦打乱执行顺序,功能可能失效。
一个可执行的检查方法是:在浏览器开发者工具的网络面板中刷新页面,观察首屏内容出现前请求了哪些资源。如果某个与首屏无关的脚本排在前面并拖慢了内容显示,就调整它的加载方式;如果首屏主图很晚才发起请求,就检查它是否被错误地延迟加载了。
先列出页面首屏必须出现的图片和样式,确认它们正常加载且预留了尺寸;再给首屏外图片加上延迟加载;最后用开发者工具刷新一次,看首屏内容是否更早出现、滚动时是否还有明显跳动。按这个顺序做,比一次性套用所有优化规则更容易判断每一步的实际效果。