FetchEvent: метод respondWith()
Базовая поддержка Широко распространена *
Эта функция хорошо зарекомендовала себя и работает на многих устройствах и версиях браузеров. Она доступна в браузерах с апреля 2018 года.
* Некоторые части этой функции могут иметь различный уровень поддержки.
Примечание: Эта функция доступна только в Service Workers.
Метод respondWith() объекта FetchEvent предотвращает обработку запроса браузером по умолчанию и позволяет вам предоставить обещание для Response.
В большинстве случаев вы можете предоставить любой ответ, который понимает получатель. Например, если запрос инициирует элемент <img>, ответ должен содержать данные изображения. По соображениям безопасности есть несколько глобальных правил:
- Вы можете возвращать только объекты
Responseтипаtype"opaque"если объектfetchEvent.requestимеет значениеmodeравное"no-cors". Это предотвращает утечку конфиденциальных данных. - Вы можете возвращать только объекты
Responseтипаtype"opaqueredirect"если объектfetchEvent.requestимеет значениеmodeравное"manual". - Вы не можете возвращать объекты
Responseтипаtype"cors"если объектfetchEvent.requestимеет значениеmodeравное"same-origin".
Указание окончательного URL ресурса
Начиная с Firefox 59, когда сервис-воркер предоставляет Response для FetchEvent.respondWith(), значение Response.url будет распространено на перехваченный сетевой запрос в качестве окончательного разрешенного URL. Если значение Response.url пустое, то используется FetchEvent.request.url как окончательный URL.
Раньше FetchEvent.request.url использовался в качестве окончательного URL во всех случаях. Предоставленное значение Response.url фактически игнорировалось.
Это означает, например, что если сервис-воркер перехватывает запрос на загрузку стилей или скрипта рабочего процесса, то предоставленное значение Response.url будет использоваться для разрешения любых относительных @import или importScripts() подресурсов (баг Firefox 1222008).
Для большинства типов сетевых запросов это изменение не имеет последствий, поскольку вы не можете наблюдать окончательный URL. Однако существуют случаи, когда это важно:
- Если перехватывается запрос
fetch(), то вы можете наблюдать окончательный URL в свойствеResponse.urlрезультата. - Если перехватывается скрипт рабочего процесса, то окончательный URL используется для установки значения
self.locationи используется в качестве базового URL для относительных URL-адресов в скрипте рабочего процесса. - Если перехватывается запрос на стили, то окончательный URL используется в качестве базового URL для разрешения относительных
@importзагрузки.
Обратите внимание, что запросы на навигацию для Windows и iframes НЕ используют окончательный URL. Способ, которым спецификация HTML обрабатывает перенаправления для навигации, в итоге использует URL запроса для полученного Window.location. Это означает, что сайты по-прежнему могут предоставлять «альтернативный» вид веб-страницы при отключении сети, не изменяя отображаемый пользователю URL.
Синтаксис
respondWith(response)
Параметры
Возвращаемое значение
Ничего (undefined).
Исключения
-
NetworkErrorDOMException -
Возвращается, если возникает ошибка сети при определенных сочетаниях значений
FetchEvent.request.modeиResponse.type, как указано в «глобальных правилах» выше. -
InvalidStateErrorDOMException -
Возвращается, если событие ещё не было вызвано или метод
respondWith()уже был вызван.
Примеры
Это событие fetch пытается вернуть ответ из кэша API, в противном случае обращаясь к сети.
addEventListener("fetch", (event) => {
// Prevent the default, and handle the request ourselves.
event.respondWith(
(async () => {
// Try to get the response from a cache.
const cachedResponse = await caches.match(event.request);
// Return it if we found one.
if (cachedResponse) return cachedResponse;
// If we didn't find a match in the cache, use the network.
return fetch(event.request);
})(),
);
});
Примечание: caches.match() — это удобный метод. Эквивалентный функционал — вызов cache.match() для каждого кэша (в порядке, возвращаемом caches.keys()), пока не будет возвращён объект Response.
Спецификации
| Спецификация |
|---|
| Service Workers # fetch-event-respondwith |
Совместимость с браузерами
| Стол | Мобильные | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
| Chrome | Edge | Firefox | Opera | Safari | Chrome Android | Firefox для Android | Opera Android | Safari на iOS | Samsung Internet | WebView Android | |
respondWith |
42 | 17 | 44 | 29 | 11.1 | 42 | 44 | 29 | 11.3 | 4.0 | 42 |
networkerror_on_same-origin_cors |
66 | 79 | 59 | 53 | Нет | 66 | 59 | 47 | Нет | 9.0 | 66 |
resource_url |
Нет | Нет | 59 | Нет | Нет | Нет | 59 | Нет | Нет | Нет | Нет |
См. также
© 2005–2024 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/API/FetchEvent/respondWith