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



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Насколько я знаю, наиболее распространенным решением является добавление ?<version> к ссылке src скрипта.
Например:
<script type = "text/javascript" src = "myfile.js?1500"></script>
I assume at this point that there isn't a better way than find-replace to increment these "version numbers" in all of the script tags?
Может, система контроля версий сделает это за вас? Большинство систем контроля версий имеют способ, например, автоматически вводить номер редакции при регистрации.
Это выглядело бы примерно так:
<script type = "text/javascript" src = "myfile.js?$$REVISION$$"></script>
Конечно, всегда есть лучшие решения, такие как Вот этот.
Кто-нибудь знает, игнорирует ли IE7 это? Кажется, что я игнорирую добавленные данные и использую кешированный файл, когда я тестирую в представлении сопоставимости IE8.
Я всегда знал, что строки запроса - это пара ключ-значение, как в? Ver = 123. Спасибо! :)
Итак, когда вы добавляете более высокую версию javascript, она автоматически загружается в кеш клиента? Или я неправильно это понимаю?
Я думаю, что дело не в более высоком или более низком номере версии, а в изменении значения добавленных переменных на то, что браузер еще не мог кэшировать.
Недавно мы столкнулись с той же проблемой, и лучшее, что я мог придумать, - это простая функция, которая прикрепляла «? Mod = 123456», где 123456 - это временная метка unix даты изменения в файле. Кажется, что это решает проблемы, но при этом позволяет кэшировать, где это необходимо. Тем не менее, я все еще видел, как браузеры полностью игнорируют эту директиву и все равно используют старый JS, но я не знаю, есть ли элегантное «полное исправление».
Для осведомленности: это считается взломом. Этот метод заставляет браузер думать, что указывается новый файл, поскольку он просто просматривает полное имя файла, не интерпретируя его. foo.js?1 - это не то же имя, что и foo.js?2, поэтому браузер будет думать, что это два разных файла. Одним из недостатков является то, что оба файла будут одновременно существовать в кеше пользователя, занимая ненужное место.
Если вы используете grunt, вы можете использовать (a.o.) npmjs.com/package/grunt-cache-breaker
Спасибо, я использую файлы .js для хранения текста, и это хорошо сработало (размеры файлов меньше 1 КБ). Я использовал простое время эпохи в perl $ version = time; а затем поместите $ version в javascript во время выполнения. Таким образом, каждую секунду создается уникальная "версия" <script language = "JavaScript" src = "../ notepad / DAVID.js? 1457305438" type = "text / javascript"> </script>
Другой способ - автоматизировать задачу (gulp / grunt) в ваших сборках (оптимизация файлов), чтобы добавить хэш к файлам сценариев. Этот модуль узла глоток-рев поможет вам легко это сделать. Подробнее
@LeeWhite Оба файла будут кэшироваться в браузере независимо от того, как вы подходите к проблеме. Либо потому, что у них разные параметры запроса, либо разные пути. Так что я не думаю, что это недостаток подхода с параметрами запроса.
Хотя это решение работало для нас локально во время тестирования, в реальной среде браузер по-прежнему кэширует файлы js, в нашем случае Chrome.
Для TortoiseSVN ключевое слово: $ WCREV $, поэтому в приведенном выше примере это будет: <script type = "text/javascript" src = "myfile.js?$WCREV$"></script>, и вы должны вызвать SubWCRev.exe на этапе сборки. Это установит вышеупомянутое значение примерно как <script type = "text/javascript" src = "myfile.js?23863"></script>, где 23863 - это текущая версия SVN. Я полагаю, что в Git есть аналог.
Мой коллега только что нашел ссылку на этот метод сразу после того, как я разместил (со ссылкой на css) на http://www.stefanhayden.com/blog/2006/04/03/css-caching-hack/. Приятно видеть, что другие используют его, и, похоже, он работает. Я предполагаю, что на данный момент нет лучшего способа, чем найти-заменить, для увеличения этих «номеров версий» во всех тегах скрипта?
Кажется, это отлично работает как для файлов .css, так и .js.
Одним из решений является добавление строки запроса с меткой времени к URL-адресу при извлечении ресурса. При этом используется тот факт, что браузер не будет кэшировать ресурсы, извлеченные из URL-адресов со строками запроса в них.
Однако вы, вероятно, не хотите, чтобы браузер вообще не кэшировал эти ресурсы; более вероятно, что вы хотите, чтобы они были кэшированы, но вы хотите, чтобы браузер загружал новую версию файла, когда она становится доступной.
Наиболее распространенное решение - встроить метку времени или номер версии в само имя файла. Это немного больше работы, потому что ваш код необходимо изменить, чтобы запрашивать правильные файлы, но это означает, например, что версия 7 вашего snazzy_javascript_file.js (то есть snazzy_javascript_file_7.js) кэшируется в браузере до тех пор, пока вы не выпустите версию 8, а затем ваш код изменится на получение snazzy_javascript_file_8.js.
Самое простое решение? Не позволяйте браузеру кешировать вообще. Добавить текущее время (в мс) в качестве запроса.
(Вы все еще находитесь в стадии бета-тестирования, поэтому можете привести веские доводы в пользу отказа от оптимизации производительности. Но здесь YMMV.)
ИМХО это плохое решение. Что делать, если вы не участвуете в бета-тестировании и выпускаете важное обновление?
Если вы создаете страницу, которая ссылается на файлы JS, простое решение - добавить метку времени последнего изменения файла к созданным ссылкам.
Это очень похоже на ответ Хуппи, но работает в системах контроля версий без подстановки ключевых слов. Это также лучше, чем добавлять текущее время, поскольку это предотвратит кеширование, даже если файл вообще не изменился.
Мне нравится это решение, так как оно простое в обслуживании. Если вы обновите файл .js, это все, что вам нужно сделать. Нет необходимости также обновлять какие-либо ссылки на файл, поскольку ваш код автоматически добавит последнюю обновленную метку времени.
Добавление текущего времени к URL-адресу действительно является распространенным решением. Однако вы также можете управлять этим на уровне веб-сервера, если хотите. Сервер можно настроить для отправки различных заголовков HTTP для файлов javascript.
Например, чтобы принудительно кэшировать файл не дольше 1 дня, вы должны отправить:
Cache-Control: max-age=86400, must-revalidate
Для бета-версии, если вы хотите заставить пользователя всегда получать последнюю версию, вы должны использовать:
Cache-Control: no-cache, must-revalidate
не могли бы вы быть более конкретными?
Он говорит о заголовках, отправляемых веб-сервером для каждого файла. Например, должно быть настроено в Apache. Я думаю, это был бы лучший подход
где вы это настраиваете?
Для веб-приложения для разработки это, возможно, хорошее решение. Для производственного сайта, где вы не хотите навсегда аннулировать кеш, это не лучшее решение, если вы не знать, что каждый браузер целевого клиента пришел на сайт. Это заставляет меня задуматься о возможной функции веб-сервера: адаптировать параметр максимального возраста в соответствии с настроенной датой развертывания. Это было бы круто.
Chrome ТРЕБУЕТ эти настройки для правильного кеширования. Без них Chrome будет кэшировать файл навсегда. Mozilla использует гораздо более разумное значение по умолчанию. См. Больше на: agiletribe.wordpress.com/2018/01/29/caching-for-chrome
Небольшой вклад: «no-cache» не означает, что кеша нет вообще, оно просто указывает браузеру проверять ресурсы на сервере, прежде чем использовать их из кеша. По данным: medium.com/pixelpoint/…
Cache-Control: no-cache, must-revalidateне означает всегда получать последнюю версию. Он просто говорит: проверьте ETag и Last-Modified и выполните повторную загрузку, если они не совпадают. В IIS это идеальное решение, потому что ETag всегда отправляется как хэш содержимого файла (поэтому, если файл изменится, клиент обновится автоматически)
Не все браузеры кешируют файлы, содержащие '?'. Что я сделал, чтобы убедиться, что он был кэширован как можно больше, я включил версию в имя файла.
Так что вместо stuff.js?123 я сделал stuff_123.js
Я использовал mod_redirect (я думаю) в apache, чтобы have stuff_*.js перейти на stuff.js
Не могли бы вы подробнее рассказать о том, что вы сделали в .htaccess с помощью mod_redirect?
Подробное объяснение этого метода можно найти на Partletree.com/notebook/…
Было бы здорово, если бы вы могли включить свой код .htaccess в свой ответ для использования в будущем.
Какие браузеры не кэшируют файлы с "?" в этом?
Преимущество использования file.js?V=1 перед fileV1.js заключается в том, что вам не нужно хранить несколько версий файлов JavaScript на сервере.
Проблема, которую я вижу с file.js?V=1, заключается в том, что у вас может быть зависимый код в другом файле JavaScript, который ломается при использовании новой версии библиотечных утилит.
Я считаю, что для обеспечения обратной совместимости гораздо лучше использовать jQuery.1.3.js для ваших новых страниц и позволить существующим страницам использовать jQuery.1.1.js, пока вы не будете готовы обновить старые страницы, если это необходимо.
Используйте переменную версии GET, чтобы предотвратить кеширование браузера.
Добавление ?v=AUTO_INCREMENT_VERSION в конец вашего URL-адреса предотвращает кеширование браузера - избегая любых и всех кешированных скриптов.
Google Page-Speed: не включайте строку запроса в URL-адрес для статических ресурсов. Большинство прокси, в первую очередь Squid до версии 3.0, не кэшируют ресурсы с символом "?" в их URL, даже если в ответе присутствует заголовок Cache-control: public. Чтобы включить кэширование прокси для этих ресурсов, удалите строки запроса из ссылок на статические ресурсы и вместо этого закодируйте параметры в самих именах файлов.
В этом случае вы можете включить версию в URL ex: http://abc.com/v1.2 / script.js и использовать apache mod_rewrite для перенаправления ссылки на http://abc.com/script.js. Когда вы меняете версию, клиентский браузер обновит новый файл.
Я пробовал? решение и в IE8, и я получаю ошибку javascript. Перезапись мода - это вариант, но в большинстве случаев у нас не будет такого большого контроля над сервером. Я бы предпочел добавить версию в сам файл js или иметь папку для каждой версии
@ Hc Huyền Minh: Но когда скрипт должен быть перезагружен, его не следует перезагружать из прокси-кеша ...
Несмотря на то, что это зависит от платформы, Django 1.4 имеет эта функция, который работает аналогично ссылке на сайт «greenfelt» в выше ответ.
В 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 последнего изменения.
Для ASP.NET я предполагаю следующее решение с расширенными параметрами (режим отладки / выпуска, версии):
Js или Css файлы включаются таким образом:
<script type = "text/javascript" src = "Scripts/exampleScript<%=Global.JsPostfix%>" />
<link rel = "stylesheet" type = "text/css" href = "Css/exampleCss<%=Global.CssPostfix%>" />
Global.JsPostfix и Global.CssPostfix вычисляются в Global.asax следующим образом:
protected void Application_Start(object sender, EventArgs e)
{
...
string jsVersion = ConfigurationManager.AppSettings["JsVersion"];
bool updateEveryAppStart = Convert.ToBoolean(ConfigurationManager.AppSettings["UpdateJsEveryAppStart"]);
int buildNumber = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.Revision;
JsPostfix = "";
#if !DEBUG
JsPostfix += ".min";
#endif
JsPostfix += ".js?" + jsVersion + "_" + buildNumber;
if (updateEveryAppStart)
{
Random rand = new Random();
JsPosfix += "_" + rand.Next();
}
...
}
Я использую .Ticks (см. Мой ответ на этой странице)
Для страниц ASP.NET я использую следующие
ПЕРЕД
<script src = "/Scripts/pages/common.js" type = "text/javascript"></script>
ПОСЛЕ (принудительная перезагрузка)
<script src = "/Scripts/pages/common.js?ver<%=DateTime.Now.Ticks.ToString()%>" type = "text/javascript"></script>
Добавление DateTime.Now.Ticks работает очень хорошо.
Это идет вразрез со всем механизмом кеширования на стороне клиента. фиктивный параметр следует заменить на что-то вроде "{major version} _ {minor_version} _ {build_number} _ {Revision}", которое будет уникальным для каждого выпуска.
Хотя это, вероятно, отличное решение для среды разработки, оно не подходит для производства. Это полностью отключит кеш каждый раз, когда страница загружается для файла. Представьте, что загружается 10 КБ страниц в день с одним файлом размером 50 КБ, это означает 500 МБ файла Javascript ежедневно.
@PhilDulac, вы можете изменить его с Ticks, чтобы вернуть строковое значение дня, например, или месяца, или недели месяца. В конечном итоге это просто показывает вам, как использовать подход? V.
@alex Действительно. Я просто хотел предупредить, что если использование, продемонстрированное в ответе, попадет в производство, это может иметь последствия, которые не проявляются в разработке.
A possible way to ensure that new copies get loaded once every day might be to use ''. Таким образом, он загружается один раз в начале дня, а затем кешируется.
This usage has been deprected: https://developer.mozilla.org/en-US/docs/Web/HTML/Using_the_application_cache
Этот ответ опоздал всего на 6 лет, но я не вижу его во многих местах ... HTML5 представил Кэш приложения, который используется для решения этой проблемы. Я обнаружил, что новый серверный код, который я писал, вызывал сбой старого javascript, хранящегося в браузерах людей, поэтому я хотел найти способ истечь их javascript. Используйте файл манифеста, который выглядит следующим образом:
CACHE MANIFEST
# Aug 14, 2014
/mycode.js
NETWORK:
*
и создавайте этот файл с новой отметкой времени каждый раз, когда вы хотите, чтобы пользователи обновляли свой кеш. В качестве примечания: если вы добавите это, браузер перезагрузит нет (даже когда пользователь обновит страницу), пока манифест не сообщит об этом.
Это решение действительно хорошее, если вы не забываете обновлять файл манифеста :)
Пожалуйста, прочтите документацию, так как эта функция была удалена из веб-стандартов developer.mozilla.org/en-US/docs/Web/HTML/…
FWIW, я не использовал это решение. Было намного проще использовать / поддерживать подход ?<version> .
Теперь он устарел!
Функцию jQuery getScript также можно использовать, чтобы гарантировать, что файл js действительно загружается каждый раз при загрузке страницы.
Вот как я это сделал:
$(document).ready(function(){
$.getScript("../data/playlist.js", function(data, textStatus, jqxhr){
startProgram();
});
});
Проверить функцию на http://api.jquery.com/jQuery.getScript/
По умолчанию $ .getScript () устанавливает для параметра кеширования значение false. Это добавляет параметр запроса с меткой времени к URL-адресу запроса, чтобы браузер загружал скрипт каждый раз, когда он запрашивается.
Нам нужно кешировать файлы, если не произошло никаких изменений.
Как насчет добавления размера файла в качестве параметра загрузки?
<script type='text/javascript' src='path/to/file/mylibrary.js?filever=<?=filesize('path/to/file/mylibrary.js')?>'></script>
Таким образом, каждый раз, когда вы обновляете файл, параметр filever изменяется.
Как насчет того, когда вы обновляете файл и ваше обновление приводит к тому же размеру файла? Каковы шансы?
Здесь используются теги PHP, и если кто-то использует PHP, это действительно хорошая идея.
Я думаю, что добавление измененного файла было бы лучше, чем размер файла :)
Моя первоначальная мысль - добавить хеш файла вместо версии.
Я предполагаю, что это также работает, если добавить отметку времени Unix, верно? например, ‘... file.js? filever == time ()?>
используйте filemtime ($ file), он выводит метку времени файла, с time () вы не можете использовать кеш, поскольку он меняется каждые секунды.
Небольшое изменение Размер может не измениться, я использую hash_file('md5', 'js/main.js').
Один простой способ. Редактировать htaccess
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_URI} \.(jpe?g|bmp|png|gif|css|js|mp3|ogg)$ [NC]
RewriteCond %{QUERY_STRING} !^(.+?&v33|)v=33[^&]*(?:&(.*)|)$ [NC]
RewriteRule ^ %{REQUEST_URI}?v=33 [R=301,L]
Это вызывает перенаправление, которое с точки зрения производительности является неоптимальным, но рабочим решением.
Очистка кеша в ASP.NET Core с помощью помощника по тегам сделает это за вас и позволит вашему браузеру сохранять кешированные скрипты / css до тех пор, пока файл не изменится. Просто добавьте вспомогательный тег asp-append-version = "true" в свой тег скрипта (js) или ссылки (css):
<link rel = "stylesheet" href = "~/css/site.min.css" asp-append-version = "true"/>
У Дэйва Пакета есть хороший пример и объяснение очистки кеша здесь (внизу страницы) Очистка кеша
Разве это не работает в обычном ASP.NET? Я попытался добавить asp-append-version в свой тег скрипта, и все, что видит браузер, - это тег скрипта в точности так, как он отображается в источнике, включая атрибут asp-append-version.
Это атрибут .NET Core, связанный со вспомогательными функциями тегов. Он добавляет к имени скрипта версию, так что сервер / браузер всегда видит последнюю версию и загружает
Мы создавали SaaS для пользователей и предоставляли им сценарий для прикрепления на странице их веб-сайта, и было невозможно прикрепить версию со сценарием, поскольку пользователь будет прикреплять сценарий к своему веб-сайту для функциональных возможностей, и я не могу заставить их менять версию каждый раз, когда мы обновляем скрипт
Итак, мы нашли способ загружать более новую версию скрипта каждый раз, когда пользователь вызывает исходный скрипт.
ссылка на скрипт, предоставленная пользователю
<script src = "https://thesaasdomain.com/somejsfile.js" data-ut = "user_token"></script>
файл сценария
if ($('script[src^ = "https://thesaasdomain.com/somejsfile.js?"]').length !== 0) {
init();
} else {
loadScript("https://thesaasdomain.com/somejsfile.js?" + guid());
}
var loadscript = function(scriptURL) {
var head = document.getElementsByTagName('head')[0];
var script = document.createElement('script');
script.type = 'text/javascript';
script.src = scriptURL;
head.appendChild(script);
}
var guid = function() {
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
var r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8);
return v.toString(16);
});
}
var init = function() {
// our main code
}
Объяснение:
Пользователь прикрепил предоставленный им скрипт на своем веб-сайте, и мы проверили, существует ли уникальный токен, прикрепленный к скрипту, или нет, используя селектор jQuery, а если нет, то загружаем его динамически с более новым токеном (или версией).
Это вызов одного и того же скрипта дважды, что может быть проблемой производительности, но на самом деле решает проблему, заставляющую скрипт не загружаться из кеша, не помещая версию в фактическую ссылку скрипта, предоставленную пользователю или клиенту.
Disclaimer: Do not use if performance is a big issue in your case.
В настоящее время распространенной практикой является создание хэш-кода содержимого как части имени файла, чтобы заставить браузер, особенно IE, перезагружать файлы javascript или файлы css.
Например,
vendor.a7561fb0e9a071baadb9.js
main.b746e3eb72875af2caa9.js
Обычно это работа инструментов сборки, таких как webpack. Вот еще Детали, если кто-то хочет попробовать, если вы используете webpack.
В asp.net mvc вы можете использовать @ DateTime.UtcNow.ToString () для номера версии файла js. Номер версии автоматически меняется с датой, и вы заставляете браузер клиентов автоматически обновлять файл js. Я использую этот метод, и он хорошо работает.
<script src = "~/JsFilePath/[email protected]()"></script>
Как и в случае с другими предлагаемыми решениями, это приведет к тому, что файл никогда не будет кэшироваться, что обычно нежелательно. Пока в файл не были внесены изменения, вы, вероятно, захотите, чтобы клиент использовал кешированную версию, а не загружал неизмененный файл каждый раз заново.
Вы можете использовать приведенный ниже код по вашей причине, файл кеша с номером версии <script src = "~/JsFilePath/JsFile.js?v=@GetAppVersionNumber ()"> </ scri pt>
Ниже сработало для меня:
<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>
location.reload (правда);
см. https://www.w3schools.com/jsref/met_loc_reload.asp
Я динамически вызываю эту строку кода, чтобы гарантировать, что javascript был повторно получен с веб-сервера, а не из кеша браузера, чтобы избежать этой проблемы.
Добавление onload = "location.reload();" в мою форму позволяет мне получить новый JS после обновления вместо перезапуска страницы. Это гораздо более элегантное решение. Спасибо!
Спасибо, можно использовать это для проверки того, распознается ли IP-адрес, но не использовался ли он для входа в систему с момента последнего обновления, выполните это на странице индекса после первоначального входа в систему.
onload = "location.reload (true);" Вышеупомянутое не сработало для меня (с использованием фляги и текущей версии Chrome) также: w3schools.com/jsref/met_loc_reload.asp
Вы можете добавить версию файла к своему имени, чтобы она выглядела так:
https://www.example.com/script_fv25.js
fv25 => номер версии файла. 25
И в вашем .htaccess поместите этот блок, который удалит часть версии из ссылки:
RewriteEngine On
RewriteRule (.*)_fv\d+\.(js|css|txt|jpe?g|png|svg|ico|gif) . [L]
итоговая ссылка будет такой:
https://www.example.com/script.js
ПЕРЕДНИЙ ВАРИАНТ
Я сделал этот код конкретно для тех, кто не может менять настройки на бэкэнде. В этом случае лучший способ предотвратить очень длинный кеш - это:
new Date().getTime()
Однако для большинства программистов кэш может составлять несколько минут или часов, поэтому приведенный выше простой код вынуждает всех пользователей загружать «каждую просматриваемую страницу». Чтобы указать, как долго этот элемент будет оставаться без перезагрузки, я сделал этот код и оставил несколько примеров ниже:
// cache-expires-after.js v1
function cacheExpiresAfter(delay = 1, prefix = '', suffix = '') { // seconds
let now = new Date().getTime().toString();
now = now.substring(now.length - 11, 10); // remove decades and milliseconds
now = parseInt(now / delay).toString();
return prefix + now + suffix;
};
// examples (of the delay argument):
// the value changes every 1 second
var cache = cacheExpiresAfter(1);
// see the sync
setInterval(function(){
console.info(cacheExpiresAfter(1), new Date().getSeconds() + 's');
}, 1000);
// the value changes every 1 minute
var cache = cacheExpiresAfter(60);
// see the sync
setInterval(function(){
console.info(cacheExpiresAfter(60), new Date().getMinutes() + 'm:' + new Date().getSeconds() + 's');
}, 1000);
// the value changes every 5 minutes
var cache = cacheExpiresAfter(60 * 5); // OR 300
// the value changes every 1 hour
var cache = cacheExpiresAfter(60 * 60); // OR 3600
// the value changes every 3 hours
var cache = cacheExpiresAfter(60 * 60 * 3); // OR 10800
// the value changes every 1 day
var cache = cacheExpiresAfter(60 * 60 * 24); // OR 86400
// usage example:
let head = (document.head || document.getElementsByTagName('head')[0]);
let script = document.createElement('script');
script.setAttribute('src', '//unpkg.com/[email protected]/dist/sweetalert.min.js' + cacheExpiresAfter(60 * 5, '?'));
head.append(script);
// this works?
let waitSwal = setInterval(function() {
if (window.swal) {
clearInterval(waitSwal);
swal('Script successfully injected', script.outerHTML);
};
}, 100);
Простой прием, который мне подходит, чтобы предотвратить конфликты между старыми и новыми файлами javascript. Это означает: если возникнет конфликт и возникнет какая-то ошибка, пользователю будет предложено нажать Ctrl-F5.
Вверху страницы добавьте что-то вроде
<h1 id = "welcome"> Welcome to this page <span style = "color:red">... press Ctrl-F5</span></h1>
выглядит как
Пусть эта строка javascript будет последней, которая будет выполняться при загрузке страницы:
document.getElementById("welcome").innerHTML = "Welcome to this page"
В случае, если ошибки не возникнет, приветственное приветствие, показанное выше, будет почти незаметным и почти сразу будет заменено на
о нет, пожалуйста, не делай этого