Spec-Zone.ru › Web APIs

Кэш

Базовая реализация Широко доступна

Эта функция хорошо зарекомендовала себя и работает на многих устройствах и версиях браузеров. Она доступна в браузерах с апреля 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 и основной поток.

См. также

  • Использование Service Workers
  • Пример кода Service workers
  • Использование web workers

© 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

Spec-Zone.ru

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