No momento, estamos trabalhando em um novo projeto com atualizações regulares que está sendo usado diariamente por um de nossos clientes. Este projeto está sendo desenvolvido usando o angular 2 e estamos enfrentando problemas de cache, ou seja, nossos clientes não estão vendo as alterações mais recentes em suas máquinas.
Principalmente os arquivos html / css para os arquivos js parecem ser atualizados corretamente sem dar muitos problemas.
ng build
, adicionar a-prod
tag adiciona um hash aos nomes de arquivo gerados. Isso força a recarga de tudo menosindex.html
. Este post no github deu algumas dicas sobre como recarregar.Respostas:
angular-cli resolve isso fornecendo um
--output-hashing
sinalizador para o comando build (versões 6/7, para versões posteriores, veja aqui ). Exemplo de uso:Bundling & Tree-Shaking fornece alguns detalhes e contexto. Em execução
ng help build
, documenta a bandeira:Embora isso seja aplicável apenas a usuários do angular-cli , ele funciona de maneira brilhante e não requer nenhuma alteração de código ou ferramentas adicionais.
Atualizar
Vários comentários indicaram de forma útil e correta que essa resposta adiciona um hash aos
.js
arquivos, mas não faz nada para issoindex.html
. Portanto, é perfeitamente possível queindex.html
permaneça em cache após ong build
cache bloquear os.js
arquivos.Neste ponto, irei passar para Como controlamos o cache de páginas da web em todos os navegadores?
fonte
Encontrou uma maneira de fazer isso, basta adicionar uma string de consulta para carregar seus componentes, assim:
Isso deve forçar o cliente a carregar a cópia do modelo do servidor em vez da do navegador. Se desejar que ele seja atualizado somente após um determinado período, você pode usar este ISOString:
E substring de alguns caracteres para que só mude depois de uma hora, por exemplo:
Espero que isto ajude
fonte
templateUrl: './app/shared/menu/menu.html?v=' + Math.random()
Em cada modelo html, acabei de adicionar as seguintes metatags no topo:
No meu entendimento, cada modelo é independente, portanto, ele não herda a configuração de regras meta no cache no arquivo index.html.
fonte
Uma combinação da resposta de @Jack e da resposta de @ranierbit deve resolver o problema.
Defina o sinalizador de construção ng para --output-hashing para:
Em seguida, adicione essa classe em um serviço ou em seu app.moudle
Em seguida, adicione isso aos seus provedores em seu app.module:
Isso deve evitar problemas de cache em sites ativos para máquinas clientes
fonte
Eu tive um problema semelhante com o index.html sendo armazenado em cache pelo navegador ou mais complicado por meio de cdn / proxies (F5 não ajudará você).
Procurei uma solução que verifique 100% se o cliente tem a última versão index.html, felizmente encontrei esta solução de Henrik Peinar:
https://blog.nodeswat.com/automagic-reload-for-clients-after-deploy-with-angular-4-8440c9fdd96c
A solução resolve também o caso em que o cliente fica com o navegador aberto por dias, o cliente verifica se há atualizações em intervalos e recarrega se uma versão mais recente for implantada.
A solução é um pouco complicada, mas funciona perfeitamente:
ng cli -- prod
produz arquivos hash com um deles chamado main. [hash] .jsComo a solução de Henrik Peinar era para angular 4, houve pequenas mudanças, coloco também os scripts fixos aqui:
VersionCheckService:
mude para AppComponent principal:
O script de pós-construção que faz a mágica, post-build.js:
simplesmente coloque o script na (nova) pasta de construção, execute o script usando
node ./build/post-build.js
depois de construir a pasta dist usandong build --prod
fonte
Você pode controlar o cache do cliente com cabeçalhos HTTP. Isso funciona em qualquer estrutura da web.
Você pode definir as diretivas desses cabeçalhos para ter controle refinado sobre como e quando ativar | desativar o cache:
Cache-Control
Surrogate-Control
Expires
ETag
(muito bom)Pragma
(se você deseja oferecer suporte a navegadores antigos)Um bom armazenamento em cache é bom, mas muito complexo, em todos os sistemas de computador . Dê uma olhada em https://helmetjs.github.io/docs/nocache/#the-headers para mais informações.
fonte