安排图片与资源加载的核心是:让首屏必要的文字和样式优先到达,把图片、字体、脚本等非关键资源延后或按需加载,同时保证图片本身尺寸合理、格式合适、带有可读的替代文本。对第一次接触这个问题的人来说,最关键的一步是先分清“首屏必须出现的内容”和“可以晚一点出现的内容”,再决定谁先加载、谁延后加载。
动手改代码前,先把页面用到的资源列出来,按用途分组:
分组的判断标准很简单:如果这个资源没有加载,用户还能不能读懂首屏的主要内容?能,就归入非关键。这个清单不需要很精确,但必须写下来,否则后面容易把该延后的东西当成必须的。
图片是大多数页面体积最大的部分,安排顺序时优先处理它。
控制图片本身的体积。先按实际显示尺寸导出图片,不要用一张大图靠CSS缩小显示。例如列表页缩略图显示宽度是300像素,就导出接近300像素宽的图,而不是导出2000像素宽再压缩。格式上,照片类内容适合用WebP或AVIF这类现代格式,图标和简单图形可以用SVG。是否使用某种格式,要看目标浏览器是否支持,可以用<picture>提供回退。
首屏图片优先,其余延后。首屏主图可以正常加载,首屏以下的图片使用原生懒加载:给<img>加上loading="lazy"。这样浏览器会在图片接近视口时才请求它。注意首屏图片不要加懒加载,否则可能拖慢第一眼看到的内容。
给图片预留位置。在<img>上写明width和height,或者用CSS的aspect-ratio固定宽高比。这样图片加载完成前页面不会突然跳动,用户阅读和点击都不会被位移打断。
脚本和字体按需处理。非必要的脚本可以加defer或async,让它们不阻塞文字渲染。字体如果只用于少量文字,可以考虑先用系统字体显示,字体文件加载后再替换。第三方嵌入内容(地图、视频、评论组件)可以用占位图代替,等用户点击或滚动到附近再真正加载。
一个可执行的小例子:假设页面有一张首屏横幅和三张产品图。横幅正常加载并写明宽高;三张产品图加loading="lazy"并写明宽高;页面底部的地图组件先用一张静态占位图,用户点击后再插入真正的地图代码。
改完之后不要凭感觉判断,用浏览器开发者工具核对:
loading="lazy"是否写对位置。判断结果的标准是:首屏内容尽快可见,首屏以下资源不抢占首屏带宽,页面在加载过程中不产生大幅位移。如果某项没达到,回到对应环节调整,不必一次改完所有资源。
图片与资源加载不是一次改完就结束的事。每次新增图片或第三方组件时,按同样的清单判断它属于关键还是非关键,再决定加载方式。可以给自己定一条简单规则:新图片先压缩到接近显示尺寸,首屏以下的默认加懒加载,新脚本默认加defer,除非有明确理由不这么做。
定期抽查几个主要页面,用开发者工具看一遍资源请求,重点看有没有新加入的大图或阻塞脚本。这样能避免页面在多次改动后慢慢变重。
下一步:挑一个你负责的页面,用开发者工具的网络面板刷新一次,记录首屏出现前加载了哪些图片和脚本,再按上面的清单把其中一项改为延后加载,然后对比改动前后的请求顺序。