A incrível API ServiceWorker foi criada para dar aos desenvolvedores um pouco mais de controle sobre o que é e o que não é armazenado em cache, e como. É claro que podemos brincar com ETags e coisas do gênero, mas fazer isso de forma programática com JavaScript parece melhor e mais controlável. No entanto, como acontece com todas as APIs, adicionar coisas ao cache não é apenas diversão e jogos – o senhor também precisa fazer o trabalho de limpeza, e por “trabalho de limpeza” quero dizer ter que excluir o cache.
Vamos dar uma olhada em como o senhor pode obter caches, adicionar e excluir solicitações de caches e como pode excluir um cache inteiro!
Detectando o cache
API
Para detectar se o navegador é compatível com a API de cache…
if('caches' in window) { // Has support! }
…verifique a presença do caches
dentro do objeto window
.
Criando um cache
A criação de um cache requer um caches.open
com um nome de cache:
caches.open('test-cache').then(function(cache) { // Cache is created and accessible });
O caches.open
retorna um Promessa e o cache
que foi criado ou já existia antes do open
chamada.
Adicionando ao cache
O senhor pode pensar em um cache como uma matriz de Request
objetos que funcionam como chaves para suas respostas, que são armazenadas pelo navegador;
A adição simples ao cache é feita por meio de dois métodos principais: add
e addAll
. O senhor pode fornecer a esses métodos uma string para a URL que deve ser
buscado e armazenado em cache ou um Request
. O senhor pode saber mais sobre Request
lendo meu artigo sobre objetos buscar API post.
Para adicionar URLs em lote ao cache, o senhor pode usar o comando addAll
method:
caches.open('test-cache').then(function(cache) { cache.addAll(['/', '/images/logo.png']) .then(function() { // Cached! }); });
O addAll
aceita uma matriz de URLs cujas URLs e respostas devem ser armazenadas em cache. addAll
retorna uma Promise. Para adicionar um único URL, use a opção add
:
caches.open('test-cache').then(function(cache) { cache.add('/page/1'); // "/page/1" URL will be fetched and cached! });
add
também pode aceitar um Request
:
caches.open('test-cache').then(function(cache) { cache.add(new Request('/page/1', { /* request options */ })); });
Semelhante a add
é put
no qual o senhor pode adicionar uma URL e seu Response
objeto:
fetch('/page/1').then(function(response) { return caches.open('test-cache').then(function(cache) { return cache.put('/page/1', response); }); });
Explorando o cache
Para visualizar as solicitações que já foram armazenadas em cache, o senhor pode usar a função keys
do cache individual para recuperar uma matriz de Request
objetos:
caches.open('test-cache').then(function(cache) { cache.keys().then(function(cachedRequests) { console.log(cachedRequests); // [Request, Request] }); }); /* Request { bodyUsed: false credentials: "omit" headers: Headers integrity: "" method: "GET" mode: "no-cors" redirect: "follow" referrer: "" url: "https://fullhost.tld/images/logo.png" } */
Se o senhor quiser ver a resposta de um arquivo Request
em cache, o senhor pode fazer isso usando cache.match
ou cache.matchAll
:
caches.open('test-cache').then(function(cache) { cache.match('/page/1').then(function(matchedResponse) { console.log(matchedResponse); }); }); /* Response { body: (...), bodyUsed: false, headers: Headers, ok: true, status: 200, statusText: "OK", type: "basic", url: "https://davidwalsh.name/page/1" } */
O senhor pode saber mais sobre Response
lendo meu artigo buscar API post.
Remoção de uma solicitação em cache
Para remover uma solicitação do cache, use a função delete
do cache:
caches.open('test-cache').then(function(cache) { cache.delete('/page/1'); });
O cache não conterá mais /page/1
!
Obtendo nomes de cache existentes
Para obter os nomes dos caches existentes, use caches.keys
:
caches.keys().then(function(cacheKeys) { console.log(cacheKeys); // ex: ["test-cache"] });
window.caches.keys()
retorna novamente um promessa.
Exclusão de um cache
A exclusão de um cache é simples quando o senhor tem o nome da chave do cache:
caches.delete('test-cache').then(function() { console.log('Cache successfully deleted!'); });
Muitas vezes, o senhor excluirá um cache quando estiver substituindo por um novo (para acionar a reinstalação de um novo service worker):
// Assuming `CACHE_NAME` is the newest name // Time to clean up the old! var CACHE_NAME = 'version-8'; // ... caches.keys().then(function(cacheNames) { return Promise.all( cacheNames.map(function(cacheName) { if(cacheName != CACHE_NAME) { return caches.delete(cacheName); } }) ); });
O senhor deve manter esses snippets em sua caixa de ferramentas para quando quiser se tornar um especialista em service worker. O Chrome e o Firefox agora têm suporte para service worker, portanto, o senhor verá muito mais sites/aplicativos disponíveis (de forma confiável) off-line e carregando em taxas muito mais rápidas. Aproveite!