域名分片真的还能提升图片加载速度吗?
我最近在优化一个老项目,听说以前用域名分片能绕过浏览器并发限制,就试着把静态资源拆到 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');
首先说说为什么你的方案反而变慢了。你每次加载图片都随机选一个CDN域名,这意味着浏览器需要频繁解析不同的域名、建立新的连接。DNS解析、TCP握手、TLS握手这些都是有延迟的,特别是首次访问时。你拆成两个域名,相当于把本来可以复用的连接给浪费了。
HTTP/2的多路复用了解一下?它允许在单个TCP连接上并行传输多个请求和响应,根本不需要开那么多域名来绕过并发限制。相反,域名越多,握手开销越大,首屏反而更慢。
如果你想优化图片加载,我给你几个更实用的建议:
预连接可以加上,让浏览器提前建立连接:
另外,现在很多CDN都支持HTTP/2了,你完全可以用单一域名,CDN会自动帮你处理并发。如果你的图片比较多,可以考虑用CSS Sprites或者把多张小图拼成一张大图一次请求,这也是HTTP/2下的常见优化思路。
还有啊,如果你用的是现代浏览器,
预加载关键图片也很管用:总的来说,域名分片是HTTP/1.1时代的产物,现在HTTP/2普及后,更推荐的做法是统一域名 + 启用HTTP/2 + 做好资源预加载。希望能帮到你!