← 返回题目列表

网页加载慢,从网络层面有哪些优化手段?请系统地讲一讲

高频 中等 第 7 / 27 题 更新于 2026/07/28
性能优化首屏HTTP缓存综合

简化版

网页加载慢,从网络层面优化可以顺着「一次请求的生命周期」逐段下手,抓三条主线:① 减少请求次数和字节数——合并/压缩资源(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→httpswww 跳转要尽量用 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 瀑布图定位瓶颈。核心一句:要传的更少、往返更少更短、传得更快。