域名分片真的还能提升图片加载速度吗?

长孙景岩 阅读 4

我最近在优化一个老项目,听说以前用域名分片能绕过浏览器并发限制,就试着把静态资源拆到 cdn1、cdn2 两个子域下。但实际测下来发现首屏图片加载反而更慢了,是不是现在 HTTP/2 普及之后这招已经失效了?

我写了个简单的预加载函数,代码如下:

const domains = ['https://cdn1.example.com', 'https://cdn2.example.com'];
function getCDNUrl(path) {
  const idx = Math.floor(Math.random() * domains.length);
  return domains[idx] + path;
}
// 使用示例
const img = new Image();
img.src = getCDNUrl('/assets/banner.jpg');
我来解答 赞 0 收藏
二维码
手机扫码查看
1 条解答
 ___翼杨
兄弟,你的感觉是对的,域名分片这招在HTTP/2时代确实有点过时了,甚至有时候会帮倒忙。

首先说说为什么你的方案反而变慢了。你每次加载图片都随机选一个CDN域名,这意味着浏览器需要频繁解析不同的域名、建立新的连接。DNS解析、TCP握手、TLS握手这些都是有延迟的,特别是首次访问时。你拆成两个域名,相当于把本来可以复用的连接给浪费了。

HTTP/2的多路复用了解一下?它允许在单个TCP连接上并行传输多个请求和响应,根本不需要开那么多域名来绕过并发限制。相反,域名越多,握手开销越大,首屏反而更慢。

如果你想优化图片加载,我给你几个更实用的建议:

预连接可以加上,让浏览器提前建立连接:

// 在HTML的head里加上
<link rel="preconnect" href="https://cdn1.example.com">
<link rel="preconnect" href="https://cdn2.example.com">


另外,现在很多CDN都支持HTTP/2了,你完全可以用单一域名,CDN会自动帮你处理并发。如果你的图片比较多,可以考虑用CSS Sprites或者把多张小图拼成一张大图一次请求,这也是HTTP/2下的常见优化思路。

还有啊,如果你用的是现代浏览器,预加载关键图片也很管用:

<link rel="preload" as="image" href="https://cdn.example.com/assets/banner.jpg">


总的来说,域名分片是HTTP/1.1时代的产物,现在HTTP/2普及后,更推荐的做法是统一域名 + 启用HTTP/2 + 做好资源预加载。希望能帮到你!
点赞
2026-03-13 19:00