Я просматривал слайды 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
нет ничего, что позволяло бы асинхронную загрузку содержимого элементов ссылки.