<script type="speculationrules">
Экспериментально: Это экспериментальная технология
Перед использованием в продакшене внимательно изучите таблицу совместимости браузеров.
Значение атрибута type элемента <script> указывает, что тело элемента содержит правила спекуляций.
Правила спекуляций представляют собой структуру JSON, определяющую, какие ресурсы браузер должен предварительно загрузить или предварительно отобразить. Это часть API правил спекуляций.
Примечание: Правила спекуляций могут быть определены внутри внешних текстовых файлов, на которые ссылается HTTP-заголовок Speculation-Rules, используя ту же представление JSON, приведенную ниже. Указание HTTP-заголовка полезно в случаях, когда разработчики не могут напрямую изменить сам документ.
Синтаксис
<script type="speculationrules"> // JSON object defining rules </script>
Примечание: Атрибуты src, async, nomodule, defer, crossorigin, integrity, и referrerpolicy указывать нельзя.
Исключения
TypeError-
Определение правил спекуляций не является допустимым объектом JSON.
Описание
Элемент <script type="speculationrules"> должен содержать корректную структуру JSON, определяющую правила спекуляций. Следующие примеры показывают отдельные правила предварительной загрузки и предварительного рендеринга:
<script type="speculationrules"> { "prefetch": [ { "urls": ["next.html", "next2.html"], "requires": ["anonymous-client-ip-when-cross-origin"], "referrer_policy": "no-referrer" } ] } </script>
<script type="speculationrules"> { "prerender": [ { "where": { "href_matches": "/next" }, "eagerness": "eager" } ] } </script>
Представление правил спекуляций в JSON
Структура JSON содержит один или несколько полей верхнего уровня, каждое из которых представляет собой действие для определения правил спекуляций. В настоящее время поддерживаются следующие действия:
-
"prefetch"Необязательно Экспериментально -
Правила для потенциальных будущих навигаций, которые должны иметь связанный ответ тела документа, загруженный заранее, что приводит к значительному повышению производительности при навигации по этим документам. Обратите внимание, что ни один из подресурсов, на которые ссылается страница, не загружается.
-
"prerender"Необязательно Экспериментально -
Правила для потенциальных будущих навигаций, которые должны быть полностью загружены, отображены и загружены в невидимую вкладку. Это включает загрузку всех подресурсов, выполнение всех JavaScript и даже загрузку подресурсов и выполнение запросов данных, инициированных JavaScript. При навигации к этим документам навигация будет мгновенной, что приведет к значительному повышению производительности.
Примечание: Обратитесь к основной странице API правил спекуляций для получения подробной информации о том, как эффективно использовать предварительную загрузку и предварительный рендеринг.
Каждое поле действия содержит массив, который, в свою очередь, содержит один или несколько объектов. Каждый объект содержит одно правило, определяющее набор URL-адресов и связанных параметров.
Каждый объект может содержать следующие свойства:
"source"-
Строка, указывающая источник URL-адресов, на которые распространяется правило. Это необязательно, так как значение всегда можно определить по другим свойствам.
Это может быть одно из следующих значений:
"document"-
Указывает, что URL-адреса будут сопоставлены со ссылками навигации в связанном документе (как определено в элементах
<a>и<area>), на основе условий, описанных ключом"where". Обратите внимание, что наличие ключа"where"подразумевает"source": "document", поэтому он является необязательным. "list"-
Указывает, что URL-адреса будут взяты из списка, указанного в ключе
"urls". Обратите внимание, что наличие ключа"urls"подразумевает"source": "list", поэтому он является необязательным.
-
"urls"Экспериментально -
Массив строк, представляющий список URL-адресов, к которым применяется правило. Это могут быть абсолютные или относительные URL-адреса. Относительные URL-адреса будут распарсены относительно базового URL-адреса документа (если он указан внутри документа) или относительно URL-адреса внешнего ресурса (если он получен извне).
"urls"и"where"не могут быть оба установлены в одном правиле. -
"where"Экспериментально -
Объект, представляющий условия, по которым правило сопоставляет URL-адреса, содержащиеся в связанном документе. По сути, объект
"where"представляет собой тест, который выполняется для каждой ссылки на странице, чтобы определить, применяется ли к ней правило спекулятивного запроса."where"и"urls"не могут быть оба установлены в одном правиле.Этот объект может содержать ровно одно из следующих свойств:
"href_matches"-
Строка, содержащая шаблон URL-адреса, или массив, содержащий несколько строк шаблонов URL-адресов, которые следуют синтаксису API шаблонов URL. Ссылки в документе, URL-адреса которых соответствуют шаблону(ам), будут иметь применённое правило.
"relative_to"-
В случае условия
"href_matches", это может указать, относительно чего нужно сопоставлять данное условие. Это работает точно так же, как и ключ"relative_to"на уровне правила, за исключением того, что он влияет только на одно условие"href_matches"внутри ключа"where". "selector_matches"-
Строка, содержащая CSS-селектор, или массив, содержащий несколько CSS-селекторов. Ссылки в документе, соответствующие этим селекторам, будут иметь применённое правило.
"and"-
Массив, содержащий один или несколько объектов, содержащих условия (
"href_matches","selector_matches","and","not", или"or"), все из которых должны совпадать, чтобы правило было применено к ним. "not"-
Объект, содержащий одно условие (
"href_matches","selector_matches","and","not", или"or"), которое, если оно выполняется, не будет иметь применённое правило. Все ссылки, которые не соответствуют условию, будут иметь применённое правило. "or"-
Массив, содержащий один или несколько объектов, содержащих условия (
"href_matches","selector_matches","and","not", или"or"), любой из которых может соответствовать, чтобы правило было применено к ним.
Условия
"where"могут быть вложены на несколько уровней глубины, чтобы создать сложные условия, или вы можете разделить их на отдельные правила, чтобы упростить их.См. примеры условий where для получения дополнительной информации и множества примеров использования.
-
"eagerness"Экспериментально -
Строка, предоставляющая подсказку браузеру о том, насколько активно он должен предзагружать/предрендерить цели ссылок, чтобы сбалансировать преимущества производительности с затратами ресурсов. Возможные значения:
"immediate"-
Автор считает, что ссылка с большой вероятностью будет нажата, и/или документ может загружаться значительное время. Предзагрузка/предрендеринг должны начаться как можно скорее, учитывая только такие факторы, как предпочтения пользователя и ограничения ресурсов.
"eager"-
Автор хочет предзагрузить/предрендерить большое количество навигаций как можно раньше. Предзагрузка/предрендеринг должна начаться при любом малейшем предположении о том, что ссылка может быть нажата. Например, пользователь может навести курсор мыши на ссылку, нажать/сфокусироваться на ней на мгновение или приостановить прокрутку, когда ссылка находится в заметном месте.
"moderate"-
Автор ищет баланс между
eagerиconservative. Предзагрузка/предрендеринг должна начаться, когда есть обоснованное предположение, что пользователь нажмет ссылку в ближайшем будущем. Например, пользователь может прокрутить ссылку в видимую область и навести/сфокусироваться на ней некоторое время. "conservative"-
Автор хочет получить некоторую выгоду от спекулятивной загрузки с относительно небольшими затратами ресурсов. Предзагрузка/предрендеринг должна начаться только при нажатии пользователем на ссылку, например, на
mousedownилиpointerdown.
Если
"eagerness"не указано явно, правила списка ("urls") по умолчанию устанавливаются наimmediate, а правила документа ("where") по умолчанию наconservative. Браузер учитывает эту подсказку вместе со своими собственными эвристиками, поэтому он может выбрать ссылку, которую автор отметил как менее настойчивую, чем другую, если менее настойчивый кандидат считается лучшим выбором. -
"expects_no_vary_search"Экспериментально -
Строка, предоставляющая подсказку браузеру о том, какое значение заголовка
No-Vary-Searchбудет установлено для ответов на документы, для которых он получает запросы предзагрузки/предрендеринга. Браузер может использовать это, чтобы заранее определить, будет ли полезнее дождаться завершения существующей предзагрузки/предрендеринга или начать новый запрос при совпадении правила спекулятивного запроса. См."expects_no_vary_search"пример для получения дополнительной информации о том, как это можно использовать. -
"referrer_policy"Экспериментально -
Строка, представляющая определенную строку политики пересылки для использования при запросе URL-адресов, указанных в правиле — см.
Referrer-Policyдля возможных значений. Цель этого — позволить странице-источнику установить более строгую политику специально для спекулятивного запроса, чем политика, уже установленная на странице (по умолчанию или с помощьюReferrer-Policy).Примечание: Предварительная загрузка на другой домен требует политики пересылки, которая по крайней мере такая же строгая, как значение по умолчанию
"strict-origin-when-cross-origin"— поэтому"strict-origin-when-cross-origin","same-origin","strict-origin", или"no-referrer". Более свободная политика, установленная в правилах спекуляции, перекроет более строгую политику, установленную на странице-источнике, пока она остается достаточно строгой для случая с другим доменом.Примечание: В случае правил документов, будет использоваться указанная политика пересылки сопоставленной ссылки (например, с использованием атрибута
referrerpolicy), если правила не указывают политику, которая перекрывает ее. -
"relative_to"Экспериментально -
Строка, указывающая, относительно чего нужно сопоставлять ссылки, соответствующие URL. Значение может быть одним из следующих:
document-
URL-адреса должны сопоставляться относительно документа, на котором устанавливаются правила спекуляции.
ruleset-
URL-адреса должны сопоставляться относительно файла, в котором указаны правила. Это значение по умолчанию.
Это значение ключа актуально только для правил, определенных во внешнем файле (установленных с помощью заголовка
Speculation-Rules). Когда правила указаны внутри того же документа, для которого они устанавливаются (т.е. в элементе <<script>>), это не имеет значения. -
"requires"Экспериментально
-
Массив строк, представляющих возможности браузера, обрабатывающего правило, которые должны быть доступны, если правило должно быть применено к указанным URL-адресам.
Предупреждение: Предварительные запросы (prefetch) автоматически завершатся ошибкой в браузерах, не удовлетворяющих заданному требованию, даже если они поддерживают API правил упреждения (Speculation Rules API).
Возможные значения:
"anonymous-client-ip-when-cross-origin"-
(только для предварительного запроса) Указывает, что правило соответствует только в том случае, если пользовательский агент может предотвратить отображение IP-адреса клиента на сервере источника в случае отправки запроса предварительного запроса (cross-origin prefetch). Точный способ работы зависит от особенностей реализации браузера. Например:
- Реализация Chrome скрывает IP-адрес с помощью прокси Google, поэтому по умолчанию она работает только для ссылок, контролируемых Google (поскольку в этом случае отправка адресов назначения Google не является дополнительной утечкой конфиденциальности). При использовании на сайте, не принадлежащем Google, правила, содержащие это значение, будут соответствовать только для пользователей, включивших «Улучшенную загрузку» в
chrome://settings/preloading. - Другие браузеры на основе Chromium должны предоставить свои собственные решения. Рекомендуется тщательное тестирование во всех целевых браузерах.
- Будущая реализация Safari может использовать что-то наподобие iCloud Private Relay.
- Будущая реализация Firefox может использовать что-то на основе продукта Mozilla VPN.
- Реализация Chrome скрывает IP-адрес с помощью прокси Google, поэтому по умолчанию она работает только для ссылок, контролируемых Google (поскольку в этом случае отправка адресов назначения Google не является дополнительной утечкой конфиденциальности). При использовании на сайте, не принадлежащем Google, правила, содержащие это значение, будут соответствовать только для пользователей, включивших «Улучшенную загрузку» в
Примечание: Поскольку правила упреждения используют элемент <script>, их необходимо явно разрешить в Content-Security-Policy script-src директиве, если сайт её использует. Это делается путём добавления значения "inline-speculation-rules" вместе с источником хеша или nonce.
Примеры
Предварительный запрос и предварительный рендер в одном наборе правил
Базовые примеры, показанные в разделе описания, включали отдельные правила упреждения для предварительного запроса и предварительного рендера. Можно определить оба правила в одном наборе правил:
<script type="speculationrules"> { "prefetch": [ { "urls": ["next.html", "next2.html"], "requires": ["anonymous-client-ip-when-cross-origin"], "referrer_policy": "no-referrer" } ], "prerender": [ { "where": { "selector_matches": ".product-link" }, "eagerness": "eager" } ] } </script>
Примечание: Этот фрагмент кода предоставляет пример правила списка ("urls") и правила документа ("where").
Несколько наборов правил
Также разрешено включать несколько наборов правил в один HTML-файл:
<script type="speculationrules"> { "prefetch": [ { "urls": ["next.html", "next2.html"], "requires": ["anonymous-client-ip-when-cross-origin"], "referrer_policy": "no-referrer" } ] } </script> <script type="speculationrules"> { "prerender": [ { "where": { "selector_matches": ".product-link" }, "eagerness": "eager" } ] } </script>
И несколько правил в одном наборе результатов:
<script type="speculationrules"> { "prerender": [ { "urls": ["one.html"] }, { "urls": ["two.html"] } ] } </script>
Динамическое вставление правил
Ниже приведен пример, в котором функция распознаёт правила упреждения и, если они поддерживаются, динамически добавляет правило предварительного рендера через JavaScript:
if ( HTMLScriptElement.supports && HTMLScriptElement.supports("speculationrules") ) { const specScript = document.createElement("script"); specScript.type = "speculationrules"; const specRules = { prerender: [ { urls: ["/next.html"], }, ], }; specScript.textContent = JSON.stringify(specRules); console.log("added speculation rules to: next.html"); document.body.append(specScript); }
Вы можете увидеть это в действии на этой странице демонстраций предварительного рендера.
where примеры синтаксиса
Правило, полученное из документа, содержит свойство "where", которое представляет собой объект, содержащий критерии, определяющие, какие ссылки в документе соответствуют правилу. По сути, объект "where" представляет собой тест, который выполняется для каждой ссылки на странице, чтобы определить, применяется ли к ней правило упреждения.
Самая базовая версия будет соответствовать одному шаблону URL-адреса или CSS-селектору:
{ "where": { "href_matches": "/next" } }
{ "where": { "selector_matches": ".important-link" } }
"href_matches" и "selector_matches" также могут быть установлены в массив значений, поэтому можно одновременно сопоставлять несколько шаблонов URL-адресов или CSS-селекторов:
{ "where": { "href_matches": ["/next", "/profile"] } }
{ "where": { "selector_matches": [".important-link", "#unique-link"] } }
Шаблоны URL-адресов и селекторы также могут содержать символы подстановки (*), что позволяет одному значению сопоставляться с несколькими URL-адресами. Например, объект ниже может соответствовать user/, user/settings, user/stats, и т. д.
{ "where": { "href_matches": "/user/*" } }
Параметры поиска (или строки запроса) также могут быть заданы в href_matches. Например, объект ниже может соответствовать всем URL-адресам одного происхождения с параметром поиска category (как первым, так и последующим параметром):
{ "where": { "href_matches": "/*\\?*(^|&)category=*" } }
Любое условие можно инвертировать, поместив его в условие "not" — это означает, что при соответствии ссылка не будет иметь применённое к ней правило упреждения, но при отсутствии соответствия она будет. Следующий пример приведет к тому, что все ссылки, которые не соответствуют шаблону URL-адреса /logout, будут иметь примененное к ним правило, но не ссылки, которые соответствуют /logout:
{ "where": { "not": { "href_matches": "/logout" } } }
Объединение нескольких условий "where" с "and" или "or"
Несколько условий могут быть объединены внутри условий "and" или "or" — они принимают значения массивов, содержащих несколько условий, все или любое из которых (соответственно) должны соответствовать для того, чтобы правила упреждения применялись к ссылке. Используя "and" или "or", условия могут быть вложены на несколько уровней — нет заданного ограничения на допустимые уровни вложенности.
Полезно рассматривать объект "where" как эквивалент оператору if.
Так
{ and: [A, B, { or: [C, { not: D }] }] }
эквивалентно
if (A && B && (C || !D)) {
apply speculation rule
}
В следующем примере полного правила упреждения все страницы одного происхождения помечаются для предварительного запроса, за исключением известных проблемных — страницы /logout, и любых ссылок, помеченных классом .no-prerender:
<script type="speculationrules"> { "prefetch": [ { "where": { "and": [ { "href_matches": "/*" }, { "not": { "href_matches": "/logout" } }, { "not": { "selector_matches": ".no-prerender" } } ] } } ] } </script>
Примечание: Шаблон where выше не включает перекрестные ссылки, которые поддерживаются для предварительного запроса (при условии, что у пользователя нет файлов cookie для сайта назначения, чтобы защититься от отслеживания), но не для предварительного рендера.
"relative_to" пример
Для наборов правил, которые извлекаются внешним образом (т. е. через заголовок ответа Speculation-Rules), URL-адреса в правилах списка и шаблонах URL-адресов в правилах документа по умолчанию анализируются относительно URL-адреса содержащего внешнего текстового файла. Для анализа URL-адресов в правиле списка относительно базового URL-адреса документа используется "relative_to", как показано здесь:
{ "urls": ["/home", "/about"], "relative_to": "document" }
Для правил документа "relative_to" может быть напрямую связан с "href_matches", и базовый URL-адрес документа будет использоваться только для шаблонов в этом конкретном условии:
{ "where": { "or": [ { "href_matches": "/home", "relative_to": "document" }, { "href_matches": "/about" } ] } }
В приведенном выше примере только первое "href_matches" будет соответствовать относительно базового URL-адреса документа.
relative_to в основном актуально, если файл JSON с правилами упреждения находится на другом происхождении, чем документ, к которому вы хотите их применить:
- Если документ расположен по адресу
https://example.com/some/subpage.htmlи правила по адресуhttps://example.com/resources/rules.json, то/homeвсегда эквивалентноhttps://example.com/homeнезависимо от того, установлено лиrelative_toна значениеdocumentилиruleset. - Однако, если документ расположен по адресу
https://example.com/some/subpage.htmlи правила по адресуhttps://other.example/resources/rules.json(например, на ресурсе сторонней компании или без файлов cookie), то:-
"relative_to": "document"приведет к тому, что/homeстанет эквивалентнымhttps://example.com/home. -
"relative_to": "ruleset"приведет к тому, что/homeстанет эквивалентнымhttps://other.example/home.
"relative_to". -
- Другой потенциальный (но менее распространённый) случай использования — когда ваши URL-адреса указаны в форме
homeвместо/home. Если документ расположен по адресуhttps://example.com/some/subpage.htmlи правила по адресуhttps://example.com/resources/rules.json, то:-
"relative_to": "document"приведет к тому, чтоhomeстанет эквивалентнымhttps://example.com/some/home. -
"relative_to": "ruleset"приведет к тому, чтоhomeстанет эквивалентнымhttps://example.com/resources/home.
-
"expects_no_vary_search" пример
Рассмотрим случай главной страницы каталога пользователей, /users, которая имеет параметр id, добавленный для отображения информации о конкретном пользователе, например /users?id=345. Следует ли считать этот URL идентичным для целей кэширования зависит от поведения приложения:
- Если этот параметр приводит к загрузке совершенно новой страницы с информацией о заданном пользователе, то URL необходимо кэшировать отдельно.
- Если этот параметр служит для выделения указанного пользователя на той же странице и, возможно, отображения выдвижного панели с данными, то URL следует считать одинаковым для целей кэширования. Это может привести к улучшению производительности при загрузке страниц пользователей и может быть достигнуто с помощью заголовка
No-Vary-Searchсо значениемparams=("id").
Как это влияет на правила спекуляции? Рассмотрим следующий код:
<script type="speculationrules"> { "prefetch": [ { "urls": ["/users"] } ] } </script> <a href="/users?id=345">User Bob</a>
Что произойдёт в этом случае, когда пользователь начинает навигацию к /users?id=345, когда заголовки для предварительной загрузки /users ещё не получены? В этот момент браузер не знает, какое значение No-Vary-Search будет, если таковое вообще будет. Если значение No-Vary-Search не было установлено, и поведение приложения было более похоже на вариант 1 выше, предварительная загрузка будет потеряна, и браузеру придётся загружать отдельную /users?id=345 страницу заново.
Для решения этой проблемы мы можем дать подсказку о том, что ожидается значение No-Vary-Search. У правила спекуляции может быть поле "expects_no_vary_search", содержащее строковое представление ожидаемого значения заголовка:
<script type="speculationrules"> { "prefetch": [ { "urls": ["/users"], "expects_no_vary_search": "params=(\"id\")" } ] } </script> <a href="/users?id=345">User Bob</a>
Это указывает на то, что вариант 2, описанный выше, является тем, что ожидается от сервера. Если навигация начинается, в то время как идёт предварительная загрузка /users, это сообщает браузеру, что он должен дождаться предварительной загрузки, а не сразу начинать другую загрузку для /users?id=345.
Правила документа также могут использоваться в сочетании с "expects_no_vary_search", в зависимости от используемого шаблона. Например, в случае:
<script type="speculationrules"> { "prefetch": [ { { "where": { "href_matches": "/users?id=*" } }, "expects_no_vary_search": "params=(\"id\")" } ] } </script> <a href="/users?id=012">User Bill</a> <a href="/users?id=345">User Bob</a> <a href="/users?id=678">User Ben</a>
Если пользователь наведёт курсор на ссылку, браузер начнёт предварительную загрузку этой ссылки.
Если пользователь наведёт курсор на другую ссылку, прежде чем завершится предварительная загрузка, шаблон expects_no_vary_search указывает браузеру, что нет необходимости отменять текущую предварительную загрузку, поскольку все /users URL с значениями параметра id URL фактически указывают на одну и ту же страницу в этом контексте (и для целей кэширования).
eagerness пример
Следующий набор правил документа показывает, как eagerness можно использовать для указания степени готовности браузера к предварительной рендеру каждой соответствующей группы ссылок.
<script type="speculationrules"> { "prerender": [ { "where": { "href_matches": "/*" }, "eagerness": "conservative" }, { "where": { "selector_matches": ".product-link" }, "eagerness": "eager" } ] } </script>
Здесь мы даём подсказку о том, что:
- Все ссылки одного сайта, содержащиеся в документе, должны быть предварительно рендерированы консервативно (то есть при активации пользователем).
- Любые ссылки на продукты (в данном случае те, у которых
classравно.product-link) в документе должны быть предварительно рендерированы сразу (то есть, если пользователь предпринимает какие-либо действия по переходу к ним).
Примечание: Эффекты настроек готовности менее полезны для правил списков. По умолчанию URL-адреса правил списка предварительно загружаются/рендерятся немедленно после анализа правил, что ожидается — они предназначены для явного указания URL-адресов высокой важности, которые вы хотите сделать доступными как можно скорее. По этой причине eager имеет тот же эффект, что и immediate в текущих реализациях. Меньшие значения готовности предназначены для предварительной загрузки/рендеринга, когда ссылки активируются пользователем, и в этих случаях вы скорее всего будете использовать правила документа для их поиска на странице.
Спецификации
| Спецификация |
|---|
| Правила спекуляции # speculation-rules-script |
Совместимость с браузерами
| Рабочие столы | Мобильные устройства | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
| Chrome | Edge | Firefox | Opera | Safari | Chrome Android | Firefox for Android | Opera Android | Safari на IOS | Samsung Internet | WebView Android | |
speculationrules |
109105Первоначальная поддержка включала предварительную рендеру только внутри одного домена. |
109105Первоначальная поддержка включала предварительную рендеру только внутри одного домена. |
Нет | 9591Первоначальная поддержка включала предварительную рендеру только внутри одного домена. |
Нет | 109103Первоначальная поддержка включала предварительную рендеру только внутри одного домена. |
Нет | 7471Первоначальная поддержка включала предварительную рендеру только внутри одного домена. |
Нет | 21.020.0Первоначальная поддержка включала предварительную рендеру только внутри одного домена. |
109103Первоначальная поддержка включала предварительную рендеру только внутри одного домена. |
eagerness |
121 | 121 | Нет | 107 | Нет | 121 | Нет | 81 | Нет | 25.0 | 121 |
expects_no_vary_search |
121Поддерживается только дляprefetch. |
121Поддерживается только дляprefetch. |
Нет | 107Поддерживается только дляprefetch. |
Нет | 121Поддерживается только дляprefetch. |
Нет | 81Поддерживается только дляprefetch. |
Нет | 25.0Поддерживается только дляprefetch. |
121Поддерживается только дляprefetch. |
prefetch |
110 | 110 | Нет | 96 | Нет | 103 | Нет | 71 | Нет | 20.0 | 103 |
prerender |
105 | 105 | Нет | 91 | Нет | 103 | Нет | 71 | Нет | 20.0 | 103 |
referrer_policy |
111 | 111 | Нет | 97 | Нет | 111 | Нет | 75 | Нет | 22.0 | 111 |
relative_to |
121 | 121 | Нет | 107 | Нет | 121 | Нет | 81 | Нет | 25.0 | 121 |
requires |
110 | 110 | Нет | 96 | Нет | 103 | Нет | 71 | Нет | 20.0 | 103 |
source_optional |
122 | 122 | Нет | 108 | Нет | 122 | Нет | 81 | Нет | Нет | 122 |
urls |
109 | 109 | Нет | 95 | Нет | 103 | Нет | 71 | Нет | 20.0 | 103 |
where |
121 | 121 | Нет | 107 | Нет | 121 | Нет | 81 | Нет | 25.0 | 121 |
См. также
© 2005–2023 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/HTML/Element/script/type/speculationrules