对于chrome来说,同域名下资源加载的最大并发连接数为6(源码中写死),当资源文件大于6时,多于6个的文件就会进入待定,等第一批加载完才会加载第二批的6个图片资源,这样就增加了等待时间。http/1有并发限制,http/2没有。
那么为什么chrome会做出如此的限制呢?
常见优化手段:
域名散发实现思路:
// 替换域名
function replaceDomain(data) {
let imgUrlObj = localStorage.getItem('imgUrlObj') || {} // 获取本地保存的图片链接,能正常使用缓存
if (typeof(imgUrlObj) === 'string') { // 判断是否为JSON对象,不是则转换
imgUrlObj = JSON.parse(imgUrlObj)
}
let index = Math.floor(Math.random() * 4.99) // 随机0-4的下标
try {
data = JSON.stringify(data)
data = data.replace(/www\.baidu\.com\/image(.*?)(jpg|png|jpeg)/g, (...params) => { // 查找图片的url并对其进行操作
let sourceUrl = params[1] + params[2] // 图片资源名称,未包含域名。如:整条图片链接为:www.baidu.com/image/123.png; 现保存为:/image/123.png
if (!imgUrlObj[sourceUrl]) { // 未保存在本地,则新产生域名
let imgUrl = `node${[1, 2, 3, 4, 5][index % 5]}.baidu.com/image/${sourceUrl}` // 域名替换,如:从 www.baidu.com 替换到 node1.baidu.com,node2.baidu.com
imgUrlObj[sourceUrl] = imgUrl // 同时保存好新的域名,在这就体现了使用JSON对象的好处,图片资源路径名当key值,图片完整链接当value值
localStorage.setItem('imgUrlObj', JSON.stringify(imgUrlObj))
index++
return imgUrl
} else { // 保存到了本地,则直接使用localStorage的url
return imgUrlObj[sourceUrl]
}
})
data = JSON.parse(data)
} catch (e) {
console.log('replaceDomain error')
console.log(e)
}
return data
}