最近给项目做了域名分片优化,把静态资源分到三个子域名加载,结果发现图片和JS文件加载时间比之前更久了,这是为什么啊?
之前都是用主域名加载资源,现在改成
、script src="cdn2.example.com/b.js"这种格式。我测试过DNS没问题,三个域名都能正常解析,但Chrome开发者工具里看到资源加载排队更严重了。
我尝试把分片数量减少到两个,或者把CSS和JS分开,但效果没变化。甚至发现某个图片在新域名的加载时间比主域名多了200ms…
这是不是分片策略有问题?还是说还有其他隐藏的限制没考虑到?
虽然理论上分域名能突破浏览器对单域名的并发请求数限制(一般是6个),但前提是这些域名的连接能快速建立。你现在多了200ms延迟,大概率是每次请求都走完整TCP + TLS握手,反而得不偿失。
先说结论:
如果你的静态资源不多(比如总共不到20个文件),或者用户访问频次低、DNS缓存没打满,分片只会增加开销,不会提升速度。
几个关键点你必须检查:
1. 确认CDN域名是否启用了长连接和HTTP/2
每个新域名如果走HTTPS且没复用连接,一次完整握手要多花1~2个RTT(差不多就是你看到的200ms)。
解决方法:确保 cdn1.example.com、cdn2.example.com 都开启 HTTP/2 并支持 TCP Keep-Alive。这样多个资源可以复用同一个连接。
2. 预解析DNS,减少查找时间
在页面头部加上:
这能让浏览器提前做DNS解析,省下几十毫秒。
3. 别乱分片,按资源类型切更合理
你把JS图片全打散到三个域名,结果每个域名只加载几个文件,连接利用率极低。
正确做法:一个域名放JS/CSS,另一个放图片/WebFont,第三个备用。比如:
- static.example.com → JS/CSS
- img.example.com → 图片
- font.example.com → 字体
4. 测试真实用户数据,别只看DevTools快照
DevTools里的“排队”可能是当前页面首次加载的表现,不代表长期有效。你应该用 Performance API 统计一段时间内的
responseEnd - fetchStart,看均值变化。最后给你个实际有效的配置参考:
总结一下:
域名分片不是银弹,只有在高并发资源请求场景下才有效。你现在的问题是连接成本压倒了并发收益。先把 preconnect + HTTP/2 + 合理分组做了,再测一次。
否则不如直接用单一CDN域名 + HTTP/2,效果更稳。