域名分片在HTTP/1.1下有效,因其绕过浏览器同源并发连接数限制(6~8个),通过将资源分配至不同子域(如static1.example.com、static2.example.com),使各子域拥有独立连接池,从而提升并行下载能力。

为什么域名分片在 HTTP/1.1 下有效
HTTP/1.1 不支持多路复用,每个请求独占一个 TCP 连接;浏览器对「同源」(协议+域名+端口)的并发 TCP 连接数硬限制为 6~8 个。这意味着,哪怕你只发 10 个 fetch 或 10 张 <img alt="如何通过HTML的域名分片策略在HTTP/1.1环境下增加浏览器并发请求数" >,如果都指向 https://api.example.com,第 7 个起就会排队等待。而换成 https://api1.example.com、https://api2.example.com 等不同子域后,浏览器视为不同源,各自拥有独立的 6 连接池——总量翻倍甚至更高。
子域名分片的实操要点
不是随便加个前缀就管用,必须满足以下条件:
- DNS 必须能正确解析所有子域名(如
static1.example.com、static2.example.com指向同一 CDN IP) - TLS 证书需覆盖全部子域名(推荐使用通配符证书
*.example.com,否则 Safari / iOS 会拒绝连接) - 避免 Cookie 泄漏:子域名若设了
Domain=example.com的 Cookie,请求会自动带上,增大请求头、拖慢传输;应让静态资源域名完全无 Cookie(如用cdn.example.com而非static.example.com) - 分片数量不宜过多:Chrome 对单个页面的总 socket 数也有上限(约 256),太多子域反而触发系统级限制;3~5 个是平衡点
HTML 中怎么写才真正生效
光改域名不够,标签写法影响解析和复用:
-
<link rel="dns-prefetch" href="//static1.example.com">和<link rel="dns-prefetch" href="//static2.example.com">放在里,提前触发 DNS 解析,减少首次请求延迟 - 图片资源分散写:
<img src="https://static1.example.com/a.jpg" alt="如何通过HTML的域名分片策略在HTTP/1.1环境下增加浏览器并发请求数" >、<img src="https://static2.example.com/b.jpg" alt="如何通过HTML的域名分片策略在HTTP/1.1环境下增加浏览器并发请求数" >,不要用 JS 动态拼接 URL 后再插入,否则错过预加载时机 - CSS/JS 同理:把
main.css拆到https://static1.example.com/main.css,vendor.js放到https://static2.example.com/vendor.js - 禁止跨子域共享
localStorage或IndexedDB名称冲突——它们仍按完整域名隔离,但逻辑上容易误判
HTTP/2 环境下它反而可能有害
HTTP/2 原生支持多路复用,单个连接就能并发处理几十个请求;此时启用域名分片,不仅失去复用优势,还会额外增加 TLS 握手、TCP 慢启动、DNS 查询开销。判断是否启用分片前,先确认服务端是否已开启 HTTP/2(用 Chrome DevTools 的 Network 标签页看 Protocol 列);若已是 h2,分片应停用。真正的兼容做法是:服务端通过 ALPN 协商支持 HTTP/2,前端保持单域名,仅对老旧 HTTP/1.1 客户端(如部分企业内网 IE)做 fallback 分片。
立即学习“前端免费学习笔记(深入)”;



















