Фантастическая, но запутанная идея подсказок ресурсов: (а) синхронно?

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

В HTML5 мы можем выполнять предварительную выборку и предварительную визуализацию страниц в элементе link. Вот обзор. Мы можем использовать rel значения dns-prefetch, subresource, prefetch и prerender.

Первое, что сбивает с толку, это то, что в спецификации для HTML5 присутствует только prefetch ( и 5.1) но никто из других нет. (Пока!) Во-вторых, этот браузер поддержка в порядке для (dns-)prefetch, но довольно плоха для других. Особенно раздражает отсутствие поддержки Firefox для prerender.

В-третьих, вопрос, который я задаю себе, заключается в следующем: происходит ли предварительная выборка (или любой другой метод), как только браузер читает строку (и блокирует ли она загрузку текущей страницы), или же он ждет с загрузкой страницы? ресурсы в фоновом режиме, пока текущая страница не загрузится полностью?

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

var pre = document.createElement("link");

pre.setAttribute("rel", "prerender prefetch");
pre.setAttribute("href", "next-page.php");

document.head.appendChild(pre);

Если возможно, ответьте на оба вопроса!

РЕДАКТИРОВАТЬ 17 сентября

Прочитав черновик редактора подсказок по ресурсам, я обнаружил следующее (выделено мной):

Выборки ресурсов, которые могут потребоваться для следующей навигации, могут негативно повлиять на производительность текущего контекста навигации из-за дополнительной конкуренции за ЦП, ГП, память и сетевые ресурсы. Чтобы решить эту проблему, пользовательский агент должен реализовать логику для уменьшения и устранения таких конфликтов:

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

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

Однако остается вопрос. Мне не ясно, происходит ли загрузка внешнего ресурса с помощью prefetch или другого синхронно (и, следовательно, при размещении в голове до загрузки содержимого) или асинхронно (с более низким приоритетом). Я предполагаю последнее, хотя я не понимаю, как это возможно, потому что в спецификации link нет ничего, что позволяло бы асинхронную загрузку содержимого элементов ссылки.


person Bram Vanroy    schedule 16.09.2015    source источник


Ответы (1)


Отказ от ответственности: я не уделял много времени этим спецификациям, поэтому вполне вероятно, что я упустил какой-то важный момент.

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

Намерение кажется скорее рекомендательным, чем предписывающим, так же, как и CSS will-change атрибут< /a> сообщает движкам рендеринга, что элементу следует уделить особое внимание, но не предписывает поведение или что должно быть существовать какое-либо конкретное поведение.

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

Не все ссылки в любом случае будут загружать контент (тип author не приведет к тому, что UA загрузит содержимое URL-адреса mailto:), и я не могу найти никакого упоминания о выборке ресурсов в спецификации, кроме как в обсуждении вокруг crossorigin:

Точное поведение ссылок на внешние ресурсы зависит от точного отношения, определенного для соответствующего типа ссылки. Некоторые атрибуты определяют, следует ли применять внешний ресурс (как определено ниже)... Пользовательские агенты могут попытаться получить такие ресурсы только тогда, когда они необходимы, вместо упреждающего извлечения всех ресурсов. внешние ресурсы, которые не применяются.

(выделено мной)

Кажется, это открывает дверь для асинхронного извлечения ресурсов, указанных в link (или вообще не извлекает).

person Palpatim    schedule 17.09.2015