задний план
Взяв в качестве примера браузер Chrome, максимальное количество одновременных подключений для загрузки ресурсов под одним и тем же доменным именем равно 6. Если файл ресурсов больше 6, файлы с более чем 6 файлами будут ожидать обработки, и будет отправлен второй пакет. загружаться после загрузки первого пакета 6 ресурсов изображений, что увеличивает время ожидания. Незаметно увеличить время ожидания пользователя для загрузки веб-страницы.
думать
Что можно сделать для решения этой проблемы при таком ограничении параллелизма? Поскольку максимальный параллелизм равен 6, мы заменяем N URL-адресов ресурсов на N/6 разных доменных имен, чтобы максимальное количество параллелизма N/6 могло происходить одновременно. Давайте посмотрим на сравнение до и после нашего лечения.
Показать результаты
В этой статье в качестве примера используется загрузка изображений [время загрузки конкретного ресурса зависит от разных устройств и разных скоростей сети, только для справки]
Перед обработкой
Когда ресурсы изображений веб-страницы загружаются под одним и тем же доменным именем, как показано на рисунке, всего используется 30 изображений [1,11 с].
Время остановки после начала последнего подключения к ресурсу изображения (то есть время ожидания ответа для загрузки ресурса изображения) [357 мс]
После обработки
Одна и та же операционная среда, одни и те же ресурсы загружаются под несколькими доменными именами (один и тот же ip), как показано на рисунке, общее время для 30 изображений составляет [424 мс]
Время остановки после начала последнего подключения к ресурсу изображения [0,64 мс]
сравнить результаты:В этом примере, с тем же ресурсом и тем же IP, скорость может быть оптимизирована на [60%] после обработки ограничения доменного имени загрузки ресурса. По сравнению с последней загруженной картинкой коэффициент оптимизации времени остановки после начала соединения также достигает [99,8%]
Реализация
-
Реализовать идеи
- Подайте заявку на несколько доменных имен у поставщика услуг DNS, чтобы они указывали на один и тот же IP-сервис.
- Обработка доменного имени выполняется для данных, возвращенных из фона, а замена доменного имени выполняется для ссылок на изображения.
- После замены доменного имени ключ/значение сохраняется через localStorage. Чтобы одно и то же изображение могло кэшироваться браузером, а не перезагружаться при следующем отображении.
-
Реализация кода [Этот метод используется только в обратных вызовах ajax] =" Пример кода выглядит следующим образом:
// 替换域名 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 }
-
Кроме того, для ускорения разрешения DNS можно выполнить предварительную загрузку DNS.
<!-- 配置 Mate 进行域名预加载 --> <!-- dns预加载 --> <link rel="dns-prefetch" href="//node1.baidu.com" /> <link rel="dns-prefetch" href="//node2.baidu.com" />