Как заставить клиентов обновить файлы JavaScript? - PullRequest
540 голосов
/ 28 августа 2008

В настоящее время мы работаем в частной бета-версии и поэтому все еще в процессе внесения довольно быстрых изменений, хотя очевидно, что, поскольку использование начинает расти, мы будем тормозить этот процесс. При этом одна из проблем, с которой мы сталкиваемся, заключается в том, что после выпуска обновления с новыми файлами JavaScript клиентские браузеры по-прежнему используют кэшированную версию файла и не видят обновления. Очевидно, что при обращении в службу поддержки мы можем просто сообщить им, чтобы они обновили ctrl F5 , чтобы они получали последние файлы с сервера, но это будет желательно справиться с этим до того времени.

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

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

Ответы [ 23 ]

2 голосов
/ 10 октября 2015

Функцию jQuery getScript также можно использовать для гарантии того, что файл js действительно загружается при каждой загрузке страницы.

Вот как я это сделал:

$(document).ready(function(){
    $.getScript("../data/playlist.js", function(data, textStatus, jqxhr){
         startProgram();
    });
});

Проверьте функцию на http://api.jquery.com/jQuery.getScript/

По умолчанию $ .getScript () устанавливает для параметра кэша значение false. Это добавляет параметр запроса с меткой времени к URL запроса, чтобы браузер загружал скрипт каждый раз, когда его запрашивают.

1 голос
/ 28 августа 2008

Мой коллега только что нашел ссылку на этот метод сразу после того, как я опубликовал (со ссылкой на css) на http://www.stefanhayden.com/blog/2006/04/03/css-caching-hack/. Приятно видеть, что другие используют его, и, похоже, он работает. На этом этапе я предполагаю, что нет лучшего способа, чем find-replace, увеличить эти «номера версий» во всех тегах скрипта?

1 голос
/ 06 октября 2012

Хотя это специфично для фреймворка, у Django 1.4 есть эта функция отсутствует , которая работает аналогично ссылке на сайт "greenfelt" в ответе выше

1 голос
/ 28 ноября 2010

Используйте переменную версии GET для предотвращения кэширования в браузере.

Добавление ?v=AUTO_INCREMENT_VERSION в конец вашего URL предотвращает кеширование браузера - избегая любых и всех кэшированных скриптов.

1 голос
/ 17 сентября 2008

Одним из решений является добавление строки запроса с отметкой времени в URL при получении ресурса. При этом используется тот факт, что браузер не будет кэшировать ресурсы, извлеченные из URL-адресов со строками запроса в них.

Вы, вероятно, не хотите, чтобы браузер вообще не кэшировал эти ресурсы; Скорее всего, вы хотите, чтобы они кэшировались, но вы хотите, чтобы браузер получал новую версию файла, когда он станет доступен.

Наиболее распространенным решением, по-видимому, является вставка метки времени или номера редакции в само имя файла. Это немного больше работы, потому что ваш код должен быть изменен для запроса правильных файлов, но это означает, что, например, версия 7 вашего snazzy_javascript_file.js (т.е. snazzy_javascript_file_7.js) кэшируется в браузере до тех пор, пока вы не выпустите версию 8, а затем ваш код изменится на выборку snazzy_javascript_file_8.js.

1 голос
/ 03 февраля 2013

В PHP :

function latest_version($file_name){
    echo $file_name."?".filemtime($_SERVER['DOCUMENT_ROOT'] .$file_name);
}

В HTML :

<script type="text/javascript" src="<?php latest_version('/a-o/javascript/almanacka.js'); ?>">< /script>

Как это работает:

В HTML напишите filepath и имя, как вы это делаете, но только в функции. PHP получает filetime файла и возвращает filepath+name+"?"+time последнего изменения

1 голос
/ 27 сентября 2018

В настоящее время обычной практикой является создание хеш-кода содержимого в качестве части имени файла, чтобы браузер, особенно IE, перезагружал файлы javascript или css.

Например,

производитель. a7561fb0e9a071baadb9 .js
главный. b746e3eb72875af2caa9 .js

Обычно это работа для инструментов сборки, таких как веб-пакет. Вот еще подробности , если кто-то хочет попробовать, если вы используете веб-пакет.

1 голос
/ 30 июня 2017

Очистка кэша в ASP.NET Core с помощью помощника по тегам поможет вам в этом и позволит вашему браузеру сохранять кэшированные сценарии / css до тех пор, пока файл не изменится. Просто добавьте вспомогательный тег asp-append-version = "true" в тег сценария (js) или link (css):

<link rel="stylesheet" href="~/css/site.min.css" asp-append-version="true"/>

Дейв Пакетт (Dave Paquette) имеет хороший пример и объяснение очистки кэша здесь (внизу страницы) Очистка кэша

0 голосов
/ 01 марта 2019

Ниже сработало у меня:

<head>
<meta charset="UTF-8">
<meta http-equiv="cache-control" content="no-cache, must-revalidate, post-check=0, pre-check=0" />
<meta http-equiv="cache-control" content="max-age=0" />
<meta http-equiv="expires" content="0" />
<meta http-equiv="expires" content="Tue, 01 Jan 1980 1:00:00 GMT" />
<meta http-equiv="pragma" content="no-cache" />
</head>
0 голосов
/ 11 декабря 2018

В asp.net mvc вы можете использовать @DateTime.UtcNow.ToString () для номера версии файла js. Номер версии автоматически меняется с датой, и вы заставляете браузер клиентов автоматически обновлять файл js. Я использую этот метод, и это хорошо работает.

<script src="~/JsFilePath/JsFile.js?v=@DateTime.UtcNow.ToString()"></script>
...