Um padrão no mundo das APIs JavaScript que os veteranos em desenvolvimento da Web perceberão é que estamos criando novos métodos para realizar o que as APIs mais antigas e grosseiras já realizaram. XMLHttpRequest tornou-se a fetch algumas APIs, como a Battery, tornaram-se assíncronas, e há dezenas de outros exemplos. Outra API que precisa desesperadamente de atualização é a API de cookies… e finalmente conseguimos: cookieStore.
A nova API de cookies, cookieStore, é assíncrona e fornece um método lógico para o gerenciamento de cookies. É preciso lembrar que o método anterior de obter e definir cookies girava completamente em torno da concatenação e análise de document.cookie como uma string. O senhor não acredita em mim? Dê uma olhada nessa monstruosidade!
document.cookie="__Secure-COOKIENAME=cookie-value" +
'; Path=/' +
'; expires=Fri, 12 Aug 2016 23:05:17 GMT' +
'; Secure' +
'; Domain=example.org';
// now we could assume the write succeeded, but since
// failure is silent it is difficult to tell, so we
// read to see whether the write succeeded
var successRegExp =
/(^|; ?)__Secure-COOKIENAME=cookie-value(;|$)/;
if (String(document.cookie).match(successRegExp)) {
console.log('It worked!');
} else {
console.error('It did not work, and we do not know why');
}
Vamos nos concentrar no uso dessa nova API, cookieStore, para trazer sanidade aos cookies!
Se realmente quiser ver como os cookies são apresentados a você agora, acesse seu site favorito e digite document.cookie . Que horror!
Definir um cookie
cookieStore.set permite que o senhor defina um cookie com nome, valor e outros detalhes específicos:
// All cookieStore methods are async, so you can `await` or `then`/`catch`
await cookieStore.set({
name: "dw-test",
value: 1,
domain: 'davidwalsh.name',
// Very far in the future!
expires: Date.now() + Date.now()
});
// Quick, naive set
await cookieStore.set('key', 'value');
Isso é muito melhor do que concatenar uma string estranha em uma string já estranha document.cookie!
Obter um cookie
cookieStore.get fornece um método para obter o valor de um cookie específico:
const testCookie = await cookieStore.get('dw-test');
{
domain: "davidwalsh.name",
expires: 3206289322149,
name: "dw-test",
path: "/",
sameSite: "strict",
secure: true,
value: "1",
}
Se o cookie existir e não tiver expirado, o valor e muito mais sobre o cookie serão retornados. Sim, um simples get em vez de analisar uma string! Tenho lágrimas nos olhos!
Excluir um cookie
Podemos usar cookieStore.delete para remover um cookie:
await cookieStore.delete('dw-test');
Tão simples quanto o senhor espera!
Evento de mudança de cookie
Se quiser saber quando os cookies estão sendo criados, excluídos ou modificados, o senhor pode ouvir o evento change no site do cookieStore:
cookieStore.addEventListener('change', event => {
console.log(`${event.changed.length} changed cookies`);
for (const cookie in event.changed)
console.log(`Cookie ${cookie.name} changed to ${cookie.value}`);
console.log(`${event.deleted.length} deleted cookies`);
for (const cookie in event.deleted)
console.log(`Cookie ${cookie.name} deleted`);
});
Estou muito feliz que o antigo document.cookie esteja sendo substituído por este incrível e simples cookieStore API. Avante e para cima com as APIs JavaScript! Qual API herdada o senhor gostaria de ver melhorada em seguida?