Wymuś przeglądarkę, aby odświeżyła css, javascript itp

86

Tworzę stronę internetową w oparciu o kod źródłowy Wordpress za pośrednictwem XAMPP. Czasami zmieniam kod CSS, skrypty lub coś innego i zauważam, że moja przeglądarka potrzebuje czasu, aby wprowadzić modyfikacje. To prowadzi mnie do używania wielu przeglądarek do odświeżania jednej, a jeśli nie stosuję nowych stylów, próbuję drugiej i zawsze tak jest.

Czy jest jakiś sposób na uniknięcie tego problemu? Czasami zmieniam kod bez uprzedzenia o poprzednich modyfikacjach.

user1511579
źródło
3
Pamięć podręczna przeglądarek. Za każdym razem, gdy wprowadzasz zmiany w CSS, JavaScript i przeglądasz zaktualizowaną stronę - zauważysz ten problem. Możesz wymusić odświeżenie, naciskając CTRL + F5 w przeglądarce, a ta uzyska najnowszą wersję. Odkryłem, że Chrome czasami wymaga tej sekwencji kilka razy ...
anAgent,
można też programowo wyczyścić pamięć podręczną przeglądarki
Pawan,
Odpowiedz tutaj: odpowiedź Fermina .
JWC,

Odpowiedzi:

107

Ogólne rozwiązanie

Naciśnięcie Ctrl+ F5(lub Ctrl+ Shift+ R), aby wymusić ponowne załadowanie pamięci podręcznej. Uważam, że komputery Mac używają Cmd+ Shift+ R.

PHP

W PHP możesz wyłączyć pamięć podręczną, ustawiając datę wygaśnięcia na godzinę z przeszłości z nagłówkami:

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

Chrom

Pamięć podręczną Chrome można wyłączyć, otwierając narzędzia programistyczne za pomocą F12, klikając ikonę koła zębatego w prawym dolnym rogu i wybierając opcję Wyłącz pamięć podręczną w oknie dialogowym ustawień, na przykład:

wprowadź opis obrazu tutaj
Obraz zaczerpnięty z tej odpowiedzi .

Firefox

Wpisz about:configw pasku adresu URL, a następnie znajdź wpis zatytułowany network.http.use-cache. Ustaw to na false.

Bojangles
źródło
Dziękuję JamWaffles za szczegółowy opis i dziękuję wszystkim za odpowiedzi. Dziękuję Ci bardzo.
user1511579
W najnowszych wersjach Chrome: CTRL + R.
Alix Axel,
1
W przypadku Chrome interfejs, który udostępniłeś, nieco się zmienił. Po prostu naciśnij kartę Sieć, a znajdziesz tam pole wyboru.
Baz Guvenkaya
5
Do Twojej wiadomości: dla Opery na Macu jest to cmd-alt-R
Derwent
52

Jeśli chcesz tego uniknąć po stronie klienta, możesz dodać coś takiego jak ?v=1.xlink do pliku css, gdy zawartość pliku zostanie zmieniona. na przykład, jeśli tak <link rel="stylesheet" type="text/css" href="css-file-name.css">, możesz to zmienić na <link rel="stylesheet" type="text/css" href="css-file-name.css?v=1.1">to ominie buforowanie.

F0G
źródło
1
Słuszna uwaga, ale przeglądarka zawsze pyta o plik. Oczywiście serwer zwróci "304 Not Modified".
Andrzej Jozwik
@ajozwik Testowałem z przeglądarką Firefox 26.0 i Chromium 31.0.1650.57. Tak jak powiedziałeś, Firefox rzeczywiście tworzy nowe zapytanie za każdym razem, gdy adres URL CSS zawiera znak zapytania (a serwer podaje odpowiedź 304 z pustą treścią); Firefox nie tworzy nowego zapytania, jeśli adres URL CSS nie zawiera znaku zapytania. Chromium nie tworzy nowego zapytania nawet ze znakiem zapytania. Prawdopodobnie można to uznać za błąd przeglądarki Firefox.
Jaan
nie działa w ten sposób moi przyjaciele. Tylko jeśli nazwa pliku jest inna. Skąd tyle głosów za?
Gediminas
Znalazłem w wielu innych miejscach to samo podejście, które podano w tej odpowiedzi. Myślę, że działało to w przeszłości, ale już nie działa. Jeśli jesteś w trybie programistycznym, najlepszym i uniwersalnym podejściem jest wyłączenie buforowania w przeglądarce za pomocą metatagów HTML. Zobacz moją odpowiedź poniżej.
ePi272314
9

Jeśli potrafisz pisać php, możesz napisać:

<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(); ?>" />

Zawsze się odświeży!

EDYCJA: Oczywiście nie jest to praktyczne dla całej witryny, ponieważ nie dodawałbyś tego ręcznie do wszystkiego.

Mageek
źródło
To nie działa w ten sposób! Tylko jeśli nazwa pliku jest inna, przeglądarka ładuje się ponownie. A może z tą wskazówką tylko niektóre przeglądarki działają, jeśli to zadziałało
Gediminas
5

Punkt widzenia programisty
Jeśli jesteś w trybie programistycznym (jak w pierwotnym pytaniu), najlepszym rozwiązaniem jest wyłączenie buforowania w przeglądarce za pomocą metatagów HTML. Aby to podejście było uniwersalne, musisz wstawić co najmniej trzy metatagi, jak pokazano poniżej.

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

W ten sposób jako programista musisz tylko odświeżyć stronę, aby zobaczyć zmiany. Ale nie zapomnij skomentować tego kodu podczas produkcji, w końcu buforowanie jest dobrą rzeczą dla twoich klientów.

Tryb produkcyjny
Ponieważ w środowisku produkcyjnym zezwolisz na buforowanie, a Twoi klienci nie muszą wiedzieć, jak wymusić pełne przeładowanie lub jakąkolwiek inną sztuczkę, musisz zagwarantować, że przeglądarka załaduje nowy plik. I tak, w tym przypadku najlepszym rozwiązaniem, jakie znam, jest zmiana nazwy pliku.

ePi272314
źródło
2
<script src="foo.js?<?php echo date('YmdHis',filemtime('foo.js'));?>"></script>

Odświeży się, jeśli zmodyfikujesz.

AllenBooTung
źródło
Bardzo fajne rozwiązanie dla wszystkich projektów, które nie używają webpacka lub narzędzia do pakowania, które automatycznie dodaje wersjonowanie do zasobów.
Richi González
Nie odrzuciłem tego, ale to rozwiązanie nie działa dobrze w najnowszym chrome na dzień dzisiejszy, nadal pobiera poprzednią wersję pliku JavaScript
Mikaël Mayer
1

Upewnij się, że to się nie dzieje z Twojego DNS. Na przykład Cloudflare ma to, w którym możesz włączyć tryb programowania, w którym wymusza czyszczenie arkuszy stylów i obrazów, ponieważ Cloudflare oferuje przyspieszoną pamięć podręczną. Spowoduje to wyłączenie go i wymusi aktualizację za każdym razem, gdy ktoś odwiedza Twoją witrynę.

Sean
źródło
0

Spróbuj wyczyścić pamięć podręczną przeglądarki.

DominicEU
źródło
0

Możesz wyłączyć buforowanie za pomocą paska narzędzi programisty przeglądarki Firefox.

Florent
źródło
0

Przyjęta powyżej odpowiedź jest prawidłowa. Jeśli jednak chcesz tylko okresowo ponownie ładować pamięć podręczną i używasz przeglądarki Firefox, narzędzia dla programistów WWW (w menu Narzędzia od listopada 2015 r.) Udostępniają opcję Sieć. Obejmuje to przycisk Odśwież. Wybierz opcję Załaduj ponownie, aby jednorazowo zresetować pamięć podręczną.

Steve Cooke
źródło
0

Jeśli chcesz mieć pewność, że te pliki są poprawnie odświeżane przez Chrome dla wszystkich użytkowników, to musisz mieć must-revalidatew Cache-Controlnagłówku. Spowoduje to ponowne sprawdzenie plików przez Chrome, aby sprawdzić, czy trzeba je ponownie pobrać.

Polecam następujący nagłówek odpowiedzi:

Cache-Control: must-validate

To informuje Chrome, aby sprawdził serwer i sprawdził, czy jest nowszy plik. Jeśli istnieje nowszy plik, otrzyma go w odpowiedzi. Jeśli nie, otrzyma odpowiedź 304 i pewność, że ta w pamięci podręcznej jest aktualna.

Jeśli NIE ustawisz tego nagłówka, to w przypadku braku innych ustawień, które unieważnią plik, Chrome nigdy nie sprawdzi z serwerem, czy jest dostępna nowsza wersja.

Oto post na blogu, który dalej omawia ten problem.

AgilePro
źródło
0

Zamiast link-tag w html-head do zewnętrznego pliku css, użyj php-include:

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

Trochę hack, ale na mnie działa :)

Jens Rundberg
źródło
1
Czy pomyślałeś, że OP może nie używać php?
Oram
0

Zdecydowałem, że ponieważ przeglądarki nie sprawdzają nowych wersji plików css i js, zmieniam nazwy katalogów css i js za każdym razem, gdy wprowadzam zmianę. Używam css1 do css9 i js1 do js9 jako nazw katalogów. Kiedy dochodzę do 9, zaczynam od nowa od 1. To jest ból, ale za każdym razem działa idealnie. To śmieszne, gdy trzeba kazać użytkownikom pisać.

Roger Jones
źródło
0

Mam przypadek, w którym muszę mieć możliwość tworzenia i zmiany moich arkuszy stylów zdalnie, wpływając na tysiące klientów, ale ze względu na ryzyko dużego obciążenia sieci nie wyłączam pamięci podręcznej.

Ponieważ mogę zdalnie zmieniać zawartość HTML, łączę arkusz stylów z hashcode pasującym do zawartości arkusza stylów.

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

To powiedziawszy, używam również funkcji javascript po stronie klienta, aby ostrożnie zastępować węzły i atrybuty, gdy zmienia się zawartość HTML, co oznacza, że ​​tag linku arkusza stylów nie zostanie zastąpiony, zmieni się tylko atrybut href.

Ten scenariusz działa dobrze w Chrome, Firefox i Edge w systemie Windows, także w Chrome na Androidzie, ale nie zawsze działa w klientach internetowych na Androida, ku mojemu zaskoczeniu. Więc mniej więcej szukam czegoś, co wymusi / uruchomi aktualizację za pomocą javascript - optymalnie bez konieczności ponownego ładowania strony.

Thomas Williams
źródło
-1

Spróbuj tego:

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

Jeśli potrzebujesz czegoś po znaku „?” to jest inne za każdym razem, gdy strona jest otwierana, wtedy time()zrobi to. Pozostawienie tego w kodzie na stałe nie jest dobrym pomysłem, ponieważ spowolni tylko ładowanie strony i prawdopodobnie nie jest konieczne.

Odkryłem, że wymuszenie odświeżenia arkusza stylów jest pomocne, jeśli dokonałeś rozległych zmian w układzie strony, a dostęp do nowego arkusza stylów jest niezbędny, aby na ekranie pojawiło się coś sensownego.

BPrice
źródło
1
To nie działa w ten sposób! Tylko jeśli nazwa pliku jest inna, przeglądarka ładuje się ponownie. A może z tą wskazówką tylko dla niektórych przeglądarek działa, jeśli to zadziałało. Głos przeciw
Gediminas