Очистіть кеш у JavaScript


179

Як очистити кеш браузера за допомогою JavaScript?

Ми розгорнули найновіший код JavaScript, але не вдається отримати найновіший код JavaScript.

Примітка до редакції: Це запитання повторно дублюється в наступних місцях, і відповідь у першому з наступних питань, мабуть, найкращий. Ця прийнята відповідь вже не є ідеальним рішенням.

Як змусити браузер перезавантажити кешовані файли CSS / JS?

Як змусити клієнтів оновити файли JavaScript?

Динамічно перезавантажуйте локальні дані джерела / json Javascript


5
Це мене бентежить: "Ми розгорнули останній код JavaScript, але нам не вдалося отримати останній код javascript"
instanceof мені

14
Я думаю, ви маєте на увазі, як змусити браузери клієнтів використовувати останню версію javascript, а не їх кешовану версію - у такому випадку вам потрібна відповідь Грега. Якщо ви хочете знати, як це зробити у власному браузері, це відповідь Девіда Джонстона.
Benjol


4
Поширений підхід полягає в тому, щоб приєднати ?version=xxxдо своїх файлів, пов’язаних із JS, через крок збирання. Кожна нова збірка вимагатиме нової версії файлу JS.
Хуан Мендес

1
@JuanMendes Це не завжди працює. Цей самий крок пропонується, коли у людей виникають проблеми, які намагаються побачити найновіший фавікон. Це просто не гарантовано працює.
uSeRnAmEhAhAhAhAhA

Відповіді:


202

Ви можете зателефонувати window.location.reload (правда), щоб перезавантажити поточну сторінку. Він буде ігнорувати будь-які кешовані елементи та отримувати з сервера нові копії сторінки, CSS, зображень, JavaScript тощо. Це не очищає весь кеш, але має наслідком очищення кешу сторінки, на якій ви перебуваєте.

Однак найкращою стратегією є версія версії шляху або імені файлу, як згадується в різних інших відповідях. Крім того, див. Розділ Імена файлів Revving: не використовуйте рядок запитів з причин не використовувати ?v=nяк вашу схему версій.


6
Нічого, дякую! Це добре працює і для кешу заявок HTML5, завантаженого з файлу cache.manifest. У мене був старий маніфест, який не видаляли з пам'яті, тому один браузер, який його кешував, просто не показував нові файли. Я набрав це в консолі javascript і добре працював. Дякую!
JayCrossler

2
але revving, змінивши ім'я файлу ... чи не утримаєте ви всі попередні версії на місці? інакше ви отримаєте багато невдалих спроб пошукових систем, а що не читати старих версій (або зображень із закладками / пов'язаними зображеннями)
Rodolfo

1
як це я не думав у цьому, танк
osdamv

1
Це те саме, що користувач натискає кнопку оновлення?
GMsoF

2
@Manuel Це дозволить лише відключити доступ до сторінки з кешу точного URL-адреси, який ви назвали location.reload (true). Він ніколи не очищає оригінальну сторінку з кеша, оскільки просто додає позначку часу до нового запиту, і якщо є інші дзвінки, зроблені асинхронно цією сторінкою, у цих запитах НЕ буде вимкнено поведінку кешування. Напр. Якщо ви оновлюєте сторінку з перезавантаженням (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 або? Кайл
Онези

Отже, ім'я файлу теж потрібно змінити? Або просто шлях до 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
Використання контрольної суми - хороша ідея, але її слід робити правильно. Розрахувавши його, кожен запит для кожного файлу значно вразить вашу ефективність. Рядок запитів також не корисний для кешування, дивіться інші відповіді. Правильне використання - додавати контрольну суму (частину?) Або номер версії до імені файлу та використовувати це нове ім'я замість цього (ви можете використовувати сценарій збірки, щоб зробити це автоматично при розгортанні). Дивіться грунт , rev та usemin .
Frizi

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" і "token"?
GMsoF

4
@GMsoF - це лише додатковий параметр get, який використовується (в даному випадку) для того, щоб повідомити браузеру, що це "інший" файл. Так що браузер відкине кешовану версію і замість неї завантажить. Це часто використовується з "останньою зміненою датою" файлу. Сподіваюся, це має сенс ;-)
Джелмер

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, завдяки чому кеші оновлюються.
Neo Morina

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, а потім помістити ехо в заголовок вмісту js


4

Можливо, "очистити кеш-пам'ять" не так просто, як має бути. Замість очищення кешу в моїх браузерах я зрозумів, що "торкання" до файлу фактично змінить дату вихідного файлу, кешованого на сервері (випробувано в Edge, Chrome і Firefox), і більшість браузерів автоматично завантажують найновішу свіжу копію Що на вашому сервері (код, графіка та мультимедіа теж). Я пропоную вам просто скопіювати найактуальніші сценарії на сервер і вирішити "робити сенсорну річ" перед запуском програми, так що вона змінить дату всіх ваших проблемних файлів на найактуальнішу дату та час, а потім завантажить нову копію до вашого браузера:

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

... решта вашої програми ...

Щоб вирішити цю проблему, у мене знадобився певний час (оскільки багато браузерів діють по-різному на різні команди, але всі вони перевіряють час файлів і порівнюють із завантаженою вами копією у вашому браузері, якщо різні дати та час оновлять оновлення), якщо ви не може йти належним правильним шляхом, завжди є інше корисне і краще рішення. З найкращими побажаннями та щасливим кемпінгом.


1
Мені подобається такий підхід, але, можливо, я реалізую це в неправильній області? Хтось знає, куди додати це в налаштуваннях WordPress? Я додав його у файл function.php з прямими посиланнями на файли JavaScript та CSS, але мені все одно довелося зробити важке перезавантаження, щоб зміни помітили.
flipflopmedia

1
Що вам потрібно зробити, це у вашому головному каталозі WordPress html, відредагуйте index.php, щоб зателефонувати або виконати команду Touch () для файлів, які потрібно оновити та завантажити. У мене виникли проблеми з невеликими фотографіями та js-файлами, які застрягли в кеші. Я спробував більшість описаних методів звільнити з пам'яті, але найкращий спосіб - це завантажити поточний свіжий правильний. Ви можете дозволити це, просто зробивши "Touch Thing", оскільки він нічого не змінює у файлі, просто оновлює поточний час і дату, щоб дурити ваш браузер, щоб продумати його іншу версію файлу та проблему виправлено. Працює в більшості браузерів
Луїс Х Кабреджо

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 () можна використовувати для нових хром, фаєрфоксу та опери.


Це не лише частина 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

Будь ласка, не вказуйте невірну інформацію. Кеш api - це різний тип кешу від http кеша

Кеш HTTP запускається, коли сервер надсилає правильні заголовки , ви не можете отримати доступ через javasvipt.

Кеш апіте в іншій руці спрацьовують , коли ви хочете, це корисно при роботі з обслуговуванням працівника , щоб ви могли перетинатися запитом і відповісти на нього від цього типу кеша см: ілюстративний 1 ілюстративний 2 курс

Ви можете використовувати ці методи, щоб завжди мати свіжий вміст для своїх користувачів:

  1. Використовувати location.reload (правда) це не працює для мене, тому я не рекомендуватиму його.
  2. Використовуйте Cache api для збереження в кеші та пересікання запиту з працівником служби , будьте обережні з цим, оскільки якщо сервер надіслав заголовки кешу для файлів, які ви хочете оновити, браузер відповість спочатку з кеша HTTP, і якщо він не знайде його, він перейде в мережу, щоб ви могли закінчити і старий файл
  3. Змініть URL-адресу з ваших файлів stactics, моя рекомендація - це ви повинні назвати його зі зміною вмісту ваших файлів, я використовую md5, а потім перетворять його в строковий і URL-адрес, і md5 зміниться зі змістом файлу, там ви Ви можете вільно надсилати заголовки кеша HTTP досить довго

Я б рекомендував третій див


2

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

(у головному розділі)

<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 за ваше посилання
smarber

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

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


1
Деякі пояснення, будь ласка, що таке "дзвінок" у наведеному вище коді?
Ананд Рокз

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


0

Тому що кеш браузера є тим самим посиланням, вам слід додати кінець випадкового числа URL-адреси. new Date().getTime()генерувати інше число.

Просто додайте new Date().getTime()кінець посилання, як дзвінок

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

Вихід: https://stackoverflow.com/questions.php?1571737901173


Ласкаво просимо до SO! Ваша відповідь незрозуміла. Відредагуйте його. Цей вид відповідей, заснованих на посиланні, слід коментувати лише у випадку, якщо посилання зникне.
Девід Гарсія Бодего
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.