打开一个网页一页拆成很多份

为什么需要

上一页那个菜谱页,服务器发回的并不是一整张做好的图。浏览器先收到(HTML document):里面有标题、用料和步骤的文字,还写着这一页要用到哪些别的文件,包括决定版式和颜色的样式文件,让收藏按钮能点、让页面能变化的小程序(叫作脚本),以及一张张照片。每一份都要单独发一个请求去取。

真实的网页还要多得多。统计网页规模的 HTTP Archive 测量了 2025 年 7 月的网站首页:请求数的中位数,用电脑打开时约 80 个,用手机打开时约 75 个,即一半的首页比这少、一半比这多;大小的中位数分别是 2.86 MB 和 2.56 MB(MB 读作兆字节,是数据多少的单位,手机流量常说的多少 MB、多少 GB 就是它)。打开一个首页,常常要发出七八十个请求,取回两三兆字节的数据。

怎样做

浏览器先取主文件,读到其中提到的文件,再为每一份发出请求,响应陆续回来。写在页面开头的样式文件会挡住显示:浏览器通常要等这些样式都到了,才把页面画出来,样式慢了,整页都得等;照片可以晚到,到一张补一张。

第二次打开同一页时,浏览器手里多半还有上次存下的文件。服务器可以在响应里写明这份文件能保存多久,例如一周;没写的话,浏览器也可能按经验存一段时间。还在期限之内的,浏览器直接拿来用,不发请求。这些存下的副本叫(browser cache)。你平时在手机里清理的「缓存」,就包括这些副本:它们不是垃圾,而是为了下次更快而存的。

过了期限的副本也不会马上扔掉:浏览器带着手里那份的版本去问。文件没变,服务器就回答 304,它和第 4 页的 301 一样以 3 开头,意思是还要浏览器再做一步,这里是接着用手里那一份,不必再传一遍;文件变了,服务器就发回新的一整份。在下图里打开这一页,再打开「浏览器记住了上次的文件」,比一比两次各发了几个请求。

一页拆成很多份:请求陆续回来,页面等样式到了才显示

先看这里按「下一步」:先取回主文件,再看九个请求发出去、陆续回来。页面草图要等样式到了才显示,照片随后一张张补上。然后打开「浏览器记住了上次的文件」,从头再播一遍。

浏览器记住了上次的文件
发起方
处理

尚未开始,共 2 步

还没开始。按「下一步」打开这一页。

发出的请求(到此刻为止)0个
直接用存下的副本0份
已经到手的文件0 / 10

这一页的 10 份文件

  • 主文件还没请求
  • 样式:版式还没请求
  • 样式:颜色与字体还没请求
  • 脚本:收藏按钮还没请求
  • 照片:成品还没请求
  • 照片:第 1 步还没请求
  • 照片:第 2 步还没请求
  • 照片:第 3 步还没请求
  • 照片:第 4 步还没请求
  • 照片:第 5 步还没请求

代价是什么

文件越多,请求越多,要等的环节也越多;服务器离得远时,每多一轮请求,就多一个来回(第 3 页)。存下的副本又可能过时:照片换了,浏览器手里那份不会自动跟着变,所以服务器要为每份文件设好保存期限,过期了就去问。反过来,清了缓存以后再打开,所有文件都要重新下载,反而更慢。

回顾:一次访问走过的路

  • 查地址:手机把域名交给解析服务器;没查过时它要逐级去问,查到的结果会被记住一段时间(第 2 页)。
  • 出发:请求经过家里的路由器(在这里换成对外地址)和沿途许多路由器,切成数据包一站站转交(第 2、3 页)。
  • 到达:服务器按请求方法和路径找出内容,发回以状态码开头的响应(第 1、4 页)。
  • 回来:响应沿原路回到手机;浏览器读完主文件,再为其中提到的文件发出更多请求,样式到了页面才显示,照片随后补上(第 5 页)。
  • 每一段都要时间:离得远、来回多,等待就成倍增加;超过 1 秒,人的思路就会被打断(第 3 页)。

你在百家菜里点一下「收藏」,手机也是这样发出一个请求,等服务器把结果送回来。页面一直转圈时,就是这一来一回里的某一段还在等。

资料来源

以下资料均于 2026-10-20 访问。

  1. How browsers load websitesMDN Web Docs(Mozilla),2025-10-02
  2. Critical rendering pathMDN Web Docs(Mozilla),2025-02-25
  3. Web Almanac 2025: Page WeightRichard Barret、Jamie Indigo,HTTP Archive,2026-01-15,2026-01-16 更新
  4. HTTP cachingMDN Web Docs(Mozilla),2026-08-14
  5. RFC 9111: HTTP CachingIETF(R. Fielding、M. Nottingham、J. Reschke),2022-06