LCP 是什么?如何优化 LCP?
简化版
LCP 衡量从导航开始到视口内最大合格图片、文本块或视频封面完成绘制的时间;当前良好标准是至少 75% 页面访问不超过 2.5 秒。优化前先确认真实 LCP 元素,再把时间拆成 TTFB、资源加载延迟、资源加载时长和元素渲染延迟,针对最慢部分处理。
详细版
图片型 LCP 要让资源从初始 HTML 尽早可发现,不设 lazy,输出正确尺寸和格式,必要时用 fetchpriority="high" 或精确 preload。文字型 LCP 则更关注 TTFB、关键 CSS、字体和主线程阻塞。
LCP 可以表示为四段之和:TTFB + resource load delay + resource load duration + element render delay。资源不需要网络请求时,部分分段含义会不同,因此应使用 DevTools、Lighthouse 或 web-vitals attribution 数据观察,而不是套固定百分比。
降低客户端渲染链也很重要:如果主内容必须等 JS 下载、执行、接口返回后才创建,资源发现和绘制都会变晚。SSR/SSG 可提前内容,但仍要控制服务端耗时和水合。
完整版教学
一、LCP 为什么比“页面有一点内容”更接近体验
FCP 可能只是导航图标或一小段文字出现,用户仍没看到主体。LCP 追踪视口内较大的合格内容候选,更接近“主内容何时可见”,但它不等于页面全部加载完成。
当前 Core Web Vitals 按真实页面访问的第 75 百分位评价:LCP ≤2.5s 为良好,>4.0s 为差,中间需要改进。单次本地 1.8 秒不能证明站点通过,必须覆盖设备、网络与页面类型。
记忆钩子:LCP 不是一张图的下载时间,而是“导航开始到最大内容真正画出来”的完整链路。
二、LCP 元素怎样产生并可能发生变化
浏览器在加载过程中会报告当前最大的候选,后出现的更大元素可能替换前者。常见候选包括 <img>、SVG 内 image、视频 poster、CSS URL 背景图和包含文本的块级元素,具体资格受规范与浏览器实现约束。
0.8s 标题成为候选(面积 40k)
1.4s 卡片图成为候选(面积 70k)
2.2s Hero 图绘制(面积 300k) → 最终 LCP
页面模板、视口和登录状态会改变最大元素。监控必须上报元素选择器或资源 URL,不能假设全站 LCP 永远是首页 Hero。
三、把 LCP 拆成四段才能对症下药
对于需要网络资源的图片型 LCP,可按以下分解理解。四项相加得到 LCP,优化重点通常是让两个 delay 段尽量接近零,并缩短实际网络段。
LCP = TTFB
+ resource load delay
+ resource load duration
+ element render delay
| 分段 | 含义 | 常见根因 |
|---|---|---|
| TTFB | 导航到 HTML 首字节 | 重定向、服务端、网络 |
| 加载延迟 | TTFB 后到资源开始 | 发现晚、优先级低 |
| 加载时长 | 资源请求到完成 | 字节大、带宽慢 |
| 渲染延迟 | 资源完成到元素绘制 | CSS、JS、隐藏状态 |
官方给出的比例是诊断指导而非硬预算,不能机械把 2.5 秒乘百分比作为所有页面指标。若总 LCP 已经良好,比例本身并不要求完全一致。
四、图片型 LCP 如何同时优化发现、传输和绘制
首屏图最好直接存在初始 HTML,避免由晚到的脚本插入;不要设置 loading="lazy"。fetchpriority="high" 可提示提高优先级,preload 可提前发现 CSS 背景图,但两者都应少量、准确且与实际请求属性一致。
<img
src="/hero-960.avif"
srcset="/hero-640.avif 640w, /hero-960.avif 960w"
sizes="100vw"
width="960"
height="540"
fetchpriority="high"
alt="主视觉"
/>
假设资源在 1.3 秒才发现、下载 0.5 秒、又等 0.4 秒绘制,LCP 至少 2.2 秒且未计 TTFB 前段。把发现提前 0.7 秒往往比再压缩 10 KB 更有收益,说明不能只盯图片体积。
五、文字型与客户端生成型 LCP 的不同瓶颈
文字 LCP 不一定有独立资源下载,关键 CSS、Web Font 和主线程会决定何时绘制。字体策略要在品牌一致性、FOIT/FOUT 和布局变化间权衡,不能只用 preload 解决一切。
CSR 页面可能经历“HTML → JS → 框架启动 → API → 创建元素”,资源或文本很晚才进入 DOM。SSG/SSR 让主体进入 HTML,可减少发现链;但 SSR TTFB 过高、水合长任务或客户端又隐藏内容,仍会产生渲染延迟。
不理想:HTML → app.js → API → Hero URL → 下载 → 绘制
更直接:HTML(含 Hero URL/文本) → 并行下载与解析 → 绘制
不要为动画把 LCP 元素初始设为 opacity:0,资源完成后再等入场脚本。视觉效果若制造 600ms render delay,就会直接记入用户等待。
六、现场数据、实验室数据与验证闭环
DevTools 和 Lighthouse 能逐次复现、查看 Network 与主线程,适合定位;CrUX 或自建 RUM 呈现真实用户分布,适合判断结果。两类数据环境不同,数值不一致很正常。
| 数据 | 优势 | 局限 |
|---|---|---|
| Lab | 可重复、能看完整 trace | 单设备与固定路径 |
| Field | 真实设备网络和页面访问 | 诊断细节需额外归因 |
优化应按页面模板和设备分组看 P75。若 100 次访问排序后第 75 个值为 2.4 秒,该样本 P75 良好;若第 75 个是 3.2 秒,即使平均值 2.1 秒也未达到良好口径。
上线前后还要保持时间窗口与流量结构可比。营销活动带来大量新地区弱网用户时,指标变化未必全由代码发布造成,需要 release 与上下文归因。
七、常见误区与追问
- 误区:LCP 就是首屏最大图片下载时间。 文本也可成为 LCP,且指标还包含 TTFB、发现和渲染延迟。
- 误区:把 LCP 图片设为 lazy 可以减少首屏竞争。 这会延迟关键资源发现或优先级,通常让 LCP 更差。
- 误区:本地 Lighthouse 一次低于 2.5 秒就达标。 Core Web Vitals 看真实访问的 P75,需要覆盖现场分布。
- 追问:图片已经很小,LCP 为什么仍慢? 它可能发现得晚、优先级低,或下载完成后被 CSS/JS 阻止绘制。
- 追问:fetchpriority 与 preload 能一起用吗? 可以但要避免重复与滥用,确认指向同一实际候选且资源确实关键。
- 追问:SSR 一定改善 LCP 吗? 不一定,慢 TTFB、水合阻塞和资源发现错误都可能抵消收益。
- 追问:怎样知道优化哪一段? 用 LCP 元素归因和四段耗时定位最大贡献,再在对应层验证。
八、加强记忆
记住“找元素、拆四段、消延迟、看 P75”:先确认每个模板真实的 LCP 候选,再用 TTFB、资源加载延迟、加载时长、渲染延迟解释总值;图片型重点早发现、正确优先级与合适字节,文字/CSR 型重点 CSS、字体和主线程;最后必须由现场 P75 而非单次跑分判定成功。