Есть ли ограничение на количество доменов, которые мы должны «предварительно подключить по dns-prefetch» ​​к Chrome? - PullRequest
1 голос
/ 31 марта 2019

Когда мы хотим быть уверенными в быстром быстром веб-сайте, который использует сторонние виджеты / плагины / дополнения / аналитику и т. Д. Одним из многих требований для достижения этой цели является «dns-prefetch preconnect» для каждого отдельного домена имя (в основном экономия на поиске DNS и т. д.)

Я не смог найти документ, который бы советовал, сколько доменных имен мы могли бы "предварительно подключить по dns-prefetch", прежде чем мы потеряем какую-либо потенциальную выгоду. Помните, как в прежние времена у Internet Explorer было ограничение на количество загружаемых изображений параллельно, просто подумайте, может ли у Chrome быть какое-то обоснование для ограничения запроса «dns-prefetch preconnect»?

Например: сколько это слишком много?

<link rel="dns-prefetch preconnect" href="https://admin.typeform.com" crossorigin />
<link rel="dns-prefetch preconnect" href="https://api.amplitude.com" crossorigin />
<link rel="dns-prefetch preconnect" href="https://api.segment.io" crossorigin />
<link rel="dns-prefetch preconnect" href="https://app.launchdarkly.com" crossorigin />
<link rel="dns-prefetch preconnect" href="https://bam.nr-data.net" crossorigin />
<link rel="dns-prefetch preconnect" href="https://cdn.amplitude.com" crossorigin />
<link rel="dns-prefetch preconnect" href="https://cdn.segment.com" crossorigin />
<link rel="dns-prefetch preconnect" href="https://customer.api.drift.com" crossorigin />
<link rel="dns-prefetch preconnect" href="https://embed.typeform.com" crossorigin />
<link rel="dns-prefetch preconnect" href="https://event.api.drift.com" crossorigin />
<link rel="dns-prefetch preconnect" href="https://events.launchdarkly.com" crossorigin />
<link rel="dns-prefetch preconnect" href="https://fonts.googleapis.com" crossorigin />
<link rel="dns-prefetch preconnect" href="https://fonts.gstatic.com" crossorigin />
<link rel="dns-prefetch preconnect" href="https://images.typeform.com" crossorigin />
<link rel="dns-prefetch preconnect" href="https://js-agent.newrelic.com" crossorigin />
<link rel="dns-prefetch preconnect" href="https://js.driftt.com" crossorigin />
<link rel="dns-prefetch preconnect" href="https://load.sumo.com" crossorigin />
<link rel="dns-prefetch preconnect" href="https://metrics.api.drift.com" crossorigin />
<link rel="dns-prefetch preconnect" href="https://renderer-assets.typeform.com" crossorigin />
<link rel="dns-prefetch preconnect" href="https://static.addtoany.com" crossorigin />
<link rel="dns-prefetch preconnect" href="https://sumo.com" crossorigin />
<link rel="dns-prefetch preconnect" href="https://weclean1.typeform.com" crossorigin />
<link rel="dns-prefetch preconnect" href="https://www.google-analytics.com" crossorigin />
<link rel="dns-prefetch preconnect" href="https://www.googletagmanager.com" crossorigin />
<link rel="dns-prefetch preconnect" href="https://www.youtube.com" crossorigin />

Любые ссылки обратная связь / совет с благодарностью!

Ответы [ 2 ]

3 голосов
/ 23 апреля 2019

Ресурсные подсказки не следует использовать чрезмерно

Во-первых, как упоминалось ниже, вы должны предпочесть preload.Если вы точно не знаете, какие ресурсы будет включать ваша страница, то могут подойти dns-prefetch и preconnect.

Спецификация подсказки ресурса указывает , чтооптимальное количество соединений весьма условно:

Оптимальное количество соединений на источник зависит от согласованного протокола, текущего профиля подключения пользователя, доступных ресурсов устройства, глобальных ограничений подключения и других переменных, зависящих от контекста,В результате решение о том, сколько соединений следует открыть, откладывается агенту пользователя.

И dns-prefetch, и preconnect указывают, что пользовательский агент "должен" инициировать процесс, что означаетони не должны этого делать.

Илья Григорик, редактор этой спецификации, говорит

Тем не менее, используйте это с умом: каждый открытый сокетнесет расходы как на клиенте, так и на сервере, и вы хотите избежать открытия сокетов, которые могут остаться неиспользованными.Как всегда, применяйте, измеряйте реальное воздействие и итерируйте, чтобы получить максимальную отдачу от этой функции.

Сержио Гомес, также Googler, echos Предупреждение Ильи снемного больше специфичности:

Имейте в виду, что хотя <link rel="preconnect"> довольно дешево, оно все же может занимать ценное время ЦП, особенно для защищенных соединений.Это особенно плохо, если соединение не используется в течение 10 секунд, так как браузер закрывает его, тратя впустую всю эту раннюю работу соединения.

В общем, старайтесь использовать <link rel="preload"> везде, где можете, так как этоболее всеобъемлющую настройку производительности, но держите <link rel="preconnect"> в своем инструментальном поясе для крайних случаев.

Сержио продолжает иллюстрировать пару примеров, где preconnect, а не preload, подходит.Я настоятельно рекомендую взглянуть на них .

Иван Акулов , бывший Googler и нынешний генеральный директор стартап-производительности в сети, рискует дать численную рекомендацию :

Вы хотите ускорить более 4-6 доменов.Не рекомендуется использовать <link rel="preconnect" /> с более чем 4-6 доменами, так как открытие и поддержание соединения является дорогостоящей операцией.<link rel="dns-prefetch" /> более легкий, поэтому используйте его для других сторонних доменов, если вы тоже хотите ускорить их.

Но Иван, хотя и является авторитетным источником, не предоставляет жесткой технической поддержки дляэта рекомендация.

Без чтения исходного кода для каждого соответствующего браузера невозможно обоснованно сказать, сколько dns-prefetch / preconnects слишком много.Даже после прочтения исходного кода, он может только дать подсказку о том, сколько из них подходит.Жестких ограничений нет, но приведенные выше авторитетные источники дают нам основания для осторожности.

Но трудно понять, где провести черту

Есть только один способ улучшить производительность:

  1. решите, какие показатели важны для вас и ваших пользователей
  2. используйте лучшие из доступных синтетических и реальных чисел для измерения статус-кво
  3. внесите изменения и измерьте разницу

Потребовалось бы несколько итераций, чтобы получить наилучшую возможную конфигурацию.И оптимальный выбор подсказок может меняться со временем.С точки зрения ремонтопригодности было бы лучше агрессивно предварительно подключить все, что соответствует требованиям «крайнего случая» Сержио, и доверить браузеру свою работу.Но опять же, никогда без тестирования.

Пара других заметок

Это много сторонних зависимостей для этой страницы.Я уверен, что вы работаете в соответствии с вашими требованиями, но сейчас самое время попросить руководство пересмотреть необходимость некоторых из них.

FinПримите во внимание, что crossorigin подходит не для каждой подсказки ресурса . Это зависит от того, будет ли загружаемый ресурс (ы) использовать CORS. Если вы не знаете, это может удвоить количество необходимых предварительных соединений.

Атрибут crossorigin при использовании с rel="preconnect" не опишите, где находится целевое происхождение, а какие активы будет загружен из этого источника. Если активы используют CORS, crossorigin необходимо. Если CORS не будет использоваться, crossorigin должно быть опущено. Если оба типа активов будут присутствовать, два ресурса подсказки необходимы.

Взгляните на этот список ресурсов, которые используют CORS для руководства.

1 голос
/ 25 апреля 2019

Я новичок и пока не могу добавить комментарий, поэтому вместо этого добавляю ответ.

Судя по моим собственным тестам, в кэше DNS TTL составляет 1000 Это может быть причиной того, что при открытии «слишком рано» соединение "dns-prefetch preconnect" может фактически оказать негативное влияние на желаемую производительность.

Вы также можете проверить preconnect vs dns-prefetch resourceподсказки

"TTL" - это сокращение от: Time To Live

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...