Очистить кеш в JavaScript


179

Как очистить кеш браузера с помощью JavaScript?

Мы развернули последний код JavaScript, но мы не можем получить последний код JavaScript.

От редакции. Этот вопрос частично дублируется в следующих местах, и ответ на первый из следующих вопросов, вероятно, является лучшим. Этот принятый ответ больше не является идеальным решением.

Как заставить браузер перезагрузить кэшированные файлы CSS / JS?

Как заставить клиентов обновить файлы JavaScript?

Динамическая перезагрузка локального Javascript источника / данных JSON


5
Это смущает меня: «Мы развернули последний код JavaScript, но мы не смогли получить последний код JavaScript»
мой экземпляр

14
Я предполагаю, что вы имеете в виду, как заставить клиентские браузеры использовать вашу последнюю версию javascript, а не их кэшированную версию - в этом случае вам нужен ответ Грега. Если вы хотите знать, как это сделать в своем браузере, это ответ Дэвида Джонстона.
Бенджол


4
Обычный подход заключается в том, чтобы прикрепить ?version=xxxфайлы к связанным JS-файлам на этапе сборки. Каждая новая сборка будет запрашивать новую версию файла JS.
Хуан Мендес

1
@JuanMendes Это не всегда работает. Этот же шаг предлагается, когда люди сталкиваются с проблемами, пытаясь увидеть последний значок. Это просто не гарантировано работать.
УсернаМахахахахахах

Ответы:


202

Вы можете вызвать window.location.reload (true), чтобы перезагрузить текущую страницу. Он будет игнорировать любые кэшированные элементы и получать новые копии страницы, CSS, изображений, JavaScript и т. Д. С сервера. Это не очищает весь кеш, но имеет эффект очистки кеша для страницы, на которой вы находитесь.

Однако вашей лучшей стратегией является создание версии пути или имени файла, как указано в различных других ответах. Кроме того, см. Revving Filenames: не используйте строку запроса по причинам, которые не следует использовать в ?v=nкачестве схемы управления версиями.


6
Вау, спасибо! Это хорошо работает и для кеша приложений HTML5, загруженного из файла cache.manifest. У меня был старый манифест, который не удалялся из памяти, поэтому один браузер, в котором он был кэширован, просто не отображал новые файлы. Я набрал это в консоли javascript и работал нормально. Спасибо!
Джей Кросслер

2
но с изменением имени файла ... разве вы не сохраните все предыдущие версии на месте? в противном случае вы получите много неудачных попыток от поисковых систем и что не читать старые версии (или закладки / связанные изображения)
Rodolfo

1
Как это, что я не думал в этом, танк ты
osdamv

1
Это то же самое, что пользователь нажимает кнопку обновления?
GMsoF

2
@Manuel Отключит доступ к странице только из кеша того URL, который вы назвали location.reload (true). Он никогда не удаляет исходную страницу из кэша, так как он просто добавляет метку времени к новому запросу, и если на этой странице выполняются другие вызовы, выполняемые асинхронно, эти запросы НЕ будут отключены. Например. Если вы обновите страницу с помощью reload (true), которая загружает некоторый html, и на этой странице есть скрипт, который выполняет второй вызов ajax для отображения большего количества html на той же странице, во втором запросе не будет отключено кэширование.
J. Schei

114

Вы не можете очистить кеш с помощью JavaScript. Распространенным способом является добавление номера редакции или последней обновленной метки времени в файл, например так:

myscript.123.js

или

myscript.js?updated=1234567890


9
Однако обратите внимание, что многие прокси не будут кэшировать файл, когда у него есть строка запроса Смотрите ответ Кевина Хакансона .
Чиборг

4
Как я могу очистить кеш, когда весь HTML был кэширован? Это не повлияет, даже если номер версии добавлен из-за кэшированного HTML. Помогите
Nandakumar

Если я не могу очистить элемент кэша, то почему MDN говорит, что я могу? Чего мне не хватает? Я попробовал то, что говорит MDN, но не повезло.
Snađошƒаӽ

41

Попробуйте изменить src файла JavaScript? Из этого:

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

К этому:

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

Этот метод должен заставить ваш браузер загрузить новую копию файла JS.


Что делает n = 1?
KyelJmD

это ничего не делает, кроме как быть чем-то другим. это может быть? 12345 или? Кайл
Oneezy

Значит, имя файла тоже нужно менять? Или просто путь src, который нужно изменить?
Фред

20

Помимо кэширования каждый час или каждую неделю, вы можете кэшировать в соответствии с данными файла.

Пример (в PHP):

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

или даже использовать время модификации файла:

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

3
Могу ли я проверить, правильно ли я понимаю? С опцией 1 при изменении файла изменяется хэш контрольной суммы md5, который затем изменяет URL-адрес. Браузер видит новый URL и запускает новую загрузку файла. Полученные данные, добавленные к URL, игнорируются сервером. Если это так, чертовски приятно.
Колин Броган

1
Кроме того, интенсивно ли использует MD5 весь файловый процессор? Я подумываю о том, чтобы сделать это для файлов css и js навсегда, но я не хотел бы видеть снижение скорости сервера из-за этого.
Колин Броган

2
Использование контрольной суммы - хорошая идея, но это должно быть сделано правильно. Вычисляя его, каждый запрос для каждого файла значительно снизит вашу производительность. Querystring не подходит для кеширования, смотрите другие ответы. Правильное использование - добавить контрольную сумму (часть?) Или номер версии к имени файла и использовать вместо этого это новое имя (вы можете использовать скрипт сборки, чтобы сделать это автоматически при развертывании). Смотри ворчание , рев и усмин .
Фризи

10

Вы также можете принудительно перезагружать код каждый час, например, в PHP:

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

или

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

1
привет, что означают "v" и "токен"?
GMsoF

4
@GMsoF - это просто дополнительный параметр get, который используется (в данном случае), чтобы сообщить браузеру, что это «другой» файл. Так что браузер откажется от кэшированной версии и загрузит эту. Это часто используется с «последней датой изменения» файла. Я надеюсь, что это имеет смысл ;-)
Jelmer

6

поместите это в конце вашего шаблона:

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
пожалуйста, предоставьте некоторые объяснения вашего решения
Габриэль Эспиноза,

@GabrielEspinoza он перезагружает файлы с помощью javascript, что позволяет обновлять кэши.
Нео Морина

6

попробуйте использовать это

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

К этому:

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

5

Вот фрагмент того, что я использую для своего последнего проекта.

С контроллера:

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

С точки зрения:

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

Наш процесс публикации генерирует файл с номером ревизии текущей сборки. Это работает с помощью URL, кодирующего этот файл и использующего его в качестве кеша. В случае отработки отказа, если этот файл не существует, используются год и номер недели, чтобы кэширование продолжало работать, и оно будет обновляться не реже одного раза в неделю.

Кроме того, это обеспечивает очистку кеша при каждой загрузке страницы в среде разработки, поэтому разработчикам не нужно беспокоиться об очистке кеша для любых ресурсов (вызовов javascript, css, ajax и т. Д.).


5

или вы можете просто прочитать js файл сервером с помощью file_get_contets, а затем добавить в заголовок echo содержимое js


4

Возможно, «очистка кеша» не так проста, как должна быть. Вместо очистки кеша в моих браузерах я понял, что «касание» файла фактически изменит дату кеширования исходного файла на сервере (проверено на Edge, Chrome и Firefox), и большинство браузеров автоматически загрузят самую свежую свежую копию что на вашем сервере (код, графика и любые мультимедиа тоже). Я предлагаю вам просто скопировать самые последние сценарии на сервере и решить проблему "сделать что-то на ощупь" перед запуском вашей программы, поэтому она изменит дату всех ваших проблемных файлов на самую последнюю дату и время, а затем загрузит свежую копию в ваш браузер:

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

... остальная часть вашей программы ...

Мне потребовалось некоторое время, чтобы решить эту проблему (поскольку многие браузеры по-разному работают с разными командами, но все они проверяют время файлов и сравнивают их с загруженной в браузере копией, если обновление даты и времени выполнят обновление), если вы не может идти по правильному пути, всегда есть другое полезное и лучшее решение. С наилучшими пожеланиями и счастливого кемпинга.


1
Мне нравится этот подход, но, возможно, я реализую это в неправильной области? Кто-нибудь знает, где добавить это в настройке WordPress? Я добавил его в файл functions.php с прямыми ссылками на файлы JavaScript и CSS, но мне все равно пришлось сделать перезагрузку, чтобы заметить изменения.
flipflopmedia

1
То, что вам нужно сделать, находится в вашем главном html-каталоге WordPress, отредактируйте ваш index.php для вызова или выполните команду Touch () для файлов, которые вам нужно обновить и загрузить. У меня были проблемы с небольшими фото и js-файлами, которые застряли в кеше. Я пробовал большинство методов, описанных для освобождения из памяти, но лучший способ - загрузить текущий свежий правильный. Вы можете сделать это, просто выполнив «Touch Thing», так как он ничего не изменяет в файле, просто обновляет текущее время и дату, поэтому обманывает ваш браузер, думая, что его другая версия файла и проблема исправлены. Работает в большинстве браузеров
Luis H Cabrejo

3

У меня были некоторые проблемы с кодом, предложенным yboussard. Внутренняя J-петля не работает. Вот модифицированный код, который я использую с успехом.

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

Если вы используете php, можете сделать:

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

6
Этот вопрос был задан не только четыре года назад, но и имел лучший ответ, даже если он не был принят.

4
Кроме того, этот метод будет повторно загружать файл каждый раз, независимо от фактического номера редакции или изменений, внесенных в файл, что фактически полностью отключит кэширование.
Antti29

2

Cache.delete () можно использовать для новых Chrome, Firefox и Opera.


Разве это не просто часть API сервисных работников?
BanksySan

@BanksySan из 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

Пожалуйста, не дайте неверную информацию. Cache api - это другой тип кэша от http cache

HTTP-кеш запускается, когда сервер отправляет правильные заголовки , вы не можете получить доступ с помощью javasvipt.

Cache api, с другой стороны, запускается, когда вы хотите, он полезен при работе с сервисным работником, поэтому вы можете пересечь запрос и ответить на него из этого типа кеша, см .: ilustration 1 ilustration 2 course

Вы можете использовать эти методы, чтобы всегда иметь свежий контент для ваших пользователей:

  1. Используйте location.reload (true) это не работает для меня, поэтому я бы не рекомендовал это.
  2. Используйте Cache api для сохранения в кеше и пересечения запроса с сервисным работником , будьте осторожны с этим, потому что, если сервер отправил заголовки кеша для файлов, которые вы хотите обновить, браузер сначала ответит из кеша HTTP, и если он не найдет его, он пойдет в сеть, так что вы можете получить старый файл
  3. Измените URL из ваших файлов stactics, я рекомендую вам назвать его с изменением содержимого ваших файлов, я использую md5, а затем преобразовать его в дружественные строки и url, и md5 изменится с содержимым файла, там вы может свободно отправлять заголовки кеша HTTP достаточно долго

Я бы рекомендовал третий увидеть


2

Вы также можете отключить кэширование в браузере с помощью мета-тегов HTML, просто поместив HTML-теги в раздел head, чтобы избежать кэширования веб-страницы во время кодирования / тестирования, а когда вы закончите, вы можете удалить мета-теги.

(в главном разделе)

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

Обновите свою страницу после вставки этого в заголовок и также должны обновить новый код JavaScript.

Эта ссылка даст вам другие варианты, если они вам нужны http://cristian.sulea.net/blog/disable-browser-caching-with-meta-html-tags/

или вы можете просто создать кнопку, как так

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

он обновляется и избегает кеширования, но он будет там на вашей странице, пока вы не закончите тестирование, а затем вы можете снять его. Первый вариант лучше всего.


1

Я склоняюсь к версии своего фреймворка, затем применяю номер версии к сценариям и путям стилей

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

3
ОП не упомянул Coldfusion.
marctrem

@VijayDev 404 по вашей ссылке
умнее

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

закройте и откройте браузер после выполнения кода в консоли.


1
Некоторое объяснение, пожалуйста, что такое "звонок" в приведенном выше коде?
Ананд Рокзз

@AnandRockzz это невозможно, кеш api - это просто новый тип кеша, которым можно управлять с помощью javascipt, поэтому, чтобы удалить что-то оттуда, вы сохранили его, прежде чем посмотреть developer.mozilla.org/en-US/docs/ Web / API / Cache
Джон Балвин Ариас


0

Потому что браузер кеширует ту же ссылку, вы должны добавить случайное число в конце URL. new Date().getTime()создать другое число.

Просто добавьте new Date().getTime()конец ссылки как вызов

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

Вывод: https://stackoverflow.com/questions.php?1571737901173


Добро пожаловать на ТАК! Ваш ответ неясен. Пожалуйста, отредактируйте его. Такого рода ответы, основанные на ссылке, должны быть прокомментированы на случай, если ссылка исчезнет.
Дэвид Гарсия Бодего
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.