CacheStorage
Базовая реализация Широко доступна
Эта функция хорошо зарекомендовала себя и работает на многих устройствах и версиях браузеров. Она доступна во всех браузерах с апреля 2018 года.
Безопасный контекст: Эта функция доступна только в безопасных контекстах (HTTPS) в некоторых или всех поддерживающих браузерах.
Примечание: Эта функция доступна в рабочих потоках.
Интерфейс CacheStorage представляет хранилище для объектов Cache.
Интерфейс:
- Предоставляет главный каталог всех именованных кэшей, к которым можно получить доступ с помощью
ServiceWorkerили другого типа рабочего потока илиwindowобласти видимости (вы не ограничены использованием только с рабочими потоками). - Поддерживает отображение имен строк соответствующим объектам
Cache.
Используйте CacheStorage.open(), чтобы получить экземпляр Cache.
Используйте CacheStorage.match(), чтобы проверить, является ли заданный Request ключом в любом из объектов Cache, которые отслеживает объект CacheStorage.
Вы можете получить доступ к CacheStorage через свойство Window.caches в окнах или через свойство WorkerGlobalScope.caches в рабочих потоках.
Примечание: CacheStorage всегда отклоняет запрос с SecurityError на ненадежных источниках (то есть таких, которые не используют HTTPS, хотя это определение, вероятно, станет сложнее в будущем.) При тестировании в Firefox можно обойти это, установив флажок Включить рабочие потоки через HTTP (когда открыт инструмент разработки) в опциях/меню шестерёнки Firefox DevTools. Кроме того, поскольку CacheStorage требует доступа к файловой системе, он может быть недоступен в режиме инкогнито в Firefox.
Примечание: CacheStorage.match() — это удобный метод. Эквивалентную функциональность для сопоставления записи кэша можно реализовать, вернув массив имён кэшей из CacheStorage.keys(), открыв каждый кэш с помощью CacheStorage.open() и сопоставив необходимый с помощью Cache.match().
Методы экземпляра
CacheStorage.match()-
Проверяет, является ли заданный
Requestключом в любом из объектовCache, которые отслеживает объектCacheStorage, и возвращаетPromise, который разрешается до этого совпадения. CacheStorage.has()-
Возвращает
Promise, который разрешается доtrue, если существует объектCache, соответствующийcacheName. CacheStorage.open()-
Возвращает
Promise, который разрешается до объектаCache, соответствующегоcacheName(новый кэш создается, если он ещё не существует). CacheStorage.delete()-
Ищет объект
Cache, соответствующийcacheName, и если найден, удаляет объектCacheи возвращаетPromise, который разрешается доtrue. Если объектCacheне найден, он разрешается доfalse. CacheStorage.keys()-
Возвращает
Promise, который разрешится массивом, содержащим строки, соответствующие всем именованным объектамCache, отслеживаемым объектомCacheStorage. Используйте этот метод для перебора списка всех объектовCache.
Примеры
Этот фрагмент кода взят из примера простого рабочего потока MDN по адресу пример простого рабочего потока (смотрите работающий пример простого рабочего потока.) Этот скрипт рабочего потока ожидает срабатывания события install, затем выполняет waitUntil для обработки процесса установки приложения. Это включает вызов CacheStorage.open для создания нового кэша, а затем использование Cache.addAll для добавления ряда ресурсов в него.
Во втором блоке кода мы ждём срабатывания события FetchEvent. Мы создаём пользовательский ответ следующим образом:
- Проверяем, найдено ли совпадение для запроса в CacheStorage. Если да, обслуживаем его.
- Если нет, получаем запрос из сети, затем открываем созданный в первом блоке кэш и добавляем клон запроса в него с помощью
Cache.put(cache.put(event.request, response.clone())). - Если это не удалось (например, из-за отсутствия подключения к сети), возвращаем ответ по умолчанию.
Наконец, возвращаем то, что пользовательский ответ в итоге стал равным, используя FetchEvent.respondWith.
self.addEventListener("install", (event) => {
event.waitUntil(
caches
.open("v1")
.then((cache) =>
cache.addAll([
"/",
"/index.html",
"/style.css",
"/app.js",
"/image-list.js",
"/star-wars-logo.jpg",
"/gallery/bountyHunters.jpg",
"/gallery/myLittleVader.jpg",
"/gallery/snowTroopers.jpg",
]),
),
);
});
self.addEventListener("fetch", (event) => {
event.respondWith(
caches.match(event.request).then((response) => {
// caches.match() always resolves
// but in case of success response will have value
if (response !== undefined) {
return response;
} else {
return fetch(event.request)
.then((response) => {
// response may be used only once
// we need to save clone to put one copy in cache
// and serve second one
let responseClone = response.clone();
caches.open("v1").then((cache) => {
cache.put(event.request, responseClone);
});
return response;
})
.catch(() => caches.match("/gallery/myLittleVader.jpg"));
}
}),
);
});
Этот фрагмент демонстрирует, как API можно использовать вне контекста рабочего потока и использует оператор await для более читаемого кода.
// Try to get data from the cache, but fall back to fetching it live.
async function getData() {
const cacheVersion = 1;
const cacheName = `myapp-${cacheVersion}`;
const url = "https://jsonplaceholder.typicode.com/todos/1";
let cachedData = await getCachedData(cacheName, url);
if (cachedData) {
console.log("Retrieved cached data");
return cachedData;
}
console.log("Fetching fresh data");
const cacheStorage = await caches.open(cacheName);
await cacheStorage.add(url);
cachedData = await getCachedData(cacheName, url);
await deleteOldCaches(cacheName);
return cachedData;
}
// Get data from the cache.
async function getCachedData(cacheName, url) {
const cacheStorage = await caches.open(cacheName);
const cachedResponse = await cacheStorage.match(url);
if (!cachedResponse || !cachedResponse.ok) {
return false;
}
return await cachedResponse.json();
}
// Delete any old caches to respect user's disk space.
async function deleteOldCaches(currentCache) {
const keys = await caches.keys();
for (const key of keys) {
const isOurCache = key.startsWith("myapp-");
if (currentCache === key || !isOurCache) {
continue;
}
caches.delete(key);
}
}
try {
const data = await getData();
console.log({ data });
} catch (error) {
console.error({ error });
}
Спецификации
| Спецификация |
|---|
| Рабочие потоки # cachestorage-interface |
Совместимость с браузерами
| Рабочий стол | Мобильные устройства | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
| Chrome | Edge | Firefox | Opera | Safari | Chrome Android | Firefox для Android | Opera Android | Safari на iOS | Samsung Internet | WebView Android | |
CacheStorage |
4340–43Доступно только в рабочих потоках. |
16 | 41 | 3027–30Доступно только в рабочих потоках. |
11.1 | 4340–43Доступно только в рабочих потоках. |
41 | 3027–30Доступно только в рабочих потоках. |
11.3 | 4.0 | 4340–43Доступно только в рабочих потоках. |
delete |
40 | 16 | 41 | 27 | 11.1 | 40 | 41 | 27 | 11.3 | 4.0 | 40 |
has |
40 | 16 | 41 | 27 | 11.1 | 40 | 41 | 27 | 11.3 | 4.0 | 40 |
keys |
40 | 16 | 41 | 27 | 11.1 | 40 | 41 | 27 | 11.3 | 4.0 | 40 |
match |
5440Параметр options поддерживает толькоignoreSearch, и cacheName. |
16 | 41 | 4127Параметр options поддерживает толькоignoreSearch, и cacheName. |
11.1 | 5440Параметр options поддерживает толькоignoreSearch, и cacheName. |
41 | 4127Параметр options поддерживает толькоignoreSearch, и cacheName. |
11.3 | 6.04.0Параметр options поддерживает толькоignoreSearch, и cacheName. |
5440Параметр options поддерживает толькоignoreSearch, и cacheName. |
open |
40 | 16 | 41 | 27 | 11.1 | 40 | 41 | 27 | 11.3 | 4.0 | 40 |
secure_context_required |
65 | 79 | 44 | 52 | 11.1 | 65 | 44 | 47 | 11.3 | 9.0 | 65 |
worker_support |
4340–43Доступно только в рабочих потоках. |
16 | 44 | 3027–30Доступно только в рабочих потоках. |
11.1 | 4340–43Доступно только в рабочих потоках. |
44 | 3027–30Доступно только в рабочих потоках. |
11.3 | 4.0 | 4340–43Доступно только в рабочих потоках. |
См. также
© 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/CacheStorage