Фантастичната, но объркваща идея за Resource Hints: (a) синхронен?

Прочетох слайдовете на 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 няма нищо, което би позволило асинхронно зареждане на съдържанието на елементите на връзката.


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


Отговори (1)


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

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

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

няма нищо в спецификацията на връзката, което би позволило асинхронно зареждане на съдържанието на елементите на връзката

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

Точното поведение на връзките към външни ресурси зависи от точната връзка, както е дефинирана за съответния тип връзка. Някои от атрибутите контролират дали външният ресурс трябва да се прилага или не (както е дефинирано по-долу)... Потребителските агенти могат да изберат да се опитват да получат такива ресурси само когато са необходими, вместо проактивно извличане на всички външни ресурси, които не се прилагат.

(подчертаването е мое)

Това изглежда отваря вратата ресурсите, посочени от link, да бъдат извлечени асинхронно (или изобщо).

person Palpatim    schedule 17.09.2015