Skip to content

Instantly share code, notes, and snippets.

@monochromer
Last active March 26, 2019 18:12
Show Gist options
  • Save monochromer/64fff01e94273263821d6e3e42efd3fc to your computer and use it in GitHub Desktop.
Save monochromer/64fff01e94273263821d6e3e42efd3fc to your computer and use it in GitHub Desktop.
preload prefetch
http://prgssr.ru/development/tehniki-prefetchinga-dlya-uluchsheniya-proizvoditelnosti-sajtov.html
https://m.habr.com/ru/post/445264/
# ============ Типы префетча ================
1.
<link rel="dns-prefetch" href="//cdnjs.com/">
Эта техника уведомляет браузер, что на странице используются ресурсы с другого адреса
и браузер может заранее преобразовать URL в IP-адрес.
Можно использовать для cdn-сервисов, виджетов и пр. стороннего API
2.
<link rel="preconnect" href="http://css-tricks.com">
Этот метод очень похож на префетчинг DNS, но кроме разрешения DNS данный метод начинает TCP-соединение
и согласование TLS при защищенном соединении.
3.
<link rel="prefetch" href="image.png">
это директива, сообщающая браузеру о необходимости выборки ресурса,
который понадобится при переходе на следующую страницу.
браузер запрашивает и скачивает искомый ресурс и сохраняет его в кэше.
Однако, это зависит от некоторых условий, префетчинг может быть и проигнорирован браузером.
Например, если запрашивается большой файл со шрифтами при медленном интернет-соединении.
4.
<link rel="subresource" href="styles.css">
LINK rel=subresource” предоставляет новый тип связи ссылок с отличной от LINK rel=prefetch семантикой.
В то время как rel=prefetch задает приоритет для загрузки ресурсов для других страниц,
rel=subresource дает раннюю загрузку ресурсов для текущей страницы.
Итак, если ресурс потребуется на текущей странице или же потребуется максимально скоро,
лучше использовать subresource, а в остальных случаях prefetch.
5.
<link rel="prerender" href="http://css-tricks.com">
Это как открытие URL в скрытой вкладке — все ресурсы скачиваются, строится DOM,
раскладывается макет страницы, применяются стили и исполняются скрипты.
И если пользователь переходит по указанному адресу, страница открывается мгновенно.
Google Search использует этот механизм уже несколько лет (Instant Pages).
Microsoft реализовал пререндеринг в Bing в IE11.
6.
<link rel="preload" href="image.png">
Предзагрузка используется для тех ресурсов, которые скачиваются всегда, независимо от браузера.
Если префетчинг может быть проигнорирован браузером, ресурсы в предзагрузке запрашиваются браузером в любом случае.
http://prgssr.ru/development/dlya-chego-stoit-ispolzovat-predzagruzku.html
# ============ <link rel="preload"> ================
У предзагрузки есть атрибут as, позволяющий браузеру делать вещи, которые невозможны с префетчингом и субресурсом:
- Браузер может задать правильный приоритет ресурсов, в соответствии с которым они будут загружаться — не будет ни задержки важных ресурсов, ни упорного выкачивания второстепенных.
- Браузер может обеспечить соответствие ресурса директивам политики безопасности контента и не выходить на ненадежный сервер.
- Браузер может отправить соответствующие заголовки Accept на основе типа ресурса (например, image/webp при выборке изображений).
- Браузер знает тип ресурса и поэтому может определить, может ли он использоваться при последующих запросах к тому же ресурсу.
- Есть событие load
Загрузка “поздно-обнаруживаемых” ресурсов
<link rel="preload" as="font" type="font/woff2" crossorigin href="font.woff2">
Динамическая загрузка без запуска
<script>
var link = document.createElement("link");
link.href = "myscript.js";
link.rel = "preload";
link.as = "script";
document.head.appendChild(link);
</script>
<script>
var script = document.createElement("script");
script.src = "myscript.js";
document.body.appendChild(script);
</script>
Асинхронный загрузчик в разметке
<link rel="preload" as="style" href="async-style.css" onload="this.onload=null; this.rel='stylesheet'">
<link rel="preload" as="script" href="async-script.js"
onload="this.onload=null;
var script = document.createElement('script');
script.src = this.href;
document.body.appendChild(script);">
Загрузка с медиа-запросом (пока не поддерживается)
<link rel="preload" as="image" href="map.png" media="(max-width: 600px)">
<link rel="preload" as="script" href="map.js" media="(min-width: 601px)">
Можно задать в HTTP-заголовках
Link: <thing_to_load.js>;rel="preload";as="script"
Link: <thing_to_load.woff2>;rel="preload";as="font";crossorigin
Проверка поддержки
<script>
var DOMTokenListSupports = function(tokenList, token) {
if (!tokenList || !tokenList.supports) {
return;
}
try {
return tokenList.supports(token);
} catch (e) {
if (e instanceof TypeError) {
console.log("The DOMTokenList doesn't have a supported tokens list");
} else {
console.error("That shouldn't have happened");
}
}
};
var linkSupportsPreload = DOMTokenListSupports(document.createElement("link").relList, "preload");
if (!linkSupportsPreload) {
// Dynamically load the things that relied on preload.
}
</script>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment