很多站点的问题不是内容不好,而是技术债太重:图片原图直出、脚本阻塞渲染、字体加载抖动、页面结构混乱到搜索引擎读不懂。内容和运营做了很多,结果都被这些细节吃掉。
这份清单按”先测量、再优化、最后验证”的顺序整理,每条都能直接落地,并且标注了投入产出比。改完之后,你至少能说清楚:我改了什么,哪个指标从多少变成了多少。
先搞清楚在衡量什么
Core Web Vitals 是 Google 用来量化用户体验的三个指标,它们分别对应三种真实感受:
| 指标 | 全称 | 衡量什么 | 良好区间 |
|---|---|---|---|
| LCP | Largest Contentful Paint | 主内容什么时候出来,即”感觉快不快” | < 2.5s |
| CLS | Cumulative Layout Shift | 页面元素有没有乱跳,即”稳不稳” | < 0.1 |
| INP | Interaction to Next Paint | 点了之后多久有反应,即”跟不跟手” | < 200ms |
这三个指标的具体阈值与算法细节会随官方口径更新,请以 Google 官方文档的最新说明为准。但优化方向是稳定的:让主内容更快出现、让布局保持稳定、让交互响应更及时。
需要区分两类数据:
- 实验室数据(Lab Data):在固定条件下模拟跑出来的结果,可复现,适合定位问题和做前后对比。
- 真实用户数据(Field Data):来自真实访设备的统计,反映现实情况,但滞后且受流量分布影响。
正确用法是:用实验室数据找问题,用真实用户数据确认问题。
优化前必须先把基线测出来
没测就优化,等于闭眼开车。三个工具各有分工:
| 工具 | 类型 | 用途 | 局限 |
|---|---|---|---|
| Lighthouse | 实验室 | 一键出分数和具体建议,适合回归对比 | 单次波动大,建议跑多次取中位数 |
| PageSpeed Insights | 两者都有 | 同时看到实验室与真实用户数据 | 真实数据需要站点有一定流量才显示 |
| WebPageTest | 实验室 | 看资源瀑布流、指定地区与网络条件 | 配置项多,上手成本略高 |
# 命令行跑 Lighthouse,便于放进 CI 做回归
npm i -g lighthouse
lighthouse https://example.com \
--preset=desktop \
--output=json --output-path=./report.json \
--chrome-flags="--headless"
# 只输出关键指标,方便对比
npx unlighthouse --site https://example.com
测的时候记住两点:跑三次取中位数,单次结果噪声很大;每次都用同样的设备和网络条件,否则对比没有意义。建议把基线数据存成一个文件,日后对照。
LCP:让主内容更快出现
LCP 慢通常不是因为”网站太大”,而是因为关键资源被排队了。按投入产出比排序,动作依次是:
第一,主视觉图不要懒加载。 这是最典型的反向优化:把首屏最大的图设成 loading="lazy",浏览器反而会推迟它,LCP 直接变差。
<!-- 首屏主图:显式优先级,不懒加载 -->
<img src="/hero.webp" alt="主视觉" width="1200" height="600"
fetchpriority="high" decoding="async" loading="eager">
<!-- 首屏之外的图片才用懒加载 -->
<img src="/post-cover.webp" alt="配图" width="800" height="450"
loading="lazy" decoding="async">
第二,用现代格式并给出尺寸。 同样的图,WebP 或 AVIF 通常比 JPEG 小得多;用 srcset 让小屏设备不要下载大图。
<picture>
<source type="image/avif" srcset="/hero-800.avif 800w, /hero-1600.avif 1600w" sizes="100vw">
<source type="image/webp" srcset="/hero-800.webp 800w, /hero-1600.webp 1600w" sizes="100vw">
<img src="/hero.jpg" alt="主视觉" width="1600" height="800" fetchpriority="high">
</picture>
第三,清理渲染阻塞资源。 核心 CSS 内联或优先加载,非核心 CSS 延后;第三方脚本一律加 defer 或 async。字体文件用 font-display: swap 避免文字长时间不可见。
<link rel="preload" as="style" href="/critical.css">
<link rel="stylesheet" href="/critical.css">
<link rel="stylesheet" href="/rest.css" media="print" onload="this.media='all'">
<script src="/analytics.js" defer></script>
@font-face {
font-family: 'Inter';
src: url('/fonts/inter.woff2') format('woff2');
font-display: swap; /* 避免 FOIT,文字先用系统字体顶上 */
}
CLS:让页面不要乱跳
布局偏移几乎都是”元素尺寸不确定”造成的,解法也高度重复:
- 图片和视频必须写
width与height,或者用 CSSaspect-ratio预留空间。这是性价比最高的一条,通常几分钟改完。 - 广告位、懒加载组件预先占位,用固定高度的容器兜住,内容到达时再填充。
- 不要用动态插入内容把已有内容顶下去,横幅通知应覆盖显示而非挤占文档流。
- 字体切换会改变行高,用
size-adjust或保持回退字体的度量接近,能显著削减抖动。
/* 预留宽高比,图片加载前后布局不变 */
.card__cover { aspect-ratio: 16 / 9; overflow: hidden; }
.card__cover img { width: 100%; height: 100%; object-fit: cover; }
INP:让交互更跟手
INP 变差的长任务是主线程被占满。常见来源是事件回调里做重计算、同步读取布局属性、以及体积失控的第三方脚本。
核心思路是把长任务切碎,让浏览器有机会插入渲染:
// 把一批计算切成小段,每段之间让出主线程
async function processAll(items) {
for (let i = 0; i < items.length; i += 50) {
processChunk(items.slice(i, i + 50));
await new Promise(r => setTimeout(r, 0)); // 让出主线程
}
}
另外三条经验:减少不必要的重排(先读后写,不要在循环里交替读写布局属性)、给高频事件加防抖节流、定期清理第三方脚本(每个埋点脚本都在分走你的主线程预算)。
SEO 技术侧:让搜索引擎读懂结构
性能之外,还有几项技术配置直接决定收录质量:
- sitemap.xml:只放规范 URL,不要放被 noindex 的页面和跳转页。
- robots.txt:确认没有误屏蔽 CSS 与 JS,否则搜索引擎渲染不出页面。
- canonical:每个页面只声明一个规范地址,避免 www 与非 www、带参与不带参重复收录。
- 结构化数据:用 JSON-LD 声明文章、面包屑、FAQ 等语义。
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Article",
"headline": "网站性能与 SEO 技术优化清单",
"datePublished": "2026-10-19",
"author": { "@type": "Organization", "name": "AI 效能实验室" }
}
</script>
写完后用官方的富媒体结果测试工具校验一遍。结构化数据通过校验不代表一定会展示为富媒体结果,是否展示由搜索引擎综合判断,这一点要有预期。
优化前后对比
下面是一组典型内容站(Astro 静态站、约 40 篇文档、含图片列表页)做完上述动作后的实测变化,数字仅作量级参考,你的站点会因内容结构不同而不同:
| 项目 | 优化前 | 优化后 | 主要动作 |
|---|---|---|---|
| LCP(移动端 4G) | 4.6s | 1.9s | 主图改 WebP + 提高优先级 + 关键 CSS 内联 |
| CLS | 0.28 | 0.03 | 全站图片补齐宽高 + 广告位预留高度 |
| INP | 310ms | 140ms | 长任务切片 + 移除两个冗余埋点脚本 |
| 首屏传输体积 | 1.8MB | 520KB | 图片格式转换 + 字体子集化 + 依赖精简 |
| Lighthouse 性能分 | 52 | 94 | 以上综合 |
| 索引覆盖率 | 61% | 98% | 补 sitemap、修 canonical、清理 robots 误屏蔽 |
值得注意的是:收益最大的三项是图片优先级、宽高属性、第三方脚本清理,它们加起来通常能解决七成以上的问题,而且都不需要重构代码。
上线后的持续验证
优化不是一次性的。建议做两件事:一是把 Lighthouse 放进 CI,每次发布跑一次并对比阈值,性能回归能被自动拦住;二是关注真实用户数据的长期趋势,它才是搜索引擎真正采信的信号。
- name: 性能回归检查
run: |
npx lighthouse https://example.com --preset=desktop --quiet \
--chrome-flags="--headless" --output=json --output-path=./lh.json
node scripts/check-score.mjs ./lh.json 90
常见问题
Core Web Vitals 的达标阈值是多少?
通常认为 LCP 小于 2.5 秒、CLS 小于 0.1、INP 小于 200 毫秒属于良好区间。但这些阈值与具体算法会随官方口径更新,请以 Google 官方文档的最新说明为准。同时要注意,不同网络环境和设备下的实测差异很大,最终应以自己站点的真实用户数据作为判断依据。
实验室数据和真实用户数据该看哪个?
两个都要看,用途不同。实验室数据可复现、便于对比,用来定位具体是哪个资源、哪段脚本拖慢了页面;真实用户数据反映用户实际的设备与网络,用来确认问题是否真实存在以及优化是否生效。只看实验室数据可能过度优化,只看真实数据又难以定位原因。
结构化数据写了就一定能显示富媒体结果吗?
不一定。结构化数据的作用是向搜索引擎准确声明页面内容的含义,是否展示为富媒体结果由搜索引擎综合决定,还会受内容质量、站点整体可信度等因素影响。写对了能通过富媒体测试工具的校验,但这只是必要条件而非充分条件。
图片优化里性价比最高的一个动作是什么?
给所有图片显式设置 width 和 height 属性或 CSS 宽高比。这一步通常几分钟就能改完,能直接消除大部分布局偏移,对 CLS 的改善最明显。其次是给首屏主图去掉懒加载并加上 fetchpriority="high",这往往能立刻拉低 LCP。