Spec-Zone.ru › HTML

rel="modulepreload" значение атрибута HTML

Базовая поддержка Широко доступно

Эта функция хорошо зарекомендовала себя и работает на множестве устройств и в различных версиях браузеров. Она доступна во всех браузерах с сентября 2023 года.

  • Подробнее
  • Полная таблица совместимости
  • Отправить отзыв
>

Ключевое слово modulepreload для атрибута rel элемента <link> предоставляет декларативный способ заранее загрузить модульный скрипт, разобрать и скомпилировать его, а также сохранить в карте модулей документа для последующего выполнения.

Предварительная загрузка позволяет заранее загружать модули и их зависимости, а также значительно сокращать общее время загрузки и обработки. Это возможно благодаря тому, что страницы могут загружать модули параллельно, а не последовательно, по мере обработки каждого модуля и обнаружения его зависимостей. Однако не следует предварительно загружать всё подряд! Выбор ресурсов для предварительной загрузки нужно уравновешивать с другими операциями, которые в противном случае могут задерживаться, ухудшая взаимодействие с пользователем.

Ссылки с rel="modulepreload" похожи на ссылки с rel="preload". Главное различие состоит в том, что preload только загружает файл и сохраняет его в кэше, а modulepreload загружает модуль, разбирает и компилирует его, а затем помещает результаты в карту модулей, чтобы модуль был готов к выполнению.

При использовании modulepreload режим запроса всегда равен cors, а свойство crossorigin определяет режим учётных данных запроса учётных данных. Если для crossorigin задано значение anonymous или "" (по умолчанию), то режим учётных данных — same-origin, а учётные данные пользователя, например файлы cookie и данные аутентификации, отправляются только для запросов с same-origin. Если для crossorigin задано значение use-credentials, то режим учётных данных — include, а учётные данные пользователя отправляются как для запросов одного источника, так и для междоменных запросов.

Атрибут as для ссылок с rel="modulepreload" необязателен; по умолчанию используется значение "script". Ему можно задать значение "script", "style", "json", "text" или любое назначение, связанное со скриптами, например "audioworklet", "paintworklet", "serviceworker", "sharedworker" или "worker". Полный список допустимых значений определён в таблице соответствия назначения предварительной загрузки модулей в спецификации HTML module preload destination. Список назначений, связанных со скриптами, см. в спецификации Fetch. Если используется любое другое назначение, на элементе возникает событие Event с именем "error".

Браузер может дополнительно автоматически загружать зависимости ресурса-модуля. Однако следует учитывать, что это оптимизация, зависящая от браузера: единственный способ гарантировать, что все браузеры попытаются предварительно загрузить зависимости модуля, — указать их по отдельности! Кроме того, события с именами load или error возникают сразу после успешной или неудачной загрузки указанных ресурсов. При автоматической загрузке зависимостей в основном потоке дополнительные события не возникают (однако можно отслеживать дополнительные запросы в сервис-воркере или на сервере).

Примеры

Рассмотрим пример basic-modules (рабочая версия), представленный в руководстве по модулям JavaScript.

Структура файлов этого примера показана ниже. Она включает модуль верхнего уровня main.js, который статически импортирует два зависимых модуля — modules/canvas.js и modules/square.js — с помощью инструкции import.

index.html
main.js
modules/
    canvas.js
    square.js

В HTML-коде примера ниже показано, как main.js загружается в элементе <script>. Только после загрузки main.js браузер обнаруживает и загружает два зависимых модуля.

<!doctype html>
<html lang="en-US">
  <head>
    <meta charset="utf-8" />
    <title>Basic JavaScript module example</title>
    <script type="module" src="main.js"></script>
  </head>
  <body></body>
</html>

Приведённый ниже HTML-код обновляет пример, добавляя элементы <link> с атрибутом rel="modulepreload" для основного файла и каждого зависимого модуля. Это значительно быстрее, поскольку все три модуля начинают загружаться асинхронно и параллельно, прежде чем понадобятся. К моменту, когда main.js будет разобран и его зависимости станут известны, они уже будут загружены.

<!doctype html>
<html lang="en-US">
  <head>
    <meta charset="utf-8" />
    <title>Basic JavaScript module example</title>
    <link rel="modulepreload" href="main.js" />
    <link rel="modulepreload" href="modules/canvas.js" />
    <link rel="modulepreload" href="modules/square.js" />
    <script type="module" src="main.js"></script>
  </head>
  <body></body>
</html>

Спецификации

Спецификация
HTML>
# link-type-modulepreload>

Совместимость с браузерами

Настольные компьютеры Мобильные устройства
Chrome Edge Firefox Opera Safari Chrome для Android Firefox для Android Opera для Android Safari для iOS Samsung Internet WebView для Android WebView для iOS
modulepreload 66 79 115 53 17 66 115 47 17 9.0 66 17
as-json 147 147 Нет 131 26.2 147 Нет 98 26.2 Нет 147 26.2
as-script 66 79 115 53 17 66 115 47 17 9.0 66 17
as-style 147 147 Нет 131 Нет 147 Нет 98 Нет Нет 147 Нет

См. также

  • Спекулятивная загрузка — сравнение <link rel="modulepreload"> с другими похожими возможностями повышения производительности.
  • Предварительная загрузка модулей на web.dev

© 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/modulepreload

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API