Jak zmusić przeglądarkę do ponownego załadowania buforowanych plików CSS/JS?
Zauważyłem, że niektóre przeglądarki (zwłaszcza Firefox i Opera) bardzo gorliwie używają kopii plików w pamięci podręcznej
.css
i
.js
, nawet między sesjami przeglądarki. Powoduje to problem z aktualizacją jednego z tych plików, ale przeglądarka użytkownika nadal używa kopii z pamięci podręcznej.
Pytanie brzmi: jaki jest najbardziej elegancki sposób, aby zmusić przeglądarkę użytkownika do ponownego załadowania pliku po zmianie?
Idealnie byłoby, gdyby to rozwiązanie nie zmuszało przeglądarki do ponownego ładowania pliku za każdym razem, gdy odwiedzana jest strona. Jako odpowiedź zamieszczę własne rozwiązanie, ale zastanawiam się, czy ktoś ma lepsze rozwiązanie i pozwolę zdecydować twoim głosom.
Aktualizacja
:
Po tym, jak pozwoliłem sobie na chwilę porozmawiać tutaj, znalazłem sugestię
John Millikin
i
da5id
przydatny. Okazuje się, że jest na to termin:
automatyczna kontrola wersji
.
Poniżej zamieściłem nową odpowiedź, będącą połączeniem mojego oryginalnego rozwiązania i sugestii Johna.
Inny pomysł zaproponowany przez
SCdF
, polega na dodaniu fikcyjnego ciągu zapytania do pliku. (Przedstawiono kod Pythona, który automatycznie używa znacznika czasu jako fikcyjnego ciągu zapytania
pi
.). Istnieje jednak dyskusja na temat tego, czy przeglądarka będzie buforować plik z ciągiem zapytania. (Pamiętaj, chcemy, aby przeglądarka buforowała plik i używała go podczas przyszłych wizyt. Chcemy, aby pobierała plik ponownie tylko wtedy, gdy ulegnie zmianie).
Ponieważ nie jest jasne, co się dzieje z fałszywym ciągiem zapytania, nie akceptuję tej odpowiedzi.
Nie znaleziono powiązanych wyników
Zaproszony:
Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się
25 odpowiedzi
Anonimowy użytkownik
Potwierdzenie od:
Aktualizacja:
przepisany z uwzględnieniem sugestii
John Millikin
i
da5id
... To rozwiązanie jest napisane w PHP, ale powinno być łatwe do dostosowania do innych języków.
Aktualizacja 2:
włączenie komentarzy od
Nick Johnson
że oryginalne wyrażenie regularne może powodować problemy z plikami takimi jak . Rozwiązaniem jest przepisanie tylko wtedy, gdy na końcu jest dokładnie 10 cyfr. (Ponieważ 10 cyfr obejmuje wszystkie znaczniki czasu od 9/9/2001 do 20 11/2286).
Najpierw używamy następującej reguły przepisywania w pliku .htaccess:
Piszemy teraz następującą funkcję PHP:
<pre class="lang-php prettyprint-override">
Teraz, gdziekolwiek włączysz swój CSS, zmień go z tego:
Do teraz:
W ten sposób już nigdy nie będziesz musiał zmieniać tagu linku, a użytkownik zawsze zobaczy najnowszą wersję CSS. Przeglądarka będzie mogła buforować plik CSS, ale kiedy wprowadzisz jakiekolwiek zmiany w swoim CSS, przeglądarka zobaczy go jako nowy adres URL, więc nie użyje kopii z pamięci podręcznej.
Może również współpracować z obrazami, ikonami ulubionych i JavaScript. Zasadniczo wszystko, co nie jest generowane dynamicznie.
Anonimowy użytkownik
Potwierdzenie od:
Prosta technika po stronie klienta
Ogólnie buforowanie jest dobre. Jest więc kilka metod, w zależności od tego, czy rozwiązujesz problem samodzielnie podczas tworzenia witryny internetowej, czy próbujesz kontrolować pamięć podręczną w środowisku produkcyjnym.
Zwykli użytkownicy Twojej witryny nie będą mieli takich samych wrażeń jak Ty podczas projektowania witryny. Ponieważ przeciętny użytkownik odwiedza witrynę rzadziej (może tylko kilka razy w miesiącu, jeśli nie należysz do Google ani sieci hi5), jest mniej prawdopodobne, że będą mieć Twoje pliki w pamięci podręcznej, a to może wystarczyć. Jeśli chcesz wymusić nową wersję w przeglądarce, zawsze możesz dodać ciąg zapytania do żądania i zwiększyć numer wersji podczas wprowadzania większych zmian:
Dzięki temu każdy otrzyma nowy plik. Działa to, ponieważ przeglądarka sprawdza adres URL pliku, aby określić, czy ma on kopię w pamięci podręcznej. Jeśli twój serwer nie jest skonfigurowany do robienia czegokolwiek z ciągiem zapytania, zostanie zignorowany, ale nazwa pojawi się jako nowy plik w przeglądarce.
Z drugiej strony, jeśli tworzysz witrynę internetową, nie chcesz zmieniać numeru wersji za każdym razem, gdy zapisujesz zmiany w wersji rozwojowej. Byłoby to męczące.
Dlatego podczas tworzenia witryny dobrą sztuczką byłoby automatyczne generowanie parametru ciągu zapytania:
Dodanie ciągu zapytania do żądania jest dobrym sposobem na utworzenie wersji zasobu, ale w przypadku prostej witryny sieci Web może nie być konieczne. I pamiętaj, buforowanie to dobra rzecz.
Warto również zauważyć, że przeglądarka niekoniecznie oszczędza na przechowywaniu plików w pamięci podręcznej. Przeglądarki mają zasady dotyczące tego rodzaju rzeczy i zwykle działają zgodnie z regułami określonymi w specyfikacji HTTP. Gdy przeglądarka wysyła żądanie do serwera, częścią odpowiedzi jest nagłówek EXPIRES .. data, która mówi przeglądarce, jak długo powinna przechowywać ją w pamięci podręcznej. Następnym razem, gdy przeglądarka napotka żądanie dotyczące tego samego pliku, widzi, że ma kopię w pamięci podręcznej i sprawdza datę EXPIRES, aby zdecydować, czy go użyć.
Więc wierz lub nie, to w rzeczywistości Twój serwer sprawia, że pamięć podręczna przeglądarki jest tak trwała. Możesz dostosować ustawienia serwera i zmienić nagłówki EXPIRES, ale mała technika, którą napisałem powyżej, jest prawdopodobnie znacznie łatwiejsza. Ponieważ buforowanie jest dobre, zwykle chcesz ustawić tę datę daleko w przyszłości („nagłówek wygaśnięcia w dalekiej przyszłości”) i użyć techniki opisanej powyżej, aby wymusić zmianę.
Jeśli interesuje Cię więcej informacji o HTTP lub sposobie wysyłania takich żądań, dobrą książką jest Witryny internetowe o wysokiej wydajności Steve'a Soudersa. To bardzo dobre wprowadzenie do tematu.
Anonimowy użytkownik
Potwierdzenie od:
mod_pagespeed
http://code.google.com/p/modpagespeed/
z google dla apache zrobi za Ciebie automatyczne przechowywanie wersji. Jest naprawdę śliski.
Analizuje HTML w swojej ścieżce z serwera WWW (działa z PHP, railsami, pythonem, statycznym HTML - czymkolwiek) i przepisuje linki do CSS, JS, plików graficznych, aby zawierały kod id. Obsługuje pliki w zmodyfikowanych adresach URL z bardzo długimi kontrolkami pamięci podręcznej. Gdy pliki się zmieniają, automatycznie zmienia adresy URL, więc przeglądarka musi je ponownie pobrać. Po prostu działa, bez żadnych zmian w kodzie. Zminimalizuje nawet Twój kod wyjściowy.
Anonimowy użytkownik
Potwierdzenie od:
Więc twój adres URL będzie miał postać
Nadal możesz użyć reguły przepisywania, aby usunąć skrót, ale zaletą jest to, że możesz teraz ustawić zasady pamięci podręcznej na buforowanie na zawsze, ponieważ jeśli adres URL pozostaje taki sam, oznacza to, że plik pozostaje ten sam.
Następnie możesz napisać prosty skrypt powłoki, który oblicza hash pliku i aktualizuje tag (prawdopodobnie chcesz przenieść go do osobnego pliku, aby dołączyć).
Po prostu uruchamiaj ten skrypt za każdym razem, gdy zmieni się CSS i wszystko będzie dobrze. Przeglądarka przeładuje pliki TYLKO wtedy, gdy zostaną zmienione. Jeśli edytujesz, a następnie cofniesz, możesz łatwo dowiedzieć się, do której wersji należy powrócić, aby odwiedzający nie pobierali jej ponownie.
Anonimowy użytkownik
Potwierdzenie od:
Wszystko, co musisz zrobić, to pobrać zmodyfikowany plik znacznika czasu i dodać go jako ciąg zapytania do pliku
W roku PHP zrobiłbym to tak:
filemtime to funkcja PHP, która zwraca zmodyfikowany plik znacznika czasu.
Anonimowy użytkownik
Potwierdzenie od:
Czy to jest pomysł? parametry są i tak odrzucane/ignorowane w żądaniu i możesz zmienić tę liczbę podczas wdrażania nowej wersji.
Uwaga:
istnieje pewien argument dotyczący tego, jak dokładnie wpływa to na buforowanie. Uważam, że generalnie chodzi o to, że żądania GET, z parametrami lub bez,
powinien
być buforowalne, więc powyższe rozwiązanie powinno działać.
Zależy to jednak zarówno od serwera WWW, który zdecyduje, czy chce zastosować się do tej części specyfikacji, jak i od przeglądarki, z której korzysta użytkownik, ponieważ i tak może po prostu poprosić o nową wersję.
Anonimowy użytkownik
Potwierdzenie od:
Zobacz też:
Anonimowy użytkownik
Potwierdzenie od:
aplikacja jednostronicowa
(SPA), być może nadszedł czas, aby powrócić do niektórych fundamentalnych założeń ... w szczególności idei, że pożądane jest, aby serwer sieciowy obsługiwał tylko jedną, najnowszą wersję pliku.
Wyobraź sobie, że jesteś użytkownikiem, którego wersja to
M
SPA załadowane do Twojej przeglądarki:
[/*]
[*]
Serwer odpowiada treścią - chcesz, aby zwrócił wersję
M
lub
N
szablon?
[/*]
[/list]
Jeśli format uległ zmianie między wersjami
M
i
N
(lub nazwa pliku została zmieniona lub cokolwiek innego),
prawdopodobnie nie chcesz tej wersji
N
szablon został wysłany do przeglądarki działającej w starej wersji
M
analizator
.†
Aplikacje internetowe napotykają ten problem, gdy spełnione są dwa warunki:
Gdy aplikacja będzie musiała obsługiwać wiele wersji równolegle,
rozwiązanie problemu buforowania i „przeładowywania” staje się trywialne
:
[/*]
[*]
Zaktualizuj wszystkie tagi i itp. wskazać ten plik w jednym z wersjonowanych katalogów
[/*]
[/*][/list]
Ten ostatni krok wydaje się trudny, ponieważ może wymagać wywołania narzędzia do tworzenia adresów URL dla każdego adresu URL w kodzie po stronie serwera lub klienta. Lub możesz po prostu mądrze używać
etykietka
https://developer.mozilla.org/ ... /base i zmień aktualną wersję w jednym miejscu.
† Jednym ze sposobów obejścia tego problemu jest agresywne działanie i zmuszanie przeglądarki do ponownego załadowania wszystkiego, gdy pojawi się nowa wersja. Aby jednak umożliwić ukończenie dowolnej oczekującej operacji, nadal może być łatwiej utrzymać równolegle co najmniej dwie wersje: v-current i v-previous.
Anonimowy użytkownik
Potwierdzenie od:
http://www.thinkvitamin.com/fe ... -fast
http://www.thinkvitamin.com/fe ... -fast
podczas gdy IE i Firefox ignorują to, Opera i Safari nie! Zamiast tego użyj foo.v1234.css i użyj reguł przepisywania, aby usunąć numer wersji.
Anonimowy użytkownik
Potwierdzenie od:
Podobnie jest z CSS
Anonimowy użytkownik
Potwierdzenie od:
Dodałem klasę negacji kropek [^.] By regex so .number. ignorowane.
Anonimowy użytkownik
Potwierdzenie od:
Powyższe będzie wyglądało jak ostatnia wizyta użytkownika w Twojej witrynie. Jeśli ostatnia wizyta miała miejsce przed opublikowaniem nowego kodu, używa on , aby wymusić odświeżenie strony z serwera.
Zwykle mam ten pierwszy skrypt w , więc jest sprawdzany przed załadowaniem jakiejkolwiek innej zawartości. Jeśli nastąpi ponowne uruchomienie, jest to ledwo zauważalne dla użytkownika.
Używam pamięci lokalnej do przechowywania ostatniego znacznika czasu odwiedzonego w przeglądarce, ale możesz dodać pliki cookie do miksu, jeśli chcesz obsługiwać starsze wersje IE.
Anonimowy użytkownik
Potwierdzenie od:
skrypty pakowania
http://www.asp.net/mvc/tutoria ... ation
.
Żądanie dotyczy pakietu AllMyScripts i zawiera kilka linii zapytań v = r0sL58Dic Łańcuch zapytania v ma token wartości, który jest unikalnym identyfikatorem używanym do buforowania. Do momentu zmiany pakietu aplikacja ASP.NET będzie żądać pakietu AllMyScripts przy użyciu tego tokenu. Jeśli jakikolwiek plik w pakiecie ulegnie zmianie, platforma optymalizacji ASP.NET generuje nowy token, zapewniając, że żądania przeglądarki dotyczące pakietu otrzymają najnowszy pakiet.
Istnieją inne zalety łączenia, w tym zwiększona wydajność podczas ładowania pierwszej strony przy użyciu minifikacji.
Anonimowy użytkownik
Potwierdzenie od:
Doprowadziłoby to do następujących wyników:
<link rel="stylesheet" href="/css/base.css?[hash-here]" type="text/css"/>
Oczywiście rozwiązania datetime również działają w przypadku edycji pliku CSS, ale myślę, że chodzi o zawartość pliku css, a nie pliku z datetime, więc po co je mieszać?
Anonimowy użytkownik
Potwierdzenie od:
https://developer.chrome.com/d ... 3hard reboot
https://developer.chrome.com/d ... eload
Gdy narzędzia programistyczne są otwarte, po prostu naciśnij przycisk Odśwież i zwolnij go, gdy tylko najedziesz kursorem na opcję „Opróżnij pamięć podręczną i mocno załaduj”.
To mój najlepszy przyjaciel i jest to super łatwy sposób na zdobycie tego, czego chcesz!
Anonimowy użytkownik
Potwierdzenie od:
Rozszerzyłem go, aby używać go jako Zend_view_Helper. Ponieważ mój klient uruchamia swoją stronę na hostingu współdzielonym, rozszerzyłem to również, aby to zrobić.
Mam nadzieję, że to pomoże też komuś innemu.
Twoje zdrowie i dzięki.
Anonimowy użytkownik
Potwierdzenie od:
Anonimowy użytkownik
Potwierdzenie od:
twardy reset
, i
pusta pamięć podręczna i twardy restart
... Możesz nacisnąć i przytrzymać przycisk resetowania (w trybie testowym), aby wybrać jeden z nich.
Anonimowy użytkownik
Potwierdzenie od:
możesz dodać parametr zapytania z informacją o wersji do identyfikatora URI, na przykład:
lub możesz dodać informacje o wersji, takie jak:
IMHO druga metoda jest lepsza dla plików CSS, ponieważ mogą zawierać linki do obrazów przy użyciu względnych adresów URL, co oznacza, że jeśli określisz w następujący sposób:
jego adres URL byłby skuteczny:
Oznacza to, że jeśli zaktualizujesz numer używanej wersji, serwer potraktuje go jako nowy zasób i nie użyje wersji z pamięci podręcznej. Jeśli opierasz swój numer wersji na Subversion/CVS/itp. rewizja, co oznacza, że zmiany w obrazach, do których odwołują się pliki CSS, zostaną zauważone. Nie jest to gwarantowane w przypadku pierwszego schematu, tj. Adres URL względem to , który nie zawiera żadnych informacji o wersji.
Zaimplementowałem rozwiązanie buforowania przy użyciu tej techniki z serwletami Java i po prostu obsługuję żądania do za pomocą serwletu, który deleguje podstawowy zasób (tj.
/ styles/screen. Css ). w trybie programistycznym ustawiłem nagłówki pamięci podręcznej, które mówią klientowi, aby zawsze sprawdzał aktualność zasobu na serwerze (zwykle skutkuje to 304, jeśli delegujesz Tomcat[code]DefaultServlet
i plik, .js [/code]itp. nie zmienił się), podczas gdy w trybie wdrażania ustawiam nagłówki z napisem „pamięć podręczna na zawsze”.Anonimowy użytkownik
Potwierdzenie od:
Jeśli potrzebujesz buforować całą wersję, możesz dodać kod, aby wydrukować datę pliku lub coś podobnego. Jeśli używasz języka Java, możesz użyć niestandardowego tagu, aby elegancko wygenerować link.
Anonimowy użytkownik
Potwierdzenie od:
Pliki Js lub Css zawarte w ten sposób:
Global.JsPostfix i Global.CssPostfix są obliczane w Global.asax w następujący sposób:
Anonimowy użytkownik
Potwierdzenie od:
Anonimowy użytkownik
Potwierdzenie od:
Ten kod zasadniczo dodaje sygnaturę czasową pliku jako parametr zapytania do adresu URL. Wywołanie następnej funkcji
doprowadzi do tego
Zaletą jest oczywiście to, że nigdy więcej nie musisz zmieniać kodu HTML, dotknięcie pliku CSS automatycznie unieważni pamięć podręczną. Działa bardzo dobrze bez zauważalnego obciążenia.
Anonimowy użytkownik
Potwierdzenie od:
Anonimowy użytkownik
Potwierdzenie od: