Cancella la cache in JavaScript


179

Come posso cancellare una cache del browser con JavaScript?

Abbiamo distribuito l'ultimo codice JavaScript ma non siamo in grado di ottenere l'ultimo codice JavaScript.

Nota editoriale: questa domanda è semi-duplicata nei seguenti luoghi e la risposta nella prima delle domande seguenti è probabilmente la migliore. Questa risposta accettata non è più la soluzione ideale.

Come forzare il browser a ricaricare i file CSS / JS memorizzati nella cache?

Come posso forzare i client ad aggiornare i file JavaScript?

Ricarica dinamicamente i dati sorgente / json Javascript locali


5
Questo mi confonde: "Abbiamo distribuito l'ultimo codice javascript ma non siamo riusciti a ottenere l'ultimo codice javascript"
istanza di me

14
Suppongo che tu intenda come forzare i browser client a utilizzare la tua ultima versione di javascript e non la loro versione memorizzata nella cache - in tal caso hai bisogno della risposta di Greg. Se vuoi sapere come farlo nel tuo browser, è la risposta di David Johnstone.
Benjol,


4
Un approccio comune è quello di allegare un ?version=xxxfile collegato a JS attraverso una fase di creazione. Ogni nuova build richiederà una nuova versione del file JS.
Juan Mendes,

1
@JuanMendes Questo non funziona sempre. Questo stesso passaggio viene suggerito quando le persone hanno problemi nel tentativo di vedere l'ultima favicon. Non è garantito che funzioni.
uSeRnAmEhAhAhAhAhA

Risposte:


202

Puoi chiamare window.location.reload (true) per ricaricare la pagina corrente. Ignorerà tutti gli elementi memorizzati nella cache e recupererà nuove copie della pagina, CSS, immagini, JavaScript, ecc. Dal server. Questo non cancella l'intera cache, ma ha l'effetto di cancellare la cache per la pagina in cui ti trovi.

Tuttavia, la tua migliore strategia è quella di versioni il percorso o il nome del file, come indicato in varie altre risposte. Inoltre, vedi Revving Nomi file: non utilizzare la querystring per motivi da non utilizzare ?v=ncome schema di controllo delle versioni.


6
Wow grazie! Funziona bene anche con una cache dell'applicazione HTML5 caricata da un file cache.manifest. Avevo un vecchio manifest che non veniva rimosso dalla memoria, quindi un browser con cache non mostrava i file più recenti. Ho digitato questo nella console javascript e ha funzionato bene. Grazie!
JayCrossler,

2
ma revving cambiando il nome del file ... non avresti mantenuto tutte le versioni precedenti in atto? altrimenti riceverai molti tentativi falliti dai motori di ricerca e cosa non leggere le versioni precedenti (o le immagini segnalibro / collegate)
Rodolfo

1
com'è che non ci ho pensato, grazie
osdamv

1
È uguale all'utente fare clic sul pulsante Aggiorna?
GMsoF,

2
@Manuel Disabiliterà l'accesso alla pagina solo dalla cache dell'URL esatto che hai chiamato location.reload (true). Non cancella mai la pagina originale dalla cache in quanto aggiunge semplicemente un timestamp alla nuova richiesta e, se ci sono altre chiamate effettuate in modo asincrono da questa pagina, quelle richieste NON avranno i loro comportamenti di cache disabilitati. Per esempio. Se si aggiorna una pagina con ricarica (true) che carica un po 'di html e quella pagina ha uno script che effettua una seconda chiamata ajax per visualizzare più html sulla stessa pagina, la seconda richiesta non verrà disabilitata nella cache.
J. Schei,

114

Non è possibile cancellare la cache con JavaScript. Un modo comune è quello di aggiungere al file il numero di revisione o l'ultimo timestamp aggiornato, in questo modo:

myscript.123.js

o

myscript.js?updated=1234567890


9
Si noti tuttavia che molti proxy non memorizzano nella cache di un file quando ha una stringa di query. Vedi la risposta di Kevin Hakanson .
chiborg,

4
Come posso cancellare la cache quando l'intero HTML è stato memorizzato nella cache? Non influirà anche quando il numero di versione viene aggiunto a causa dell'HTML memorizzato nella cache. Per favore, aiuto
Nandakumar,

Se non riesco a cancellare un elemento cache, perché MDN dice che posso? Cosa mi sto perdendo? Ho provato quello che dice MDN ma senza fortuna.
Sнаđошƒаӽ,

41

Prova a cambiare l'src del file JavaScript? Da questa:

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

A questa:

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

Questo metodo dovrebbe forzare il tuo browser a caricare una nuova copia del file JS.


Cosa fa n = 1?
KyelJmD,

non fa altro che essere diverso. potrebbe essere? 12345 o? Kyle
Oneezy il

Quindi anche il nome del file deve essere cambiato? O solo il percorso src che deve essere modificato?
Fred Un

20

Oltre alla memorizzazione nella cache ogni ora o ogni settimana, è possibile memorizzare nella cache in base ai dati del file.

Esempio (in PHP):

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

o addirittura utilizzare il tempo di modifica del file:

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

3
Posso verificare di averlo compreso correttamente ?: Con l'opzione 1, quando il file cambia, cambia l'hash di checksum md5, che quindi cambia l'URL. Il browser vede un nuovo URL e avvia un nuovo caricamento del file. I dati get aggiunti all'URL vengono ignorati dal server. In tal caso, dannatamente slick.
Colin Brogan,

1
Inoltre, MD5-ing è un intero elaboratore di file intensivo? Sto pensando di fare questo per sempre file css e js, ma mi dispiacerebbe vedere un colpo alla velocità del server per questo.
Colin Brogan,

2
L'uso di un checksum è una buona idea, ma dovrebbe essere fatto bene. Calcolandolo ogni richiesta per ogni file colpirà significativamente le tue prestazioni. Querystring non è buono anche per la memorizzazione nella cache, vedi altre risposte. L'uso corretto è quello di aggiungere un checksum (parte di?) O il numero di versione al nome del file e utilizzare invece questo nuovo nome (è possibile utilizzare uno script di compilazione per farlo automagicamente durante la distribuzione). Vedi grugnito , rev e usemin .
Frizi,

10

Puoi anche forzare il ricaricamento del codice ogni ora, in questo modo, in PHP:

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

o

<script type="text/javascript" src="js/myscript.js?v=<?php echo date('YmdHis'); ?>"></script>

1
ciao, cosa significa "v" e "token"?
GMsoF,

4
@GMsoF che è solo un parametro get aggiuntivo che viene utilizzato (in questo caso) per dire al browser che è un file "diverso". In modo che il browser scarti la versione cache e la carichi invece. Viene spesso utilizzato con la "data dell'ultima modifica" di un file. Spero che abbia un senso ;-)
Jelmer il

6

mettilo alla fine del tuo modello:

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
      } 
   }
}

1
fornisci alcune spiegazioni sulla tua soluzione
Gabriel Espinoza,

@GabrielEspinoza ricarica i file usando javascript, il che rende le cache aggiornate.
Neo Morina,

6

prova ad usare questo

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

A questa:

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

5

Ecco un frammento di quello che sto usando per il mio ultimo progetto.

Dal controller:

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");
}

Dalla 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; ?>">

Il nostro processo di pubblicazione genera un file con il numero di revisione della build corrente. Funziona tramite la codifica URL di quel file e utilizzandolo come buster della cache. Come failover, se quel file non esiste, vengono utilizzati il ​​numero di anno e settimana in modo che la memorizzazione nella cache funzioni ancora e verrà aggiornata almeno una volta alla settimana.

Inoltre, questo fornisce il busting della cache per ogni caricamento della pagina mentre si trova nell'ambiente di sviluppo, in modo che gli sviluppatori non debbano preoccuparsi di svuotare la cache per qualsiasi risorsa (javascript, css, chiamate ajax, ecc.).


5

oppure puoi semplicemente leggere il file js dal server con file_get_contets e quindi inserire l'eco nell'intestazione del contenuto js


4

Forse "svuotare la cache" non è così facile come dovrebbe essere. Invece di svuotare la cache sui miei browser, mi sono reso conto che "toccando" il file cambierà effettivamente la data del file di origine memorizzato nella cache sul server (testato su Edge, Chrome e Firefox) e la maggior parte dei browser scaricherà automaticamente la copia aggiornata più recente di cosa c'è sul tuo server (codice, grafica anche qualsiasi multimedia). Ti suggerisco di copiare gli script più recenti sul server e la soluzione "fai la cosa del tocco" prima dell'esecuzione del programma, quindi cambierà la data di tutti i tuoi file problematici in una data e ora più attuali, quindi scaricherà una nuova copia al tuo browser:

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

... il resto del tuo programma ...

Mi ci è voluto del tempo per risolvere questo problema (poiché molti browser agiscono in modo diverso a comandi diversi, ma tutti controllano l'ora dei file e si confrontano con la copia scaricata nel browser, se data e ora diverse eseguiranno l'aggiornamento), Se si non posso andare nel modo giusto supposto, c'è sempre un'altra soluzione utilizzabile e migliore. I migliori saluti e buon campeggio.


1
Mi piace questo approccio, ma forse lo sto implementando nell'area sbagliata? Qualcuno sa dove aggiungere questo in una configurazione di WordPress? L'ho aggiunto al file Functions.php, con collegamenti diretti ai file JavaScript e CSS, ma ho comunque dovuto fare un duro caricamento per notare le modifiche.
flipflopmedia,

1
Quello che devi fare, è nella tua directory principale di wordpress html, modificare il tuo index.php per chiamare o eseguire il comando Touch () sui file che devi aggiornare e scaricare. Ho avuto problemi con piccole immagini e file js bloccati nella cache. Ho provato la maggior parte dei metodi descritti per il rilascio dalla memoria, ma il modo migliore è quello di caricarne uno attualmente corretto. Puoi compierlo semplicemente facendo "Touch Thing" in quanto non modifica nulla sul file, aggiorna solo l'ora e la data attuali in modo da ingannare il tuo browser per pensare che sia un'altra versione del file e il problema è stato risolto. Funziona sulla maggior parte dei browser
Luis H Cabrejo,

3

Ho avuto qualche problema con il codice suggerito da yboussard. Il ciclo j interno non ha funzionato. Ecco il codice modificato che uso con successo.

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;
            }
        }
    }
}

3

Se stai usando php puoi fare:

 <script src="js/myscript.js?rev=<?php echo time();?>"
    type="text/javascript"></script>

6
Non solo questa domanda è stata posta quattro anni fa, ma ha avuto anche una risposta migliore, anche se non è stata accettata.

4
Inoltre, questo metodo scaricherebbe nuovamente il file ogni volta indipendentemente dal numero di revisione effettivo o dalle modifiche apportate al file, il che disabiliterebbe effettivamente la memorizzazione nella cache del tutto.
Antti29,

2

Cache.delete () può essere utilizzato per i nuovi Chrome, Firefox e Opera.


Questo non fa solo parte dell'API dei Service Workers?
BanksySan,

@BanksySan dai documenti MDN:You don't have to use it in conjunction with service workers, even though it is defined in the service worker spec.
Madbreaks

2

Si prega di non fornire informazioni errate. La cache api è un tipo diverso di cache dalla cache http

La cache HTTP viene attivata quando il server invia le intestazioni corrette , non è possibile accedervi con javasvipt.

Api Cache nell'altra mano viene attivato quando si vuole, è utile quando si lavora con operaio di servizio in modo da poter intersecano richiesta e rispondere da questo tipo di cache di vedere: ilustration 1 ilustration 2 corso

Puoi utilizzare queste tecniche per avere sempre un nuovo contenuto sui tuoi utenti:

  1. Usa location.reload (true) per me non funziona, quindi non lo consiglierei.
  2. Utilizza l' API della cache per salvare nella cache e intersecare la richiesta con il lavoratore del servizio , fai attenzione con questo perché se il server ha inviato le intestazioni della cache per i file che desideri aggiornare, il browser risponderà prima dalla cache HTTP, e se non lo trova, andrà in rete, quindi potresti finire con un vecchio file
  3. Cambia l'URL dai tuoi file di tattica, la mia raccomandazione è che dovresti nominarlo con la modifica del contenuto dei tuoi file, io uso md5 e poi lo converto in stringa e url amichevole, e la md5 cambierà con il contenuto del file, lì può inviare liberamente le intestazioni della cache HTTP abbastanza a lungo

Consiglierei il terzo vedere


2

Puoi anche disabilitare la memorizzazione nella cache del browser con i meta tag HTML, basta inserire i tag html nella sezione head per evitare che la pagina web venga memorizzata nella cache mentre stai programmando / test e quando hai finito puoi rimuovere i meta tag.

(nella sezione testa)

<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"/>

Aggiorna la tua pagina dopo averlo incollato in testa e dovrebbe aggiornare anche il nuovo codice javascript.

Questo link ti darà altre opzioni se ne hai bisogno http://cristian.sulea.net/blog/disable-browser-caching-with-meta-html-tags/

oppure puoi semplicemente creare un pulsante in questo modo

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

si aggiorna ed evita la memorizzazione nella cache, ma rimarrà lì sulla tua pagina fino al termine del test, quindi puoi rimuoverlo. L'opzione del pugno è la cosa migliore.


1

Tendo a versione mio framework quindi applicare il numero di versione per script e percorsi di stile

<cfset fw.version = '001' />
<script src="/scripts/#fw.version#/foo.js"/>

3
OP non ha menzionato Coldfusion.
marctrem,

@VijayDev 404 per il tuo link
intelligente

1
window.parent.caches.delete("call")

chiudere e aprire il browser dopo aver eseguito il codice nella console.


1
Qualche spiegazione per favore, che cos'è "call" nel codice sopra?
Anand Rockzz,

@AnandRockzz non è possibile, cache api è solo un nuovo tipo di cache che può essere gestito con javascipt, quindi per eliminare qualcosa da lì, l'hai salvato prima di vedere developer.mozilla.org/en-US/docs/ Web / API / Cache
John Balvin Arias,


0

Perché lo stesso collegamento nella cache del browser, è necessario aggiungere un numero casuale alla fine dell'URL. new Date().getTime()generare un numero diverso.

Aggiungi la new Date().getTime()fine del collegamento come una chiamata

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

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


Benvenuti in SO! La tua risposta non è chiara Per favore, modificalo. Questo tipo di risposte, basate sul collegamento, devono essere commentate nel caso in cui il collegamento scompaia.
David García Bodego,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.