Forza il browser ad aggiornare css, javascript, ecc


88

Sto sviluppando un sito web basato sul codice sorgente di Wordpress tramite XAMPP. A volte cambio il codice CSS, gli script o qualcos'altro e noto che il mio browser impiega tempo per applicare le modifiche. Questo mi porta ad utilizzare più browser per aggiornarne uno e se non applico i nuovi stili provo il secondo ed è sempre questo.

C'è un modo per evitare questo problema? A volte sto cambiando codice senza preavviso delle modifiche precedenti.


4
Cache dei browser. Ogni volta che apporti modifiche a CSS, JavaScript e stai visualizzando la pagina che hai aggiornato, vedrai questo problema. Puoi forzare un aggiornamento premendo CTRL + F5 sul browser e questo otterrà l'ultima versione. Ho scoperto che Chrome a volte richiede quella sequenza un paio di volte ...
agente

potresti anche svuotare la cache del browser in modo programmatico
Pawan


Rispondi qui: risposta di Fermin .
JWC

Risposte:


111

Soluzione generale

Premendo Ctrl+ F5(o Ctrl+ Shift+ R) per forzare un ricaricamento della cache. Credo che i Mac utilizzino Cmd+ Shift+ R.

PHP

In PHP, puoi disabilitare la cache impostando la data di scadenza su un tempo passato con le intestazioni:

header("Expires: Tue, 01 Jan 2000 00:00:00 GMT");
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
header("Cache-Control: no-store, no-cache, must-revalidate, max-age=0");
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache");

Cromo

La cache di Chrome può essere disabilitata aprendo gli strumenti per sviluppatori con F12, facendo clic sull'icona a forma di ingranaggio nell'angolo in basso a destra e selezionando Disabilita cache nella finestra di dialogo delle impostazioni, in questo modo:

inserisci qui la descrizione dell'immagine
Immagine tratta da questa risposta .

Firefox

Digita about:confignella barra degli URL, quindi trova la voce intitolata network.http.use-cache. Impostalo su false.


Grazie JamWaffles per la descrizione dettagliata e grazie a tutti per le risposte. Grazie mille.
user1511579

Nelle versioni recenti di Chrome: CTRL + R.
Alix Axel

1
Per Chrome l'interfaccia che hai condiviso è leggermente cambiata. Basta premere la scheda Rete e troverai la casella di controllo lì.
Baz Guvenkaya

5
Per tua informazione: per Opera su Mac è cmd-alt-R
Derwent

52

Se vuoi evitarlo sul lato client puoi aggiungere qualcosa come ?v=1.xal collegamento del file css, quando il contenuto del file viene modificato. per esempio se ci fosse <link rel="stylesheet" type="text/css" href="css-file-name.css">puoi cambiarlo in <link rel="stylesheet" type="text/css" href="css-file-name.css?v=1.1">questo bypassando la cache.


1
Buon punto, ma poi il browser chiede sempre informazioni sui file. Ovviamente il server restituirà "304 Not Modified".
Andrzej Jozwik

@ajozwik Ho provato con Firefox 26.0 e Chromium 31.0.1650.57. Proprio come hai detto, Firefox in effetti fa una nuova query ogni volta se l'URL CSS contiene un punto interrogativo (e il server fornisce la risposta 304 con corpo vuoto); Firefox non esegue una nuova query se l'URL CSS non contiene un punto interrogativo. Chromium non esegue una nuova query anche con il punto interrogativo. Probabilmente questo può essere considerato un bug di Firefox.
Jaan

non funziona i miei amici in questo modo. Solo se il nome del file è diverso. Perché così tanti voti positivi?
Gediminas

Ho trovato in molti altri posti lo stesso approccio dato in questa risposta, credo che abbia funzionato in passato ma non funziona più. Se sei in modalità sviluppo, l'approccio migliore e universale è disabilitare la memorizzazione nella cache nel browser tramite meta tag HTML. Vedi la mia risposta di seguito.
ePi272314

9

Se puoi scrivere in php, puoi scrivere:

<script src="foo.js<?php echo '?'.mt_rand(); ?>" ></script>
<link rel="stylesheet" type="text/css" href="foo.css<?php echo '?'.mt_rand(); ?>" />
<img src="foo.png<?php echo '?'.mt_rand(); ?>" />

Si aggiornerà sempre!

EDIT: Ovviamente, non è davvero pratico per un intero sito Web, poiché non lo aggiungeresti manualmente per tutto.


Non funziona in questo modo! Solo se il nome del file è diverso, il browser viene ricaricato. O forse con questo suggerimento funziona solo per alcuni browser, se ha funzionato per te
Gediminas


5

Punto di vista dello sviluppatore
Se sei in modalità sviluppo (come nella domanda originale), l'approccio migliore è disabilitare la memorizzazione nella cache nel browser tramite meta tag HTML. Per rendere universale questo approccio è necessario inserire almeno tre meta tag come mostrato di seguito.

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

In questo modo, come sviluppatore, devi solo aggiornare la pagina per vedere le modifiche. Ma non dimenticare di commentare quel codice quando è in produzione, dopotutto il caching è una buona cosa per i tuoi clienti.

Modalità di produzione
Poiché in produzione consentirai la memorizzazione nella cache ei tuoi clienti non avranno bisogno di sapere come forzare un ricaricamento completo o qualsiasi altro trucco, devi garantire che il browser caricherà il nuovo file. E sì, in questo caso, l'approccio migliore che conosco è cambiare il nome del file.


2
<script src="foo.js?<?php echo date('YmdHis',filemtime('foo.js'));?>"></script>

Si aggiornerà se modificato.


Soluzione molto bella per tutti quei progetti che non utilizzano webpack o uno strumento di imballaggio che aggiunge automaticamente il controllo delle versioni alle risorse.
Richi González

Non l'ho downvote, ma questa soluzione non funziona bene nell'ultimo Chrome a partire da oggi, recupera ancora la versione precedente del file JavaScript
Mikaël Mayer,

1

Assicurati che questo non stia accadendo dal tuo DNS. Ad esempio, Cloudflare ha la possibilità di attivare la modalità di sviluppo in cui forza un'eliminazione dei fogli di stile e delle immagini poiché Cloudflare offre una cache accelerata. Questo lo disabiliterà e lo costringerà ad aggiornarsi ogni volta che qualcuno visita il tuo sito.



0

Puoi disattivare la memorizzazione nella cache con la barra degli strumenti per sviluppatori web di Firefox.



0

La risposta accettata sopra è corretta. Se, tuttavia, desideri solo ricaricare la cache periodicamente e stai utilizzando Firefox, gli strumenti per sviluppatori Web (nella voce di menu Strumenti a partire da novembre 2015) forniscono un'opzione di rete. Questo include un pulsante Ricarica. Seleziona Ricarica per un ripristino della cache una volta disattivato.


0

Se si vuole essere sicuri che questi file siano adeguatamente aggiornati da Chrome per tutti gli utenti, quindi è necessario avere must-revalidatein Cache-Controlintestazione. In questo modo Chrome ricontrollerà i file per vedere se è necessario recuperarli di nuovo.

Consiglia la seguente intestazione di risposta:

Cache-Control: must-validate

Questo dice a Chrome di verificare con il server e vedere se c'è un file più recente. Se è presente un file più recente, lo riceverà nella risposta. In caso contrario, riceverà una risposta 304 e la certezza che quella nella cache è aggiornata.

Se NON imposti questa intestazione, in assenza di qualsiasi altra impostazione che invalidi il file, Chrome non verificherà mai con il server se è disponibile una versione più recente.

Ecco un post sul blog che discute ulteriormente il problema.


0

Al posto del link-tag in html-head al file css esterno, usa php-include:

<style>
<?php
include("style.css");
?>      
</style>

Tipo di hack, ma funziona per me :)


1
Hai considerato che l'OP potrebbe non utilizzare php?
Oram

0

Ho deciso che poiché i browser non controllano le nuove versioni dei file css e js, rinomino le mie directory css e js ogni volta che apporto una modifica. Uso css1 a css9 e js1 a js9 come nomi di directory. Quando arrivo a 9, ricomincio da capo a 1. È un dolore, ma funziona perfettamente ogni volta. È ridicolo dover dire agli utenti di digitare.


0

Ho un caso in cui ho bisogno di essere in grado di creare e modificare i miei fogli di stile da remoto influenzando migliaia di client, ma a causa del rischio di un carico di rete pesante, non sto disattivando la cache.

Dato che posso modificare i contenuti HTML da remoto, collego quindi il foglio di stile con un codice hash che corrisponda al contenuto del foglio di stile.

https://example.com/contents/stylesheetctrl?id=12345&hash=-1456405808

Detto questo, utilizzo anche una funzione javascript lato client per sostituire con cura i nodi e gli attributi quando il contenuto HTML cambia, il che significa che il tag di collegamento del foglio di stile non verrà sostituito, cambierà solo l'attributo href.

Questo scenario funziona bene in Chrome, Firefox e Edge su Windows, anche Chrome su Android, ma con mia sorpresa non sempre funziona nei client web su Android. Quindi sto più o meno cercando qualcosa per forzare / attivare l'aggiornamento utilizzando javascript, in modo ottimale senza bisogno di ricaricare la pagina.


0

Puoi utilizzare la barra degli strumenti per sviluppatori di Firefox / Chrome:

  1. Apri Dev Toolbar Ctrl+ Shift+I
  2. Vai alla scheda di rete
  3. Seleziona la casella di controllo "disabilita cache" (Firefox: in alto a destra della barra degli strumenti; Chrome: in alto al centro della barra degli strumenti)

-1

Prova questo:

link href="styles/style.css?=time()" rel="stylesheet" type="text/css"

Se hai bisogno di qualcosa dopo il "?" che è diverso ogni volta che si accede alla pagina, lo time()farà. Lasciarlo permanentemente nel codice non è una buona idea poiché rallenterà solo il caricamento della pagina e probabilmente non è necessario.

Ho scoperto che forzare l'aggiornamento di un foglio di stile è utile se hai apportato modifiche estese al layout di una pagina e l'accesso al nuovo foglio di stile è fondamentale per far apparire qualcosa di sensato sullo schermo.


1
Non funziona in questo modo! Solo se il nome del file è diverso, il browser viene ricaricato. O forse con questo suggerimento funziona solo per alcuni browser, se ha funzionato per te. Downvote
Gediminas
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.