Spec-Zone.ru › Web APIs

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. Мы создаём пользовательский ответ следующим образом:

  1. Проверяем, найдено ли совпадение для запроса в CacheStorage. Если да, обслуживаем его.
  2. Если нет, получаем запрос из сети, затем открываем созданный в первом блоке кэш и добавляем клон запроса в него с помощью Cache.put (cache.put(event.request, response.clone())).
  3. Если это не удалось (например, из-за отсутствия подключения к сети), возвращаем ответ по умолчанию.

Наконец, возвращаем то, что пользовательский ответ в итоге стал равным, используя 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 43
40–43Доступно только в рабочих потоках.
16 41 30
27–30Доступно только в рабочих потоках.
11.1 43
40–43Доступно только в рабочих потоках.
41 30
27–30Доступно только в рабочих потоках.
11.3 4.0 43
40–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 54
40Параметр options поддерживает только ignoreSearch, и cacheName.
16 41 41
27Параметр options поддерживает только ignoreSearch, и cacheName.
11.1 54
40Параметр options поддерживает только ignoreSearch, и cacheName.
41 41
27Параметр options поддерживает только ignoreSearch, и cacheName.
11.3 6.0
4.0Параметр options поддерживает только ignoreSearch, и cacheName.
54
40Параметр 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 43
40–43Доступно только в рабочих потоках.
16 44 30
27–30Доступно только в рабочих потоках.
11.1 43
40–43Доступно только в рабочих потоках.
44 30
27–30Доступно только в рабочих потоках.
11.3 4.0 43
40–43Доступно только в рабочих потоках.

См. также

  • Использование рабочих потоков
  • Cache
  • Window.caches и WorkerGlobalScope.caches
  • Режим инкогнито/приватного просмотра

© 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API