网页加载慢,从网络层面有哪些优化手段?请系统地讲一讲
简化版
网页加载慢,从网络层面优化可以顺着「一次请求的生命周期」逐段下手,抓三条主线:① 减少请求次数和字节数——合并/压缩资源(Gzip/Brotli)、图片用 WebP、按需加载、用浏览器缓存和 HTTP 缓存(强缓存 + 协商缓存)让重复资源不再传;② 减少每次请求的往返和延迟——用 CDN 就近、连接复用(Keep-Alive / HTTP2 多路复用 / HTTP3)、TLS 1.3、DNS 预解析、减少重定向;③ 更快地开始和完成传输——优化 TCP(初始窗口、BBR)、关键资源预加载/预连接、图片懒加载、优先加载首屏关键资源。核心思路就一句:要传的更少、往返更少更短、传得更快。
详细版
优化手段可以按「浏览器拿到一个资源要经过的步骤」逐段梳理:
一、DNS 阶段
- DNS 预解析
<link rel="dns-prefetch">:提前解析将要用到的域名。 - 减少域名数:过多域名 = 过多 DNS 解析 + 过多连接建立。
- 用可靠、就近的 DNS(配合 CDN 智能调度)。
二、建连阶段
- CDN 就近:直接降低 RTT,握手更快。
- 连接复用:Keep-Alive、HTTP/2 多路复用、HTTP/3,避免反复握手和慢启动。
- TLS 优化:TLS 1.3(握手 1 RTT)、会话复用、OCSP Stapling。
- 预连接
<link rel="preconnect">:提前完成 DNS + TCP + TLS,等真正用时直接发请求。 - 减少重定向:每次 301/302 都是一次额外往返。
三、请求/传输阶段
- 减少请求数:合并 CSS/JS(权衡)、雪碧图/字体图标、内联关键小资源。
- 减少字节数:Gzip/Brotli 压缩文本、图片用 WebP/AVIF 并压缩、代码压缩(minify)、去除无用代码。
- HTTP 缓存:强缓存(
Cache-Control/Expires)让资源根本不发请求;协商缓存(ETag/Last-Modified)让未变资源返回 304 不传正文。 - 按需/懒加载:图片、路由、组件懒加载,首屏只加载必要资源。
四、渲染/优先级阶段(网络相关部分)
- 关键资源优先:
preload关键 CSS/字体,首屏关键请求优先。 - 静态资源走 CDN、动态走动态加速(动静分离)。
完整版教学
一、方法论:顺着「一个请求的一生」找优化点
网页加载慢,不要东一榔头西一棒子,最系统的思路是沿着浏览器获取资源的完整链路逐段排查、逐段优化:
DNS 解析 → 建立连接(TCP + TLS)→ 发请求/等响应 → 传输资源 → 渲染
每一段都有延迟和开销。把它们归纳成三条主线,抓住本质:
- 主线一:让要传的东西更少(减少请求数 + 减少字节数)。
- 主线二:让往返更少、更短(减少 RTT 次数 + 降低 RTT 本身)。
- 主线三:让传输开始得更早、跑得更快(预处理 + 传输层优化 + 优先级)。
下面逐段展开。
二、DNS 阶段:别让「找地址」拖后腿
访问任何域名都要先 DNS 解析,解析没缓存时可能耗一个 RTT。优化:
- DNS 预解析:
<link rel="dns-prefetch" href="//img.example.com">让浏览器提前解析后面会用到的域名,等真正请求时地址已就绪。 - 控制域名数量:每个新域名都要独立 DNS 解析 + 独立建连。HTTP/1.1 时代为突破并发限制搞「域名分片」,但 HTTP/2 时代域名越少越好(一条连接复用)。
- CDN 智能 DNS:CDN 的 GSLB 会把你解析到最近的边缘节点,既加速又就近。
三、建连阶段:握手是纯延迟,能省则省
建连是「数据还没传就得先花的钱」,全是 RTT:
- CDN 就近:把 RTT 从上百毫秒降到几毫秒,握手、慢启动、请求响应全都跟着变快,性价比最高。
- 连接复用:
Keep-Alive长连接、HTTP/2 多路复用(一条连接并发所有请求)、HTTP/3(QUIC),避免每个资源都重新握手 + 重新慢启动。 - TLS 优化:升级 TLS 1.3(完整握手仅 1 RTT)、开启会话复用(重连跳过完整握手)、OCSP Stapling(避免验证证书吊销状态时的额外请求)。
- 预连接:
<link rel="preconnect" href="https://img.example.com">让浏览器提前把 DNS + TCP + TLS 都做完,真正请求时直接发数据。 - 消灭多余重定向:每个 301/302 都是一次额外的完整往返,尤其
http→https、www跳转要尽量用 HSTS、直接配置减少跳转。
四、传输阶段之「减少字节数」:压缩是性价比之王
传得慢,很多时候是东西太大。压缩几乎零成本、收益巨大:
- 文本压缩:对 HTML/CSS/JS/JSON 开启 Gzip 或 Brotli(Brotli 压缩率更高),文本体积常能压到 1/3 甚至更小。
- 图片优化:图片通常是页面最大的流量项。用 WebP / AVIF 替代 JPG/PNG,合理压缩质量、按显示尺寸提供合适分辨率(响应式图片
srcset)。 - 代码精简:JS/CSS minify(去空格注释)、Tree Shaking(删无用代码)、按路由/组件代码分割。
- 精简 Cookie/请求头:过大的 Cookie 会加重每个请求,静态资源域名可设为无 Cookie。
五、传输阶段之「减少请求数」
每个请求都有固定开销(连接、头部、往返)。减少请求数:
- 合并资源:合并小的 CSS/JS 文件(HTTP/2 下多路复用后这条收益变小,需权衡,避免破坏缓存粒度)。
- 雪碧图 / 字体图标 / SVG:把很多小图标合成一张或用矢量图标,减少小图请求。
- 内联关键小资源:把首屏关键的极小 CSS/JS 内联进 HTML,省一次请求(但会牺牲缓存,只对关键小资源用)。
六、HTTP 缓存:让「重复的资源根本不再传」
缓存是网络优化里收益最大的一类——命中缓存意味着零请求或零正文传输:
- 强缓存(
Cache-Control: max-age/Expires):在有效期内,浏览器直接用本地缓存,根本不发请求。适合带版本号/哈希指纹的静态资源(app.a1b2c3.js),可设很长的max-age+immutable。 - 协商缓存(
ETag/Last-Modified):缓存过期后,浏览器带If-None-Match/If-Modified-Since询问,若资源没变,服务器返回 304 Not Modified(不传正文,只传个头),仍然很省。 - 策略搭配:静态资源用「文件名带哈希 + 长强缓存」,内容变了文件名就变、自然更新;HTML 入口用协商缓存或短强缓存保证能拿到最新版本。
七、传输层与优先级:更快地开始和完成
- 抬高慢启动起点:合理的初始拥塞窗口(IW10),让小资源少受慢启动拖累。
- 更好的拥塞控制:跨国/弱网链路用 BBR,比 CUBIC 更能跑满带宽、更抗随机丢包。
- 资源优先级 / 预加载:
<link rel="preload">提前加载首屏关键 CSS、字体、关键脚本;给关键请求高优先级,非关键资源懒加载(图片loading="lazy"、路由/组件按需加载)。 - 动静分离:静态资源走 CDN 缓存,动态接口走动态加速(优化回源链路)。
八、排查先行:先量再优化
优化前要先定位瓶颈,别凭感觉:
- 浏览器 DevTools 的 Network / 瀑布图:看每个请求的 DNS、连接、TLS、等待(TTFB)、下载各占多少,找出最慢的段和最大的资源。
- 性能指标:关注 TTFB(首字节时间)、LCP(最大内容绘制) 等,判断慢在建连、后端处理,还是资源太大。
- 对症下药:TTFB 高 → 优化后端 / CDN / 建连;资源下载慢 → 压缩、缓存、减体积;请求太多 → 合并、懒加载。
记忆点:先用瀑布图找到「慢在哪一段」,再针对那一段用对应手段,比盲目堆优化有效得多。
九、常见误区与追问
| 考点 | 正确口径 |
|---|---|
| 网络层 | DNS、TCP/TLS、连接复用、CDN |
| 资源层 | 压缩、缓存、懒加载、按需拆包 |
| 渲染层 | 关键 CSS、减少阻塞 JS、优化 LCP/CLS |
critical path:
DNS -> TCP -> TLS -> request HTML
parse HTML -> discover CSS/JS/images
CSS/JS blocking can delay render
LCP image should be prioritized
Web 加载优化要按关键路径切:先让关键资源更早、更少、更近,再减少阻塞渲染。
- 误区:只压缩图片就算性能优化。 图片重要,但 DNS、缓存、JS 阻塞、字体、接口和渲染同样影响体验。
- 误区:资源合并一定最好。 HTTP/2/3 下过度合并会影响缓存粒度和按需加载。
- 误区:首屏快只看 DOMContentLoaded。 用户更关心 LCP、可交互和视觉稳定,DOMContentLoaded 不能代表完整体验。
- 追问:CDN 对加载有什么帮助? 降低静态资源 RTT,提高缓存命中,减少源站和跨地域访问成本。
- 追问:preload 和 prefetch 区别? preload 提前加载当前页面关键资源,prefetch 预取未来可能用到的资源。
- 追问:如何优化 LCP 图片? 使用合适尺寸和格式、提高优先级、避免懒加载首屏图、走 CDN 和长缓存。
十、加强记忆
网页加载慢的网络优化,沿「DNS → 建连 → 请求传输 → 渲染」逐段做,归成三条主线:① 传得更少——压缩(Gzip/Brotli)、图片 WebP、减请求数、按需加载,尤其HTTP 缓存(强缓存零请求 + 协商缓存 304 不传正文);② 往返更少更短——CDN 就近降 RTT、连接复用(HTTP2/3)、TLS1.3、preconnect/dns-prefetch、减重定向;③ 开始更早跑得更快——preload 关键资源、懒加载非关键、初始窗口 + BBR、动静分离。做之前先用 DevTools 瀑布图定位瓶颈。核心一句:要传的更少、往返更少更短、传得更快。