一、那天下午的两点四十
2026 年 4 月 18 日,星期六,下午两点四十。我坐在朋友陈禾的出租屋里,她要把一份培训材料里的图例全部换成清晰版本,于是打开那个资料库页面。 她用的是 2019 款 MacBook Air,Chrome 版本 124,家里宽带 300M。页面地址栏在转,首屏骨架先出来,然后是灰色的方格——十一秒之后,第一排缩略图才陆续亮起来。 她一边等一边把鼠标滚轮往下滚,滚到第三屏时,灰格不再变成图,而是变成一个小小的破图图标。她转过头跟我说了一句:“每次都是第三屏,不是网的问题。”
这句话我记了整整三天。
我之所以愿意花时间写这一篇,是因为“加载缓慢”这四个字在大多数文章里被当成一个笼统的现象,然后迅速配上一份通用清单:清缓存、换浏览器、升级带宽、关闭插件。 但那天我看到的现象并不笼统。首屏能出,说明域名解析和主文档请求没问题;第三屏卡住,说明问题发生在滚动触发之后;破图图标出现,意味着请求本身返回了失败状态,而不是单纯慢。 这三件事指向的方向完全不同,把它们混在一起谈,等于什么都没说。
二、我做的三次复现
第二天上午九点半,我回到自己那台 2021 款 ThinkPad,同样是 Chrome,同样 300M 宽带,开始做对照。第一次我只做一件事:不滚动,静止等待 60 秒。 结果是首屏 4.2 秒全部出现,之后 60 秒内没有任何新图加载——说明它是一个滚动懒加载的实现,滚到哪加载到哪,不存在“预加载失败”这回事。 这个结论让我把精力收窄到了滚动事件和后续请求上。
第二次复现,我故意用键盘 PageDown 一屏一屏往下翻,每翻一屏停 3 秒。这次第三屏的图出来了,但第四屏出现了 6 个破图,且都集中在同一个路径前缀下。
我打开开发者工具的 Network 面板,按状态码排序,看见了 6 个 429。于是问题从“慢”变成了“被限流”。
第三次复现更细:我用慢速 3G 模拟,然后在滚动到第三屏时截图 Network 瀑布流,发现同一时刻有 24 个图片请求并发,其中 18 个的等待时间(TTFB)超过 2 秒,而首屏同样数量的请求 TTFB 都在 400 毫秒以内。
三次复现记录:静止 60 秒无新请求;键盘翻页出现 6 个 429;慢速 3G 下第三屏并发 24 个请求、18 个 TTFB > 2s。
这三个数字,是我后面所有猜想的起点。
三、七个还没验证完的猜想
坦白讲,我至今没有拿到服务端日志,所以下面的东西我只能称为猜想,而不是结论。把它们写下来,是因为我觉得这份“不确定”本身比一个漂亮的答案更有用。第一,滚动懒加载没有设置并发上限,一次触发就把可见区域加上预读余量的全部图片同时发出,这直接解释了 24 个并发。第二,图片请求很可能走的是一个带频次限制的接口,否则解释不了 429 为何只出现在第四屏那个路径前缀下。第三,缩略图没有做尺寸分级,一个 60 像素宽的格子请求的可能是 1200 像素的原始文件,这在慢速网络下会把 TTFB 放大——不过这一条我还没法区分是服务器慢还是文件大。第四,如果资料库本身是动态渲染,DOM 节点随滚动不断追加而旧节点不回收,滚动事件处理函数会越来越重,这个可以用 Performance 面板的 Long Task 验证,我只草草看了一眼,没有认真做。第五,破图后没有重试机制,失败一次就永久占位,用户体验上的“缓慢”有一大半其实是“失败”。第六,浏览器缓存策略看起来偏保守,重复滚动回去的图仍然重新请求,暗示响应头里缓存时间很短或干脆没有。第七,也是最没法验证的一条:这个资料库的图片可能托管在与主站不同的域上,跨域带来的额外握手在慢网下被放大了。
我不认为这七个猜想能凑成一份标准答案,但它们至少把一个大词拆成了七个可以动手查的小问题。
四、如果有人问“怎么解决”,我会先反问
我见过太多把加载问题写成 checklist 的文章,读完之后你唯一能记住的是“多清缓存”。但我自己动手的时候发现,方向比清单重要。 如果你面对的是首屏就慢,那问题多半在主文档、DNS 或服务端渲染;如果是滚到某几屏才慢,那问题在懒加载的触发策略与并发控制;如果是出现破图,那问题在请求失败与重试,和带宽关系不大。 这三种情况对应的处理方式几乎没有交集,所以我会先问:慢在哪一屏,第几秒,网络面板里状态码是什么。
另外有一点我想写在明处:作为使用者,你能做的最有用的事往往不是折腾自己那台机器,而是把 Network 面板的截图发给对方。 我在整理这一篇的时候,顺手把之前记下的两个站内笔记链在了一起——一个是关于恢复原来的49图库5012的操作路径,另一个是49tk图库资料库免费打开云存储教程里提到的缓存命中差异。 这两份笔记都不是答案,但它们提供了两种不同入口下的对照,我把它们放在这里只是为了标明我的思路来源,而不是推荐任何具体做法。
还有一份更早的记录,讲的是在旧版本浏览器里浏览器27049打开网址tpyws6pcqm时出现的加载行为差异。那份记录的结论今天已经不完全适用了,但其中“同一页面在不同渲染内核下懒加载触发的时机不同”这一点,仍然是我第三条猜想的部分依据。 我把它留在这里,是因为我讨厌把旧笔记删掉之后假装自己一开始就想明白了。
五、我的一个偏见
说实话,我认为“资料加载缓慢”这个说法本身就有问题。它把两种完全不同的东西捆在了一个词里:一种是真慢,请求正在路上,只是走得久;另一种是假慢,请求已经失败了,界面还在那里装作在等。 从我三次复现看到的情况,至少有一半时间属于后者,而“清缓存换浏览器”这类建议对后者基本无效,因为它压根不是缓存的事。 我不知道这个判断在更多环境下是否成立,但它至少解释了我看见的现象。
把“慢”和“失败”分开,是我这次唯一确凿的收获。
六、还没想明白的地方
一是并发上限到底应该设多少。我直觉觉得对图片来说 6 到 8 是个合理区间,但这是从别处看来的经验,没有在本例验证。
二是那个 429 的触发阈值,我做了五次尝试,两次复现两次没复现,中间隔着一杯咖啡的时间,这让我怀疑阈值是按时间窗算的,但我拿不到响应头里的限流字段。
三是陈禾少看到的那个破图,我至今没复现出来,也许是她那次网络恰好快了一点,也许是我的操作和她有细微差异。
这些坑我都留着,没有硬填。
写到这里我有一个很清楚的自我认知:我提供的不是一份解决方案,而是一份把问题拆开、并把拆开过程完整摊出来的记录。 对我这种性格的人来说,说“我不知道”比编一个完整答案要难,但编出来的答案对下一个遇到同样问题的人没有用——她需要的是能对上自己 Network 面板的那一行,而不是一句“多清缓存”。 所以如果你在别处看到一份写着“三步解决”的文章,我建议你把它和你的截图放在一起比对,对不上就放下。