加载速度慢这个问题,很多站长不是不知道,而是不知道从哪下手。测完速度看到一堆红叉,不清楚该先修哪个;改了几处感觉没什么变化;找开发说优化,对方报了个价,自己也判断不了值不值。
这篇文章从测速工具怎么用、数据怎么读,到具体该动哪行代码,都会讲到。每一步都有依据,不说废话。
速度慢,影响的不只是用户体验
很多人觉得加载慢无非是用户等得久,体验差点。但谷歌已经把页面加载速度相关的技术指标纳入排名算法,核心是三个:
LCP(Largest Contentful Paint):最大内容渲染时间,衡量主内容出现的速度,理想值 ≤ 2.5秒
INP(Interaction to Next Paint):交互响应延迟,衡量页面对用户操作的反应速度,理想值 ≤ 200毫秒
CLS(Cumulative Layout Shift):累计布局偏移,衡量页面元素有没有乱跳,理想值 ≤ 0.1
这三个数字不达标,内容质量再好,排名也会被拖累。而且谷歌用的是真实用户数据来评估,不是你自己测一次模拟数据就算。
第一步:测速——工具怎么用,数据怎么读
谷歌官方测速工具
这个工具直接调用 Lighthouse 引擎,同时叠加真实用户数据(如果你的站有足够访问量)。
进去之后会看到两块数据:
"实际情况" 这块是真实用户数据,对应 Core Web Vitals。颜色是判断标准:绿色达标、橙色需要改进、红色较差。这一块是最重要的,因为这才是谷歌实际拿去参考排名的数据。
"诊断" 这块是模拟测试,会给出具体优化建议,比如"消除阻塞渲染的资源"、"适当调整图片大小",每条建议旁边会显示预估能节省多少时间。按这个时间排序,优先处理节省最多的那几项。
一个容易忽略的点:工具默认模拟的是移动端慢速网络环境。如果你的桌面端没问题但移动端分数低,不是工具有问题,是移动端确实有问题要修。
瀑布图工具
除了官方工具,还需要一类能看资源加载瀑布图的工具。
瀑布图会完整呈现每个资源加载的时序:哪个文件加载最慢、哪个文件在等其他资源加载完才开始、哪个第三方脚本把整体时间拖长了。
看瀑布图重点关注两件事:
有没有特别长的单条(单个资源加载时间过长)
有没有很长的"等待"阶段(服务器响应慢,或者资源依赖链太长)
Chrome 开发者工具
F12 打开,切到 Network 标签。
勾选 Disable cache,刷新页面。按 Size 排序,找最大的文件;按 Time 排序,找加载最慢的请求。
Performance 标签可以录制页面加载过程,能精确看到 LCP 是哪个元素触发的——这在后面优化 LCP 时很关键。
第二步:图片优化——通常是影响最大的单项
大多数网站速度差,图片是头号原因。原因也直接:很多人把相机直出的照片或者设计稿直接上传,几 MB 一张,加载能不慢吗。
格式选择
现在的主流做法是用 WebP 格式。同等画质下,WebP 比 JPEG 体积小 25-35%,比 PNG 小更多。
html

更激进一点可以用 AVIF 格式,压缩率比 WebP 再高约 20%,但旧版浏览器支持不完整,同样用
html

尺寸压缩
上传之前先在本地压一遍。一个实际经验:一张展示宽度 1200px 的图,上传 1200px 宽就够了。很多人上传原图(3000px 以上),CSS 里限制宽度 1200px,但浏览器仍然要下载那张大图,白白多传了几倍数据。
响应式图片
不同设备给不同尺寸的图,才是彻底的解决方案:
html
src="http://image.uc.cn/s/uae/g/1y/image-800.jpg"
srcset="image-400.jpg 400w, image-800.jpg 800w, image-1200.jpg 1200w"
sizes="(max-width: 600px) 400px, (max-width: 1000px) 800px, 1200px"
alt="描述文字"
>
这段代码的逻辑:屏幕宽度小于 600px 用 400w 的图,600-1000px 用 800w 的图,更大的屏用 1200w 的图。浏览器自动选合适的版本下载,不会浪费流量。
懒加载
视口以外的图片不需要第一时间加载,加一个属性就行:
html

重要提醒:首屏可见的图片不要加 loading="lazy",会反向影响 LCP 指标。这个属性只给折叠线以下的图片用。
第三步:LCP 优化——这个指标最直接影响排名
LCP 指的是页面最大的内容元素(通常是首屏主图或者大标题文字)渲染完成的时间。
找出你的 LCP 元素
用 Chrome DevTools 的 Performance 面板录制页面加载,在结果里找 LCP 标记,点开就能看到是哪个元素在触发 LCP。
给 LCP 图片加 fetchpriority
如果 LCP 元素是图片,加这个属性告诉浏览器优先加载它:
html

效果非常明显,很多站加了这一行,LCP 就能改善 0.5 秒以上。
预加载关键资源
对于 LCP 图片,在 里加 preload:
html
如果 LCP 是文字,通常是字体加载慢导致文字渲染延迟,同样可以 preload 字体:
html
服务器响应时间(TTFB)
TTFB 是浏览器发出请求到服务器返回第一个字节的时间。如果这个数字超过 600ms,LCP 再怎么优化也有天花板。
常见原因和处理方式:
没开缓存:给静态资源和页面设置合理的 Cache-Control 头
服务器节点离用户远:目标用户在亚洲,服务器在美国,换节点或用 CDN
数据库查询慢:动态网站常见,查慢查询日志,加索引或缓存查询结果
第四步:处理阻塞渲染的资源
测速报告经常出现"消除阻塞渲染的资源"这条警告。意思是页面里有些 CSS 或 JavaScript,浏览器在加载它们的时候会暂停渲染,用户看到的就是白屏等待。
CSS 的处理
CSS 默认阻塞渲染,因为浏览器必须先知道样式才能渲染页面。但如果把所有样式塞一个大文件里,很多首屏用不到的样式也会阻塞渲染。
处理方法是提取关键 CSS:把首屏必须的样式内联进 HTML 的 ,其余 CSS 异步加载:
html
JavaScript 的处理
JS 文件加 defer 或 async 属性,避免阻塞 HTML 解析:
html
区别记忆:defer 适合自己的业务代码(需要 DOM 准备好才能运行),async 适合第三方统计、广告等独立脚本。
对于大型 JS 应用,还需要考虑代码分割:不把所有 JS 打包成一个文件,按路由或功能拆分,用到哪块才加载哪块。这个需要配合 Webpack 或 Vite 等构建工具来实现。
第五步:字体优化
自定义字体是很多站点被忽视的速度杀手。
用 font-display: swap
css
@font-face {
font-family: 'MyFont';
src: url('myfont.woff2') format('woff2');
font-display: swap;
}
font-display: swap 的意思:字体没加载好之前,先用系统备用字体渲染文字,字体到了再切换。这样用户至少能先看到内容,而不是对着空白等字体文件下载完。
只加载需要的字符子集
如果是中文字体,这一点尤其重要——完整中文字体文件动辄几 MB,按需子集化之后能降到几十 KB。可以用 Fonttools 的 pyftsubset 命令裁剪,只保留用到的字符集。
预连接到字体域
如果字体托管在外部域名(比如谷歌字体服务),提前建立连接能减少等待:
html
第六步:第三方脚本的影响
这个问题技术团队容易忽视,但运营和投放会不断往页面里加各种 Tag:统计脚本、转化追踪、客服插件、热力图工具……
每个脚本都需要 DNS 查询、建立连接、下载执行。几个脚本叠在一起,INP 很容易就超标了,而且页面越来越卡,用户交互反应越来越迟钝。
实际可操作的处理方式:
用标签管理器统一管理:把所有第三方脚本集中通过一个入口加载,方便审计和控制,不然各个部门各自往代码里加,最后根本搞不清楚页面上跑了多少个脚本。
定期审计:每季度清一次,确认还在用的才保留。很多脚本是某个活动结束了,但代码没人删,一直在页面上跑。
推迟非关键脚本:客服弹窗、热力图这类脚本,可以设置成用户有交互行为后再加载,而不是页面一开始就加载:
javascript
document.addEventListener('DOMContentLoaded', function {
function loadNonCriticalScripts {
var script = document.createElement('script');
script.src = 'https://example.com/chat-widget.js';
document.body.appendChild(script);
}
window.addEventListener('scroll', loadNonCriticalScripts, { once: true });
window.addEventListener('mousemove', loadNonCriticalScripts, { once: true });
window.addEventListener('touchstart', loadNonCriticalScripts, { once: true });
});
用户滚动、移动鼠标或触摸屏幕,才触发加载。首屏的性能数据完全不受影响。
第七步:服务端和缓存配置
前面说的都是前端改动,但服务器和缓存没配好,前端优化的效果会大打折扣。
开启 Brotli / Gzip 压缩
文本资源(HTML、CSS、JS)在传输前可以压缩。Brotli 压缩率比 Gzip 高 15-20%,优先开 Brotli,旧客户端降级用 Gzip。
Nginx 配置示例:
nginx
# Brotli 压缩(需要安装 ngx_brotli 模块)
brotli on;
brotli_comp_level 6;
brotli_types text/html text/css application/javascript application/json;
# Gzip 作为降级方案
gzip on;
gzip_comp_level 5;
gzip_types text/html text/css application/javascript application/json;
设置合理的缓存策略
nginx
# 静态资源长期缓存(文件名包含 hash 时安全)
expires 1y;
add_header Cache-Control "public, immutable";
}
# HTML 文件不缓存或短期缓存
location ~* \.html$ {
expires -1;
add_header Cache-Control "no-cache";
}
关键逻辑:带内容哈希的静态资源(比如 app.a3f9c2.js)可以设超长缓存,文件内容变了文件名也跟着变,不会有缓存失效问题;HTML 文件则不缓存,或设置 no-cache(仍然缓存但每次去服务器验证是否有更新)。
优化优先级怎么排
改动项太多,不知道先做哪个。按投入产出比排一下:
图片压缩和格式转换 — 改动最小,效果最明显,第一个搞
LCP 图片加 fetchpriority — 一行代码,改善立竿见影
JS 加 defer / async — 低风险,效果显著
开启服务器压缩(Brotli/Gzip) — 服务端一次性配置,永久生效
字体优化 — 用了自定义字体的站必须处理
关键 CSS 内联 — 稍微复杂,但 LCP 改善明显
第三方脚本审计和延迟加载 — 需要跨部门协调,但对 INP 影响最大
最后说一句
速度优化不是做一次就完事。谷歌的 Core Web Vitals 数据是滚动 28 天的真实用户数据,今天改完明天不会立刻反映在测速报告里。
建议改动上线后,用 Google Search Console 的"核心网页指标"报告追踪变化,通常 2-4 周能看到趋势。把速度优化当成一个持续迭代的工程,而不是一次性任务。
Powered by 中欧全站版app官方入口 RSS地图 HTML地图
Copyright Powered by365建站 © 2013-2024