rel="preload" значение атрибута HTML
Базовая поддержка Широко доступно *
Эта функция хорошо зарекомендовала себя и работает на многих устройствах и во многих версиях браузеров. Она поддерживается браузерами с января 2021 года.
* Уровень поддержки некоторых частей этой функции может различаться.
Значение preload атрибута <link> элемента rel позволяет объявлять запросы на загрузку в <head> HTML-документа и указывать ресурсы, которые вскоре понадобятся странице и загрузку которых следует начать на раннем этапе жизненного цикла страницы — до запуска основного механизма отрисовки браузера. Это позволяет сделать их доступными раньше и уменьшает вероятность того, что они заблокируют отрисовку страницы, повышая производительность. Несмотря на то что название содержит слово load, этот атрибут не загружает и не выполняет скрипт, а лишь планирует его загрузку и сохранение в кэше с более высоким приоритетом.
Основы
Чаще всего <link> используется для загрузки файла CSS, который задаёт стили страницы:
<link rel="stylesheet" href="styles/main.css" />
Однако здесь мы используем значение rel — preload, которое превращает <link> в средство предварительной загрузки любого нужного нам ресурса. Также необходимо указать:
Например, это может выглядеть так (см. исходный код примера с JS и CSS, а также его работающую версию):
<head> <meta charset="utf-8" /> <title>JS and CSS preload example</title> <link rel="preload" href="style.css" as="style" /> <link rel="preload" href="main.js" as="script" /> <link rel="stylesheet" href="style.css" /> </head> <body> <h1>bouncing balls</h1> <canvas></canvas> <script src="main.js" defer></script> </body>
Здесь мы предварительно загружаем файлы CSS и JavaScript, чтобы они были доступны в тот момент, когда понадобятся для отрисовки страницы. Этот пример тривиален: вероятно, браузер обнаружит элементы <link rel="stylesheet"> и <script> в том же фрагменте HTML, что и предварительно загружаемые ресурсы. Однако преимущества становятся гораздо заметнее, если ресурсы обнаруживаются позднее и имеют больший размер. Например:
- Ресурсы, на которые ссылается CSS, например шрифты или изображения.
- Ресурсы, которые может запрашивать JavaScript, например импортируемые скрипты.
У preload есть и другие преимущества. Использование as для указания типа предварительно загружаемого содержимого позволяет браузеру:
- Сохранять ресурс в кэше для последующих запросов и повторно использовать его, если это уместно.
- Применять к ресурсу правильную политику безопасности содержимого.
- Устанавливать для него правильные заголовки запроса
Accept.
Какие типы содержимого можно предварительно загружать?
Можно предварительно загружать содержимое многих типов. Допустимые значения атрибута as:
-
fetch: ресурс, к которому обращаются с помощью запроса fetch или XHR, например ArrayBuffer, двоичный файл WebAssembly или файл JSON. -
font: файл шрифта. -
image: файл изображения. -
script: файл JavaScript. -
style: таблица стилей CSS. -
track: файл WebVTT.
Примечание: Для предварительной загрузки font и fetch необходимо задать атрибут crossorigin; см. раздел Запросы с поддержкой CORS ниже.
Примечание: Подробные сведения об этих значениях и веб-функциях, которые предполагают их использование, приведены в спецификации HTML — см. тип ссылки «preload». Также обратите внимание: полный список значений, допустимых для атрибута as, определяется спецификацией HTML — см. назначения типа ссылки «preload».
Указание типа MIME
Элементы <link> могут принимать атрибут type, содержащий тип MIME ресурса, на который указывает элемент. Это особенно полезно при предварительной загрузке ресурсов: браузер использует значение атрибута type, чтобы определить, поддерживает ли он этот ресурс, и загружает его, только если поддерживает; в противном случае ресурс игнорируется.
<head>
<meta charset="utf-8" />
<title>Image preload example</title>
<link rel="preload" href="flower.avif" as="image" type="image/avif" />
</head>
<body>
<picture>
<source src="flower.avif" type="image/avif" />
<source src="flower.webp" type="image/webp" />
<img src="flower.jpg" />
</picture>
</body>
Приведённый выше код приводит к предварительной загрузке изображения image/avif только в поддерживающих его браузерах. А для пользователей, в браузерах которых поддерживается image/avif, фактически используется изображение image/avif (поскольку это первый указанный элемент <source>). Благодаря этому размер загружаемого изображения для пользователей, в браузерах которых поддерживается image/avif, будет меньше.
Обратите внимание: если браузеры пользователей поддерживают и image/avif, и image/webp, то при наличии в этом коде также элемента <link rel="preload" href="flower.webp" as="image" type="image/webp"> будут предварительно загружены оба изображения — image/avif и image/webp, хотя фактически будет использоваться только одно из них.
Поэтому не рекомендуется указывать предварительную загрузку нескольких типов одного и того же ресурса. Лучше всего предварительно загружать только тот тип, который, скорее всего, будет использовать большинство пользователей. Именно поэтому в приведённом выше примере для изображения image/webp не указана предварительная загрузка.
Однако отсутствие предварительной загрузки не помешает фактически использовать изображение image/webp тем, кому оно нужно: для пользователей, в браузерах которых не поддерживается image/avif, но поддерживается image/webp, приведённый выше код всё равно приведёт к использованию изображения image/webp — но без его ненужной предварительной загрузки для большинства остальных пользователей.
Запросы с поддержкой CORS
При предварительной загрузке ресурсов, которые загружаются с поддержкой CORS (например, с помощью fetch(), XMLHttpRequest или шрифтов), необходимо правильно задать атрибут crossorigin элемента <link>. Значение атрибута должно соответствовать режиму CORS и режиму учётных данных ресурса, даже если запрос выполняется в пределах одного источника.
Как упоминалось выше, один из интересных случаев, к которым это относится, — файлы шрифтов. По разным причинам их необходимо загружать с использованием CORS в анонимном режиме (см. Требования к загрузке шрифтов).
Рассмотрим этот случай в качестве примера. Полный исходный код примера на GitHub также можно посмотреть в действии:
<head>
<meta charset="utf-8" />
<title>Web font example</title>
<link
rel="preload"
href="fonts/cicle_fina-webfont.woff2"
as="font"
type="font/woff2"
crossorigin />
<link
rel="preload"
href="fonts/zantroke-webfont.woff2"
as="font"
type="font/woff2"
crossorigin />
<link href="style.css" rel="stylesheet" />
</head>
<body>
…
</body>
Мы не только указываем тип MIME в атрибутах type, но и задаём атрибут crossorigin, чтобы режим CORS при предварительной загрузке соответствовал режиму запроса самого ресурса шрифта.
Указание медиавыражений
Одно из полезных свойств элементов <link> — возможность задавать атрибуты media. В них можно указывать типы носителей или полноценные медиавыражения, что позволяет предварительно загружать ресурсы с учётом особенностей устройства!
Рассмотрим пример (на GitHub доступны исходный код и работающий пример):
<head>
<meta charset="utf-8" />
<title>Responsive preload example</title>
<link
rel="preload"
href="bg-image-narrow.png"
as="image"
media="(width <= 600px)" />
<link
rel="preload"
href="bg-image-wide.png"
as="image"
media="(width > 600px)" />
<link rel="stylesheet" href="main.css" />
</head>
<body>
<header>
<h1>My site</h1>
</header>
<script>
const mediaQueryList = window.matchMedia("(width <= 600px)");
const header = document.querySelector("header");
if (mediaQueryList.matches) {
header.style.backgroundImage = 'url("bg-image-narrow.png")';
} else {
header.style.backgroundImage = 'url("bg-image-wide.png")';
}
</script>
</body>
Мы указываем атрибуты media в элементах <link>, чтобы при узкой области просмотра предварительно загружалось узкое изображение, а при широкой — более широкое. Для этого используется Window.matchMedia / MediaQueryList (подробнее см. раздел Проверка медиавыражений).
Этот же приём применим и к другим типам ресурсов. Например, предварительная загрузка шрифтов повышает вероятность того, что шрифт будет доступен к моменту отрисовки, и уменьшает вероятность появления текста без стилей (FOUT).
Этот приём не ограничивается изображениями или даже файлами одного типа — мыслите шире! Например, если пользователь использует узкий экран, где пропускная способность сети и возможности процессора могут быть ограничены, можно предварительно загрузить упрощённую схему в формате SVG. Или же предварительно загрузить сложный фрагмент JavaScript и использовать его для отображения интерактивной трёхмерной модели, если ресурсов устройства пользователя достаточно.
Скрипты и предварительная загрузка
Примечание: Если вы работаете с модулями JavaScript, используйте вместо этого <link rel="modulepreload">.
Ещё одно преимущество предварительной загрузки — возможность выполнять её с помощью скрипта. Например, здесь мы создаём экземпляр HTMLLinkElement и добавляем его в DOM:
const preloadLink = document.createElement("link");
preloadLink.href = "myscript.js";
preloadLink.rel = "preload";
preloadLink.as = "script";
document.head.appendChild(preloadLink);
Это означает, что браузер предварительно загрузит файл myscript.js, но пока не будет его использовать. Чтобы использовать его, можно сделать следующее:
const preloadedScript = document.createElement("script");
preloadedScript.src = "myscript.js";
document.body.appendChild(preloadedScript);
Это полезно, когда нужно предварительно загрузить скрипт, но отложить его выполнение до момента, когда он понадобится.
Спецификации
| Спецификация |
|---|
| HTML> # link-type-preload> |
Совместимость с браузерами
| Настольные | Мобильные | |||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Chrome | Edge | Firefox | Opera | Safari | Chrome Android | Firefox для Android | Opera Android | Safari для iOS | Samsung Internet | WebView Android | WebView для iOS | |
preload |
50 | 79 |
8556–57Отключено из-за различных проблем совместимости с веб-платформой (например, ошибка 1405761). |
37 | 11.1 | 50 |
8556–57Отключено из-за различных проблем совместимости с веб-платформой (например, ошибка 1405761). |
37 | 11.3 | 5.0 | 50 | 11.3 |
as-fetch |
50 | 79 |
8556–57Отключено из-за различных проблем совместимости с веб-платформой (например, ошибка 1405761). |
37 | 11.1 | 50 |
8556–57Отключено из-за различных проблем совместимости с веб-платформой (например, ошибка 1405761). |
37 | 11.3 | 5.0 | 50 | 11.3 |
as-font |
50 | 79 |
8556–57Отключено из-за различных проблем совместимости с веб-платформой (например, ошибка 1405761). |
37 | 11.1 | 50 |
8556–57Отключено из-за различных проблем совместимости с веб-платформой (например, ошибка 1405761). |
37 | 11.3 | 5.0 | 50 | 11.3 |
as-image |
50 | 79 |
8556–57Отключено из-за различных проблем совместимости с веб-платформой (например, ошибка 1405761). |
37 | 11.1 | 50 |
8556–57Отключено из-за различных проблем совместимости с веб-платформой (например, ошибка 1405761). |
37 | 11.3 | 5.0 | 50 | 11.3 |
as-script |
50 | 79 |
8556–57Отключено из-за различных проблем совместимости с веб-платформой (например, ошибка 1405761). |
37 | 11.1 | 50 |
8556–57Отключено из-за различных проблем совместимости с веб-платформой (например, ошибка 1405761). |
37 | 11.3 | 5.0 | 50 | 11.3 |
as-style |
50 | 79 |
8556–57Отключено из-за различных проблем совместимости с веб-платформой (например, ошибка 1405761). |
37 | 11.1 | 50 |
8556–57Отключено из-за различных проблем совместимости с веб-платформой (например, ошибка 1405761). |
37 | 11.3 | 5.0 | 50 | 11.3 |
as-track |
50 | 79 | Нет | 37 | 11.1 | 50 | Нет | 37 | 11.3 | 5.0 | 50 | 11.3 |
См. также
-
Спекулятивная загрузка — сравнение
<link rel="preload">с другими похожими способами повышения производительности. - Предварительная загрузка: для чего она нужна? — Йоав Вайс
© 2005–2025 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Attributes/rel/preload