Este codelab mostra como alterar os cabeçalhos de cache HTTP retornados por uma Servidor da Web baseado em Node.js que executa a veiculação Express. de análise de dados em nuvem. Ele também mostra como confirmar se o comportamento de armazenamento em cache esperado está sendo aplicada, usando o painel Network no DevTools do Chrome.
Conhecer o projeto de exemplo
Estes são os principais arquivos com os quais você trabalhará no projeto de exemplo:
server.js
contém o código Node.js que disponibiliza o serviço do app da Web conteúdo. Ele usa o Express para processar solicitações HTTP. e respostas. Mais especificamente, oexpress.static()
é usado para exibir os arquivos locais no diretório público, para que oserve-static
documentação serão muito úteis.public/index.html
é o HTML do app da Web. Como a maioria dos arquivos HTML, ele não conter qualquer informação de controle de versão como parte do URL.public/app.15261a07.js
epublic/style.391484cf.css
são o JavaScript do app da Web e CSS. Cada arquivo contém um hash em seus URLs, correspondentes ao seu conteúdo. Oindex.html
é responsável por manter acompanhar qual URL específico será carregado.
Configure cabeçalhos de cache para nosso HTML
Ao responder a solicitações de URLs que não contêm informações de controle de versões,
adicione Cache-Control: no-cache
às suas mensagens de resposta. Junto com
é recomendável definir um dos dois cabeçalhos de resposta adicionais:
Last-Modified
ou ETag
. A
index.html
se encaixa nessa categoria. É possível dividir isso em duas etapas.
Primeiro, os cabeçalhos Last-Modified
e ETag
são controlados pelo
etag
e
lastModified
de configuração do Terraform. Na verdade, as duas opções são padronizadas como true
para todos os
respostas HTTP. Portanto, nesta configuração atual, você não precisa ativar para recebê-las
do seu modelo. Mas é possível definir explicitamente a configuração de qualquer maneira.
Em segundo lugar, você precisa adicionar o cabeçalho Cache-Control: no-cache
, mas
somente para seus documentos HTML (neste caso, index.html
). A maneira mais fácil de
definir condicionalmente esse cabeçalho é gravar um
setHeaders function
,
e, dentro dele, verifique se a solicitação de entrada é de um documento HTML.
- Clique em Remixar para editar para tornar o projeto editável.
A configuração de exibição estática no server.js
começa assim:
app.use(express.static('public'));
- Faça as alterações descritas acima e você deve acabar com algo que é semelhante a:
app.use(express.static('public', {
etag: true, // Just being explicit about the default.
lastModified: true, // Just being explicit about the default.
setHeaders: (res, path) => {
if (path.endsWith('.html')) {
// All of the project's HTML files end in .html
res.setHeader('Cache-Control', 'no-cache');
}
},
}));
Configurar cabeçalhos de armazenamento em cache para URLs com controle de versão
Ao responder a solicitações de URLs que contêm
"impressão digital" ou
informações de controle de versões e cujo conteúdo não possa ser alterado, adicione
Cache-Control: max-age=31536000
às suas respostas. Os métodos app.15261a07.js
e
style.391484cf.css
se enquadram nessa categoria.
Desenvolvimento fora do
setHeaders function
usada na última etapa, é possível adicionar lógica adicional para verificar se um determinado
é para um URL com controle de versão. Nesse caso, adicione o cabeçalho Cache-Control:
max-age=31536000
.
A maneira mais eficiente de fazer isso é usar uma
expressão regular
para ver se o recurso solicitado corresponde a um padrão específico que você
saber que os hashes se enquadram. No caso deste exemplo de projeto, são sempre oito
caracteres do conjunto de dígitos de 0 a 9 e as letras minúsculas de a a f (ou seja,
hexadecimal). O hash
são sempre separados por um caractere .
em ambos os lados.
Uma expressão regular que
corresponde às regras gerais
pode ser expressada como new RegExp('\\.[0-9a-f]{8}\\.')
.
- Modifique a função
setHeaders
para que ela fique assim:
app.use(express.static('public', {
etag: true, // Just being explicit about the default.
lastModified: true, // Just being explicit about the default.
setHeaders: (res, path) => {
const hashRegExp = new RegExp('\\.[0-9a-f]{8}\\.');
if (path.endsWith('.html')) {
// All of the project's HTML files end in .html
res.setHeader('Cache-Control', 'no-cache');
} else if (hashRegExp.test(path)) {
// If the RegExp matched, then we have a versioned URL.
res.setHeader('Cache-Control', 'max-age=31536000');
}
},
}));
Confirmar o novo comportamento usando o DevTools
Com as modificações no servidor de arquivos estáticos, você pode verificar verifique se os cabeçalhos certos estão sendo definidos visualizando o aplicativo ativo com o painel DevTools Network aberto.
Para visualizar o site, pressione Ver app. Em seguida, pressione Tela cheia
Personalize as colunas exibido no painel "Network" para incluir as informações mais relevantes, clicando com o botão direito no cabeçalho da coluna:
Aqui, as colunas a serem observadas são Name
, Status
, Cache-Control
,
ETag
e Last-Modified
.
- Com o DevTools aberto no painel Network, atualize a página.
Após o carregamento da página, você verá entradas no painel Network que parecem como o seguinte:
A primeira linha é para o documento HTML que você acessou. Isso é apropriado
veiculado com Cache-Control: no-cache
. O status da resposta HTTP para a solicitação
é um 304
. Isso
significa que o navegador sabia não usar o HTML armazenado em cache imediatamente, mas em vez
fez uma solicitação HTTP ao servidor da Web, usando Last-Modified
e ETag
para ver se há alguma atualização no HTML que ela já tinha no
para o cache. A resposta HTTP 304 indica que não há HTML atualizado.
As próximas duas linhas são para os recursos JavaScript e CSS com controle de versão. Você deve
vê-los veiculados com Cache-Control: max-age=31536000
, e o status HTTP dos
cada um é 200
.
Devido à configuração usada, nenhuma solicitação real é feita ao
servidor Node.js. Clique na entrada para ver mais detalhes.
incluindo que a resposta veio "(do cache de disco)".
Os valores reais das colunas "ETag" e "Última modificação" não importam muito. A o mais importante é confirmar se eles estão sendo definidos.
Resumindo
Após concluir as etapas deste codelab, você sabe como configurar os cabeçalhos de resposta HTTP em um servidor da Web baseado em Node.js usando o Express; para otimizar o uso do cache HTTP. Você também tem as etapas de que precisa confirmar que o comportamento de armazenamento em cache esperado está sendo usado, por meio do painel Network no DevTools do Chrome.