ServiceWorkerGlobalScope: событие fetch
Базовая Широко поддерживается
Эта функция хорошо зарекомендовала себя и работает на многих устройствах и версиях браузеров. Она доступна в браузерах с апреля 2018 года.
Защищённый контекст: Эта функция доступна только в защищённых контекстах (HTTPS), в некоторых или во всех поддерживающих браузерах.
Примечание: Эта функция доступна только в Service Workers.
Событие fetch интерфейса ServiceWorkerGlobalScope срабатывает в глобальной области видимости service worker, когда поток основного приложения выполняет сетевой запрос. Оно позволяет service worker перехватывать сетевые запросы и отправлять настраиваемые ответы (например, из локального кэша).
Это событие не может быть отменено и не распространяется.
Синтаксис
Используйте имя события в методах, таких как addEventListener(), или задайте свойство обработчика событий.
addEventListener("fetch", (event) => {});
onfetch = (event) => {};
Описание
Событие fetch срабатывает в глобальной области видимости service worker, когда поток основного приложения выполняет сетевой запрос. Это включает не только явные вызовы fetch() из основного потока, но и неявные сетевые запросы для загрузки страниц и подресурсов (например, JavaScript, CSS и изображений), выполняемые браузером после навигации по страницам.
Обработчик события получает объект FetchEvent, предоставляющий доступ к запросу как экземпляру Request.
Объект FetchEvent также предоставляет метод respondWith(), который принимает объект Response (или Promise, который разрешается в Response) в качестве параметра. Это позволяет обработчику события service worker предоставить ответ, который возвращается запросу в основном потоке.
Например, service worker может вернуть:
- Локально кэшированный ответ, полученный из интерфейса
Cache. - Ответ, который service worker генерирует, используя методы, такие как
Response.json()или конструкторResponse(). - Сетевую ошибку, используя метод
Response.error(). Это приведет к отклонению вызоваfetch().
Метод respondWith() может быть вызван только один раз для данного запроса. Если добавлено несколько обработчиков события fetch, они будут вызваны в порядке их регистрации до тех пор, пока один из них не вызовет respondWith().
Метод respondWith() должен вызываться синхронно: то есть вы не можете вызвать его в обработчике then.
Обычно обработчик события fetch будет использовать разные стратегии в зависимости от характеристик запроса, таких как его URL:
function strategy1() {
return fetch("picnic.jpg");
}
function strategy2() {
return Response.error();
}
const pattern1 = /^\/salamander/;
const pattern2 = /^\/lizard/;
self.addEventListener("fetch", (event) => {
const url = new URL(event.request.url);
if (pattern1.test(url.pathname)) {
event.respondWith(strategy1());
} else if (pattern2.test(url.pathname)) {
event.respondWith(strategy2());
}
});
Если respondWith() не вызывается в обработчике, то пользовательский агент автоматически выполняет исходный сетевой запрос. Например, в коде выше все запросы, которые не соответствуют pattern1 или pattern2 обрабатываются как если бы service worker не существовал.
Тип события
Объект FetchEvent.
Примеры
Кэширование с резервным использованием сети
Этот обработчик события fetch сначала пытается найти ответ в кэше. Если ответ найден, возвращается кэшированный ответ. В противном случае, он пытается получить ресурс из сети.
async function cacheThenNetwork(request) {
const cachedResponse = await caches.match(request);
if (cachedResponse) {
console.log("Found response in cache:", cachedResponse);
return cachedResponse;
}
console.log("Falling back to network");
return fetch(request);
}
self.addEventListener("fetch", (event) => {
console.log(`Handling fetch event for ${event.request.url}`);
event.respondWith(cacheThenNetwork(event.request));
});
Только кэш
Этот обработчик события fetch реализует политику «только кэш» для скриптов и стилей. Если свойство destination запроса равно "script" или "style", обработчик ищет только в кэше, возвращая ошибку, если ответ не найден. Все остальные запросы обрабатываются через сеть.
async function cacheOnly(request) {
const cachedResponse = await caches.match(request);
if (cachedResponse) {
console.log("Found response in cache:", cachedResponse);
return cachedResponse;
}
return Response.error();
}
self.addEventListener("fetch", (event) => {
if (
event.request.destination === "script" ||
event.request.destination === "style"
) {
event.respondWith(cacheOnly(event.request));
}
});
Спецификации
Совместимость с браузерами
| Рабочие столы | Мобильные устройства | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
| Chrome | Edge | Firefox | Opera | Safari | Chrome Android | Firefox для Android | Opera Android | Safari на iOS | Samsung Internet | WebView Android | |
fetch_event |
40 | 17 | 44 | 24 | 11.1 | 40 | 44 | 24 | 11.3 | 4.0 | 40 |
См. также
- Использование Service Workers
- Базовый пример кода Service workers
-
fetch()метод -
Requestинтерфейс -
Responseинтерфейс
© 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/ServiceWorkerGlobalScope/fetch_event