Limpar o cache em JavaScript

179

Como limpo o cache de um navegador com JavaScript?

Implementamos o código JavaScript mais recente, mas não conseguimos obter o código JavaScript mais recente.

Nota Editorial: Esta pergunta é semi-duplicada nos seguintes locais, e a resposta na primeira das seguintes perguntas é provavelmente a melhor. Essa resposta aceita não é mais a solução ideal.

Como forçar o navegador a recarregar arquivos CSS / JS em cache?

Como forçar os clientes a atualizar arquivos JavaScript?

Recarregar dinamicamente a fonte Javascript local / dados json

Dylan Brams
fonte
5
Isso me confunde: "Implementamos o código javascript mais recente, mas não conseguimos obter o código javascript mais recente"
instanceof me
14
Eu acho que você quer dizer, como forçar os navegadores clientes a usar sua versão mais recente do javascript e não a versão em cache - nesse caso, você precisa da resposta de Greg. Se você quiser saber como fazê-lo em seu próprio navegador, é a resposta de David Johnstone.
21909 Benjol
4
Uma abordagem comum é anexar um ?version=xxxa seus arquivos vinculados a JS por meio de uma etapa de construção. Cada nova construção solicitará uma nova versão do arquivo JS.
Juan Mendes
1
@JuanMendes Isso nem sempre funciona. Essa mesma etapa é sugerida quando as pessoas têm problemas para tentar ver o favicon mais recente. Não é garantido que funcione.
uSeRnAmEhAhAhAhAhA 30/03

Respostas:

202

Você pode chamar window.location.reload (true) para recarregar a página atual. Ele ignorará todos os itens em cache e recuperará novas cópias da página, css, imagens, JavaScript etc. do servidor. Isso não limpa o cache inteiro, mas tem o efeito de limpar o cache da página em que você está.

No entanto, sua melhor estratégia é a versão do caminho ou nome do arquivo, conforme mencionado em várias outras respostas. Além disso, consulte Revving Nomes de arquivos: não use a string de consulta por motivos para não usar ?v=ncomo seu esquema de versão.

Kevin Hakanson
fonte
6
Uau, obrigada! Isso funciona bem para um cache de aplicativos HTML5 carregado de um arquivo cache.manifest também. Eu tinha um manifesto antigo que não estava sendo removido da memória; portanto, um navegador que o armazenava em cache simplesmente não mostrava arquivos mais recentes. Eu digitei isso no console javascript e funcionou bem. Obrigado!
JayCrossler
2
mas acelerando alterando o nome do arquivo ... você não manterá todas as versões anteriores no lugar? caso contrário, você vai ter um monte de tentativas fracassadas de motores de busca eo que não para ler as versões mais antigas (ou marcadas imagens / ligadas)
Rodolfo
1
como é que eu não pensei nisso, tanque você
osdamv
1
É o mesmo que o usuário clicar no botão Atualizar?
GMsoF
2
@Manuel Desativa apenas o acesso à página do cache do URL exato em que você chamou location.reload (true). Ele nunca limpa a página original do cache, pois simplesmente acrescenta um carimbo de data / hora à nova solicitação e, se houver outras chamadas feitas de forma assíncrona por esta página, essas solicitações NÃO terão seus comportamentos de cache desativados. Por exemplo. Se você atualizar uma página com reload (true) que carrega algum html, e essa página tiver um script que faça uma segunda chamada ajax para que mais html seja exibido na mesma página, a segunda solicitação não terá seu cache desativado.
117817 J. Schei
114

Você não pode limpar o cache com javascript. Uma maneira comum é acrescentar o número da revisão ou o último carimbo de data / hora atualizado ao arquivo, assim:

myscript.123.js

ou

myscript.js?updated=1234567890

Greg
fonte
9
Observe, no entanto, que muitos proxies não armazenam em cache um arquivo quando ele possui uma string de consulta. Veja a resposta de Kevin Hakanson .
Chiborg
4
Como posso limpar o cache quando todo o HTML foi armazenado em cache? Não vai afetar até mesmo quando o número da versão é adicionado por causa da ajuda HTML.Please em cache
Nandakumar
Se não consigo limpar um item de cache, por que o MDN diz que posso? o que estou perdendo? Eu tentei o que MDN diz, mas sem sorte.
Sнаđошƒаӽ 12/03
41

Tente alterar o src do arquivo JavaScript? Disto:

<script language="JavaScript" src="js/myscript.js"></script>

Para isso:

<script language="JavaScript" src="js/myscript.js?n=1"></script>

Este método deve forçar seu navegador a carregar uma nova cópia do arquivo JS.

Barry Gallagher
fonte
O que faz n = 1?
KyelJmD
não faz nada, exceto ser algo diferente. poderia ser 12345 ou Kyle?
Oneezy
Então o nome do arquivo também precisa ser alterado? Ou apenas o caminho src que precisa ser alterado?
Fred A
20

Além de armazenar em cache a cada hora ou a cada semana, você pode armazenar em cache de acordo com os dados do arquivo.

Exemplo (em PHP):

<script src="js/my_script.js?v=<?=md5_file('js/my_script.js')?>"></script>

ou até mesmo usar o horário de modificação do arquivo:

<script src="js/my_script.js?v=<?=filemtime('js/my_script.js')?>"></script>
Alexandre T.
fonte
3
Posso verificar se entendi corretamente ?: Com a opção 1, quando o arquivo é alterado, o hash de soma de verificação md5 é alterado, o que altera o URL. O navegador vê um novo URL e inicia uma nova carga do arquivo. Os dados de obtenção anexados ao URL são ignorados pelo servidor. Se for esse o caso, é muito bom.
Colin Brogan
1
Além disso, o MD5-ing é um processador de arquivos inteiro intensivo? Estou pensando em fazer isso para sempre o arquivo css e js, mas eu odiaria ver um impacto na velocidade do servidor por causa disso.
Colin Brogan
2
Usar uma soma de verificação é uma boa ideia, mas deve ser feita corretamente. O cálculo de todas as solicitações para cada arquivo afetará significativamente seu desempenho. A consulta também não é boa para armazenar em cache; veja outras respostas. O uso correto é anexar uma soma de verificação (parte de?) Ou número da versão ao nome do arquivo e usar esse novo nome (você pode usar um script de construção para fazer isso automaticamente na implantação). Veja grunhido , rev e usemin .
Frizi
10

Você também pode forçar o recarregamento do código a cada hora, como este, no PHP:

<?php
echo '<script language="JavaScript" src="js/myscript.js?token='.date('YmdH').'">';
?>

ou

<script type="text/javascript" src="js/myscript.js?v=<?php echo date('YmdHis'); ?>"></script>
Fabien Ménager
fonte
1
oi, o que significa "v" e "token" significa?
GMsoF 02/07
4
@GMsoF, que é apenas um parâmetro get adicional, que é usado (neste caso) para dizer ao navegador que é um arquivo "diferente". Para que o navegador descarte a versão em cache e carregue esta em seu lugar. Isso geralmente é usado com a "data da última modificação" de um arquivo. Espero que isso faz sentido ;-)
Jelmer
6

coloque isso no final do seu modelo:

var scripts =  document.getElementsByTagName('script');
var torefreshs = ['myscript.js', 'myscript2.js'] ; // list of js to be refresh
var key = 1; // change this key every time you want force a refresh
for(var i=0;i<scripts.length;i++){ 
   for(var j=0;j<torefreshs;j++){ 
      if(scripts[i].src && (scripts[i].src.indexOf(torefreshs[j]) > -1)){
        new_src = scripts[i].src.replace(torefreshs[j],torefreshs[j] + 'k=' + key );
        scripts[i].src = new_src; // change src in order to refresh js
      } 
   }
}
yboussard
fonte
1
forneça alguma explicação sobre a sua solução
Gabriel Espinoza
@GabrielEspinoza, ele recarrega os arquivos usando javascript, o que faz com que os caches sejam atualizados.
Neo Morina
6

tente usar isso

 <script language="JavaScript" src="js/myscript.js"></script>

Para isso:

 <script language="JavaScript" src="js/myscript.js?n=1"></script>
Daniel
fonte
5

Aqui está um trecho do que estou usando no meu projeto mais recente.

Do controlador:

if ( IS_DEV ) {
    $this->view->cacheBust = microtime(true);
} else {
    $this->view->cacheBust = file_exists($versionFile) 
        // The version file exists, encode it
        ? urlencode( file_get_contents($versionFile) )
        // Use today's year and week number to still have caching and busting 
        : date("YW");
}

Do ponto de vista:

<script type="text/javascript" src="/javascript/somefile.js?v=<?= $this->cacheBust; ?>"></script>
<link rel="stylesheet" type="text/css" href="/css/layout.css?v=<?= $this->cacheBust; ?>">

Nosso processo de publicação gera um arquivo com o número de revisão da compilação atual. Isso funciona pela URL que codifica esse arquivo e o usa como um buster de cache. Como failover, se esse arquivo não existir, o número do ano e da semana será usado para que o cache ainda funcione e ele será atualizado pelo menos uma vez por semana.

Além disso, isso fornece interrupção do cache para cada carregamento de página no ambiente de desenvolvimento, para que os desenvolvedores não precisem se preocupar em limpar o cache de quaisquer recursos (javascript, css, chamadas ajax, etc.).

Justin Johnson
fonte
5

ou você pode simplesmente ler o arquivo js pelo servidor com file_get_contets e depois colocar eco no cabeçalho do conteúdo do js

albanx
fonte
4

Talvez "limpar o cache" não seja tão fácil quanto deveria ser. Em vez de limpar o cache nos meus navegadores, percebi que "tocar" no arquivo mudaria a data do arquivo de origem armazenado em cache no servidor (Testado no Edge, Chrome e Firefox) e a maioria dos navegadores baixaria automaticamente a cópia atualizada mais recente do o que está no seu servidor (código, gráficos também qualquer multimídia). Sugiro que você copie os scripts mais atuais no servidor e a solução "faça o que é necessário" antes da execução do programa, para que ele altere a data de todos os seus arquivos com problemas para a data e hora mais atuais e faça o download de uma nova cópia para o seu navegador:

<?php
    touch('/www/control/file1.js');
    touch('/www/control/file2.js');
    touch('/www/control/file2.js');
?>

... o resto do seu programa ...

Levei algum tempo para resolver esse problema (como muitos navegadores agem de maneira diferente com comandos diferentes, mas todos verificam a hora dos arquivos e se comparam à sua cópia baixada no seu navegador, se houver data e hora diferentes, fará a atualização), se você Não é possível seguir o caminho certo, sempre há outra solução melhor e utilizável. Cumprimentos e acampamento feliz.

Luis H Cabrejo
fonte
1
Eu gosto dessa abordagem, mas talvez eu esteja implementando isso na área errada? Alguém sabe onde adicionar isso em uma configuração do WordPress? Adicionei-o ao arquivo functions.php, com links diretos para os arquivos JavaScript e CSS, mas ainda precisava fazer uma recarga para que as alterações fossem notadas.
Flipflopmedia
1
O que você precisa fazer é no seu diretório principal html wordpress, editar seu index.php para chamar ou executar o comando Touch () nos arquivos que você precisa atualizar e baixar. Eu tive problemas com pequenas fotos e arquivos js que ficaram presos no cache. Eu tentei a maioria dos métodos descritos para liberar da memória, mas a melhor maneira é carregar uma atual correta. Você pode concluir que, apenas fazendo o "Touch Thing", pois ele não modifica nada no arquivo, apenas atualiza a hora e a data atuais, para que o seu navegador engane a sua outra versão do arquivo e o problema foi corrigido. Funciona na maioria dos navegadores
Luis H Cabrejo
3

Eu tive alguns problemas com o código sugerido por yboussard. O loop j interno não funcionou. Aqui está o código modificado que eu uso com sucesso.

function reloadScripts(toRefreshList/* list of js to be refresh */, key /* change this key every time you want force a refresh */) {
    var scripts = document.getElementsByTagName('script');
    for(var i = 0; i < scripts.length; i++) {
        var aScript = scripts[i];
        for(var j = 0; j < toRefreshList.length; j++) {
            var toRefresh = toRefreshList[j];
            if(aScript.src && (aScript.src.indexOf(toRefresh) > -1)) {
                new_src = aScript.src.replace(toRefresh, toRefresh + '?k=' + key);
                // console.log('Force refresh on cached script files. From: ' + aScript.src + ' to ' + new_src)
                aScript.src = new_src;
            }
        }
    }
}
Bryan
fonte
3

Se você estiver usando o php pode fazer:

 <script src="js/myscript.js?rev=<?php echo time();?>"
    type="text/javascript"></script>
user3573488
fonte
5
Essa pergunta não só foi feita há quatro anos, mas também teve uma resposta melhor, mesmo que não fosse aceita.
3
Além disso, esse método baixaria novamente o arquivo a qualquer momento, independentemente do número de revisão real ou das alterações feitas no arquivo, o que desativaria completamente o cache.
Antti29
2

Cache.delete () pode ser usado para o novo chrome, firefox e opera.

Jay Shah
fonte
Isso não é apenas parte da API dos trabalhadores de serviço?
BanksySan
@BanksySan do MDN docs:You don't have to use it in conjunction with service workers, even though it is defined in the service worker spec.
Madbreaks
2

Por favor, não forneça informações incorretas. A API do cache é um tipo diferente de cache do cache http

O cache HTTP é acionado quando o servidor envia os cabeçalhos corretos , você não pode acessar com javasvipt.

A API de cache, por outro lado, é acionada quando você deseja; é útil ao trabalhar com o técnico de serviço, para que você possa interceptar a solicitação e respondê-la a partir desse tipo de cache, consulte: ilustração 1 ilustração 2 curso

Você pode usar essas técnicas para ter sempre um conteúdo novo para seus usuários:

  1. Usar location.reload (true), isso não funciona para mim, então eu não recomendo.
  2. Use a API do cache para salvar no cache e cruzar a solicitação com o trabalhador do serviço , tenha cuidado com este porque se o servidor enviou o cabeçalhos do cache para os arquivos que você deseja atualizar, o navegador responderá primeiro pelo cache HTTP, e se não o encontrar, ele irá para a rede, para que você possa acabar com um arquivo antigo
  3. Mude o URL dos seus arquivos de estratégia, minha recomendação é que você o nomeie com a alteração do conteúdo dos seus arquivos, eu uso o MD5 e depois o converto em string e URL amigável, e o MD5 muda com o conteúdo do arquivo. pode enviar livremente cabeçalhos de cache HTTP por tempo suficiente

Eu recomendaria o terceiro ver

John Balvin Arias
fonte
2

Você também pode desativar o cache do navegador com meta tags HTML. Basta colocar tags html na seção head para evitar que a página da Web seja armazenada em cache enquanto você estiver codificando / testando e, quando terminar, pode remover as meta tags.

(na seção principal)

<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate" />
<meta http-equiv="Pragma" content="no-cache" />
<meta http-equiv="Expires" content="0"/>

Atualize sua página depois de colar isso na cabeça e também atualize o novo código javascript.

Este link fornecerá outras opções se você precisar delas http://cristian.sulea.net/blog/disable-browser-caching-with-meta-html-tags/

ou você pode simplesmente criar um botão como esse

<button type="button" onclick="location.reload(true)">Refresh</button>

ele é atualizado e evita o armazenamento em cache, mas ele permanecerá na sua página até que você termine o teste e poderá removê-lo. A primeira opção é a melhor opção.

alfmonc
fonte
1

Tendo a versão minha estrutura, aplico o número da versão aos caminhos de script e estilo

<cfset fw.version = '001' />
<script src="/scripts/#fw.version#/foo.js"/>
SpliFF
fonte
3
A OP não mencionou o Coldfusion.
Marctrem 22/05
@VijayDev 404 para o seu link
smarber 17/03
1
window.parent.caches.delete("call")

feche e abra o navegador depois de executar o código no console.

Apoorv
fonte
1
Alguma explicação, por favor, o que é "chamada" no código acima?
Anand Rockzz
@AnandRockzz não é possível, a API de cache é apenas um novo tipo de cache que pode ser gerenciado com o javascipt; portanto, para excluir algo de lá, você já o salvou antes de ver developer.mozilla.org/en-US/docs/ Web / API / Cache
John Balvin Arias
1

window.location.reload(true)parece ter sido descontinuado pelo padrão HTML5. Uma maneira de fazer isso sem usar cadeias de consulta é usar o Clear-Site-Datacabeçalho , que parece estar padronizado .

Meu Deus
fonte
0

Como o cache do navegador está no mesmo link, você deve adicionar um final de número aleatório do URL. new Date().getTime()gerar um número diferente.

Basta adicionar o new Date().getTime()final do link como uma chamada

'https://stackoverflow.com/questions.php?' + new Date().getTime()

Resultado: https://stackoverflow.com/questions.php?1571737901173

EMAM HASAN
fonte
Bem-vindo ao SO! Sua resposta não é clara. Por favor edite-o. Esse tipo de resposta, com base no link, deve ser comentado caso o link desapareça.
David García Bodego 22/10/19