Кэш
Базовая реализация Широко доступна
Эта функция хорошо зарекомендовала себя и работает на многих устройствах и версиях браузеров. Она доступна в браузерах с апреля 2018 года.
Безопасный контекст: Эта функция доступна только в безопасных контекстах (HTTPS) в некоторых или во всех поддерживающих браузерах.
Примечание: Эта функция доступна в Web Workers.
Интерфейс Cache предоставляет механизм постоянного хранения пар объектов Request / Response, которые кэшируются в долговременной памяти. Время жизни объекта Cache зависит от браузера, но скрипты одного источника обычно могут полагаться на наличие ранее заполненного объекта Cache. Обратите внимание, что интерфейс Cache доступен как для оконных областей, так и для рабочих процессов. Вам не обязательно использовать его вместе с service workers, хотя он определен в спецификации service worker.
Один источник может иметь несколько именованных объектов Cache. Вы отвечаете за реализацию того, как ваш скрипт (например, в ServiceWorker) обрабатывает обновления Cache. Элементы в объекте Cache не обновляются автоматически, если это не запрошено явно; они не истекают, пока не будут удалены. Используйте CacheStorage.open() для открытия конкретного именованного объекта Cache и затем вызовите любой из методов Cache для поддержания Cache.
Вы также несете ответственность за периодическую очистку записей кэша. Каждый браузер имеет жёсткий лимит на объём кэша, который может использовать данный источник. Оценки использования квоты Cache доступны через метод StorageManager.estimate(). Браузер делает всё возможное, чтобы управлять объёмом дискового пространства, но он может удалить хранилище Cache для данного источника. Браузер обычно удаляет все данные для источника или ни одного. Убедитесь, что вы используете кэши с именами, отражающими версии скриптов, на которых они могут безопасно работать. См. Удаление устаревших кэшей для получения дополнительной информации.
Примечание: Алгоритм сопоставления ключей зависит от заголовка VARY в значении. Таким образом, для сопоставления нового ключа необходимо проверить и ключ, и значение для записей в объекте Cache.
Примечание: API кэширования не учитывает HTTP-заголовки кэширования.
Методы экземпляров
Cache.match()-
Возвращает
Promise, который разрешается до ответа, связанного с первым соответствующим запросом в объектеCache. Cache.matchAll()-
Возвращает
Promise, который разрешается до массива всех соответствующих ответов в объектеCache. Cache.add()-
Принимает URL, получает его и добавляет результирующий объект ответа в заданный кэш. Функционально эквивалентно вызову
fetch(), а затем использованиюput()для добавления результатов в кэш. Cache.addAll()-
Принимает массив URL, получает их и добавляет результирующие объекты ответа в заданный кэш.
Cache.put()-
Принимает запрос и его ответ и добавляет их в заданный кэш.
Cache.delete()-
Находит запись
Cache, ключ которой равен запросу, возвращаяPromise, который разрешается доtrueесли соответствующая записьCacheнайдена и удалена. Если записьCacheне найдена, обещание разрешается доfalse. Cache.keys()-
Возвращает
Promise, который разрешается до массива ключейCache.
Примеры
Этот фрагмент кода взят из примера выборочного кэширования service worker. (см. выборочное кэширование в живом виде) Код использует CacheStorage.open() для открытия всех объектов Cache с заголовком Content-Type , который начинается с font/.
Затем код использует Cache.match(), чтобы проверить, есть ли уже соответствующий шрифт в кэше, и если да, возвращает его. Если соответствующего шрифта нет, код получает шрифт из сети и использует Cache.put() для кэширования полученного ресурса.
Код обрабатывает исключения, возникающие при операции fetch(). Обратите внимание, что HTTP-ответ с ошибкой (например, 404) не вызовет исключения. Он вернёт обычный объект ответа с соответствующим кодом ошибки.
Фрагмент кода также демонстрирует лучшие практики по версиированию кэшей, используемых service worker. Хотя в этом примере всего один кэш, тот же подход можно использовать для нескольких кэшей. Он сопоставляет сокращённый идентификатор кэша со специфичным, версионным именем кэша. Код также удаляет все кэши, которые не указаны в CURRENT_CACHES.
В примере кода caches является свойством ServiceWorkerGlobalScope. Он содержит объект CacheStorage, с помощью которого он может получить доступ к интерфейсу CacheStorage.
Примечание: В Chrome, посетите chrome://inspect/#service-workers и нажмите на ссылку "просмотреть" под зарегистрированным service worker, чтобы просмотреть журналы действий, которые выполняет скрипт service-worker.js.
const CACHE_VERSION = 1;
const CURRENT_CACHES = {
font: `font-cache-v${CACHE_VERSION}`,
};
self.addEventListener("activate", (event) => {
// Delete all caches that aren't named in CURRENT_CACHES.
// While there is only one cache in this example, the same logic
// will handle the case where there are multiple versioned caches.
const expectedCacheNamesSet = new Set(Object.values(CURRENT_CACHES));
event.waitUntil(
caches.keys().then((cacheNames) =>
Promise.all(
cacheNames.map((cacheName) => {
if (!expectedCacheNamesSet.has(cacheName)) {
// If this cache name isn't present in the set of
// "expected" cache names, then delete it.
console.log("Deleting out of date cache:", cacheName);
return caches.delete(cacheName);
}
}),
),
),
);
});
self.addEventListener("fetch", (event) => {
console.log("Handling fetch event for", event.request.url);
event.respondWith(
caches.open(CURRENT_CACHES.font).then((cache) => {
return cache
.match(event.request)
.then((response) => {
if (response) {
// If there is an entry in the cache for event.request,
// then response will be defined and we can just return it.
// Note that in this example, only font resources are cached.
console.log(" Found response in cache:", response);
return response;
}
// Otherwise, if there is no entry in the cache for event.request,
// response will be undefined, and we need to fetch() the resource.
console.log(
" No response for %s found in cache. About to fetch " +
"from network…",
event.request.url,
);
// We call .clone() on the request since we might use it
// in a call to cache.put() later on.
// Both fetch() and cache.put() "consume" the request,
// so we need to make a copy.
// (see https://developer.mozilla.org/en-US/docs/Web/API/Request/clone)
return fetch(event.request.clone()).then((response) => {
console.log(
" Response for %s from network is: %O",
event.request.url,
response,
);
if (
response.status < 400 &&
response.headers.has("content-type") &&
response.headers.get("content-type").match(/^font\//i)
) {
// This avoids caching responses that we know are errors
// (i.e. HTTP status code of 4xx or 5xx).
// We also only want to cache responses that correspond
// to fonts, i.e. have a Content-Type response header that
// starts with "font/".
// Note that for opaque filtered responses
// https://fetch.spec.whatwg.org/#concept-filtered-response-opaque
// we can't access to the response headers, so this check will
// always fail and the font won't be cached.
// All of the Google Web Fonts are served from a domain that
// supports CORS, so that isn't an issue here.
// It is something to keep in mind if you're attempting
// to cache other resources from a cross-origin
// domain that doesn't support CORS, though!
console.log(" Caching the response to", event.request.url);
// We call .clone() on the response to save a copy of it
// to the cache. By doing so, we get to keep the original
// response object which we will return back to the controlled
// page.
// https://developer.mozilla.org/en-US/docs/Web/API/Request/clone
cache.put(event.request, response.clone());
} else {
console.log(" Not caching the response to", event.request.url);
}
// Return the original response object, which will be used to
// fulfill the resource request.
return response;
});
})
.catch((error) => {
// This catch() will handle exceptions that arise from the match()
// or fetch() operations.
// Note that a HTTP error response (e.g. 404) will NOT trigger
// an exception.
// It will return a normal response object that has the appropriate
// error code set.
console.error(" Error in fetch handler:", error);
throw error;
});
}),
);
});
Cookies и объекты кэша
Fetch API требует, чтобы заголовки Set-Cookie были удалены перед возвращением объекта Response из fetch(). Поэтому объект Response , хранящийся в объекте Cache , не будет содержать заголовков Set-Cookie и, следовательно, не вызовет сохранение cookie.
Спецификации
| Спецификация |
|---|
| Service Workers # cache-interface |
Совместимость браузеров
| Рабочий стол | Мобильный | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
| Chrome | Edge | Firefox | Opera | Safari | Chrome Android | Firefox для Android | Opera Android | Safari в IOS | Samsung Internet | WebView Android | |
Cache |
40До версии 43 поддерживаются только service worker. С версии 43 поддерживаются все типы worker и основной поток. |
16 | 41 | 27До версии 30 поддерживаются только service worker. С версии 30 поддерживаются все типы worker и основной поток. |
11.1 | 40До версии 43 поддерживаются только service worker. С версии 43 поддерживаются все типы worker и основной поток. |
41 | 27До версии 30 поддерживаются только service worker. С версии 30 поддерживаются все типы worker и основной поток. |
11.3 | 4.0 | 40До версии 43 поддерживаются только service worker. С версии 43 поддерживаются все типы worker и основной поток. |
add |
44Требуется HTTPS с версии 46. |
16 | 41 | 31Требуется HTTPS с версии 33. |
11.1 | 44Требуется HTTPS с версии 46. |
41 | 32Требуется HTTPS с версии 33. |
11.3 | 4.0Требуется HTTPS с Samsung Internet 5.0. |
44Требуется HTTPS с версии 46. |
addAll |
46Требуется HTTPS. |
16 | 41 | 33Требуется HTTPS. |
11.1 | 46Требуется HTTPS. |
41 | 33Требуется HTTPS. |
11.3 | 5.0Требуется HTTPS. |
46Требуется HTTPS. |
delete |
43 | 16 | 41 | 30 | 11.1 | 43 | 41 | 30 | 11.3 | 4.0 | 43 |
keys |
43 | 16 | 41 | 30 | 11.1 | 43 | 41 | 30 | 11.3 | 4.0 | 43 |
match |
43 | 16 | 41 | 30 | 11.1 | 43 | 41 | 30 | 11.3 | 4.0 | 43 |
matchAll |
47 | 16 | 41 | 34Требуется HTTPS. |
11.1 | 47 | 41 | 34 | 11.3 | 5.0 | 47 |
put |
43Требуется HTTPS с версии 46. |
16 | 41 | 30Требуется HTTPS с версии 33. |
11.1 | 43Требуется HTTPS с версии 46. |
41 | 30Требуется HTTPS с версии 33. |
11.3 | 4.0Требуется HTTPS с Samsung Internet 5.0. |
43Требуется HTTPS с версии 46. |
worker_support |
40До версии 43 поддерживаются только service worker. С версии 43 поддерживаются все типы worker и основной поток. |
16 | 44 | 27До версии 30 поддерживаются только service worker. С версии 30 поддерживаются все типы worker и основной поток. |
11.1 | 40До версии 43 поддерживаются только service worker. С версии 43 поддерживаются все типы worker и основной поток. |
44 | 27До версии 30 поддерживаются только service worker. С версии 30 поддерживаются все типы worker и основной поток. |
11.3 | 4.0 | 40До версии 43 поддерживаются только service worker. С версии 43 поддерживаются все типы worker и основной поток. |
См. также
© 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/Cache