Очистить кеш в 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.