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 Requestem 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!