Прочетох слайдовете на Google за така наречената предварителна оптимизация. (За тези, които се интересуват или за тези, които не знаят за какво говоря, този слайд донякъде го обобщава.)
В HTML5 можем предварително да извличаме и визуализираме страници в елемента link
. Ето общ преглед. Можем да използваме rel
стойностите dns-prefetch
, subresource
, prefetch
и prerender
.
Първото объркващо нещо е, че очевидно само prefetch
е в спецификацията за HTML5 ( и 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 септември
След като прочетох черновата на редактора на Resource Hints, намерих следното (акцентът е мой):
Извличането на ресурси, което може да се изисква за следващата навигация, може да повлияе отрицателно на производителността на текущия контекст на навигация поради допълнително съревнование за CPU, GPU, памет и мрежови ресурси. За да се справи с това, потребителският агент трябва да приложи логика за намаляване и премахване на такова противоречие:
- Извличанията на ресурси, необходими за следващата навигация, трябва да имат по-нисък относителен приоритет и не трябва да блокират или пречат на извличанията на ресурси, изисквани от текущия контекст на навигация.
- Оптималното време за започване на извличане на ресурс, необходимо за следващата навигация, зависи от договорения транспортен протокол, текущия профил на свързване на потребителите, наличните ресурси на устройството и други специфични за контекста променливи. Потребителският агент е оставен да определи оптималното време, в което да започне извличането -напр. потребителският агент може да реши да изчака, докато приключат всички други изтегляния, или може да избере да изпраща заявки с нисък приоритет, ако договореният протокол поддържа необходимите примитиви. Като алтернатива потребителският агент може да се откаже от иницииране на извличането поради ограничения на ресурсите, потребителски предпочитания или други фактори.
Забележете доколко потребителският агент може да прави това или онова. Наистина се страхувам, че това ще доведе до различни реализации от различни браузъри, което отново ще доведе до разминаване.
Въпросът обаче остава. Не ми е ясно дали зареждането на външен ресурс с помощта на prefetch
или друго се случва синхронно (и по този начин, когато е поставено в главата, преди съдържанието да бъде заредено), или асинхронно (с по-нисък приоритет). Предполагам последното, въпреки че не разбирам как е възможно това, защото в спецификацията link
няма нищо, което би позволило асинхронно зареждане на съдържанието на елементите на връзката.