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