Как заставить клиентов обновлять файлы JavaScript?

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

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

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

stackoverflow.com/questions/118884/…
understack 23.01.2012 13:50
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
621
1
513 656
27
Перейти к ответу Данный вопрос помечен как решенный

Ответы 27

Ответ принят как подходящий

Насколько я знаю, наиболее распространенным решением является добавление ?<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.

Shane Reustle 20.01.2011 23:18

Я всегда знал, что строки запроса - это пара ключ-значение, как в? Ver = 123. Спасибо! :)

Ankur-m 15.02.2012 15:41

Итак, когда вы добавляете более высокую версию javascript, она автоматически загружается в кеш клиента? Или я неправильно это понимаю?

Warre Buysse 20.07.2013 18:12

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

mgherkins 05.08.2013 14:43

Недавно мы столкнулись с той же проблемой, и лучшее, что я мог придумать, - это простая функция, которая прикрепляла «? Mod = 123456», где 123456 - это временная метка unix даты изменения в файле. Кажется, что это решает проблемы, но при этом позволяет кэшировать, где это необходимо. Тем не менее, я все еще видел, как браузеры полностью игнорируют эту директиву и все равно используют старый JS, но я не знаю, есть ли элегантное «полное исправление».

VPel 01.10.2013 02:13

Для осведомленности: это считается взломом. Этот метод заставляет браузер думать, что указывается новый файл, поскольку он просто просматривает полное имя файла, не интерпретируя его. foo.js?1 - это не то же имя, что и foo.js?2, поэтому браузер будет думать, что это два разных файла. Одним из недостатков является то, что оба файла будут одновременно существовать в кеше пользователя, занимая ненужное место.

Lee White 18.09.2014 17:22

Если вы используете grunt, вы можете использовать (a.o.) npmjs.com/package/grunt-cache-breaker

David Bulté 05.06.2015 15:09

Спасибо, я использую файлы .js для хранения текста, и это хорошо сработало (размеры файлов меньше 1 КБ). Я использовал простое время эпохи в perl $ version = time; а затем поместите $ version в javascript во время выполнения. Таким образом, каждую секунду создается уникальная "версия" <script language = "JavaScript" src = "../ notepad / DAVID.js? 1457305438" type = "text / javascript"> </script>

Westrock 07.03.2016 02:02

Другой способ - автоматизировать задачу (gulp / grunt) в ваших сборках (оптимизация файлов), чтобы добавить хэш к файлам сценариев. Этот модуль узла глоток-рев поможет вам легко это сделать. Подробнее

aUXcoder 26.10.2016 21:57

@LeeWhite Оба файла будут кэшироваться в браузере независимо от того, как вы подходите к проблеме. Либо потому, что у них разные параметры запроса, либо разные пути. Так что я не думаю, что это недостаток подхода с параметрами запроса.

Planky 29.11.2016 21:29

Хотя это решение работало для нас локально во время тестирования, в реальной среде браузер по-прежнему кэширует файлы js, в нашем случае Chrome.

Arkiliknam 26.07.2017 17:03

Для 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 есть аналог.

Jeff Mergler 17.08.2018 18:32

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

Кажется, это отлично работает как для файлов .css, так и .js.

TNF 09.03.2021 11:38

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

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

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

Самое простое решение? Не позволяйте браузеру кешировать вообще. Добавить текущее время (в мс) в качестве запроса.

(Вы все еще находитесь в стадии бета-тестирования, поэтому можете привести веские доводы в пользу отказа от оптимизации производительности. Но здесь YMMV.)

ИМХО это плохое решение. Что делать, если вы не участвуете в бета-тестировании и выпускаете важное обновление?

d-_-b 24.08.2010 11:42

Если вы создаете страницу, которая ссылается на файлы JS, простое решение - добавить метку времени последнего изменения файла к созданным ссылкам.

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

Мне нравится это решение, так как оно простое в обслуживании. Если вы обновите файл .js, это все, что вам нужно сделать. Нет необходимости также обновлять какие-либо ссылки на файл, поскольку ваш код автоматически добавит последнюю обновленную метку времени.

NL3294 13.06.2016 19:44

Добавление текущего времени к URL-адресу действительно является распространенным решением. Однако вы также можете управлять этим на уровне веб-сервера, если хотите. Сервер можно настроить для отправки различных заголовков HTTP для файлов javascript.

Например, чтобы принудительно кэшировать файл не дольше 1 дня, вы должны отправить:

Cache-Control: max-age=86400, must-revalidate

Для бета-версии, если вы хотите заставить пользователя всегда получать последнюю версию, вы должны использовать:

Cache-Control: no-cache, must-revalidate

не могли бы вы быть более конкретными?

Kreker 21.06.2012 11:44

Он говорит о заголовках, отправляемых веб-сервером для каждого файла. Например, должно быть настроено в Apache. Я думаю, это был бы лучший подход

Pierre de LESPINAY 25.07.2012 16:16

где вы это настраиваете?

Diego 29.12.2016 19:07

Для веб-приложения для разработки это, возможно, хорошее решение. Для производственного сайта, где вы не хотите навсегда аннулировать кеш, это не лучшее решение, если вы не знать, что каждый браузер целевого клиента пришел на сайт. Это заставляет меня задуматься о возможной функции веб-сервера: адаптировать параметр максимального возраста в соответствии с настроенной датой развертывания. Это было бы круто.

Claude Brisson 15.03.2017 16:48

Chrome ТРЕБУЕТ эти настройки для правильного кеширования. Без них Chrome будет кэшировать файл навсегда. Mozilla использует гораздо более разумное значение по умолчанию. См. Больше на: agiletribe.wordpress.com/2018/01/29/caching-for-chrome

AgilePro 31.01.2018 02:01

Небольшой вклад: «no-cache» не означает, что кеша нет вообще, оно просто указывает браузеру проверять ресурсы на сервере, прежде чем использовать их из кеша. По данным: medium.com/pixelpoint/…

Luiz Rossi 09.10.2019 20:40

Cache-Control: no-cache, must-revalidateне означает всегда получать последнюю версию. Он просто говорит: проверьте ETag и Last-Modified и выполните повторную загрузку, если они не совпадают. В IIS это идеальное решение, потому что ETag всегда отправляется как хэш содержимого файла (поэтому, если файл изменится, клиент обновится автоматически)

Coruscate5 29.12.2020 21:48

Не все браузеры кешируют файлы, содержащие '?'. Что я сделал, чтобы убедиться, что он был кэширован как можно больше, я включил версию в имя файла.

Так что вместо stuff.js?123 я сделал stuff_123.js

Я использовал mod_redirect (я думаю) в apache, чтобы have stuff_*.js перейти на stuff.js

Не могли бы вы подробнее рассказать о том, что вы сделали в .htaccess с помощью mod_redirect?

Venkat D. 08.11.2011 10:15

Подробное объяснение этого метода можно найти на Partletree.com/notebook/…

Karl Bartel 06.12.2011 21:03

Было бы здорово, если бы вы могли включить свой код .htaccess в свой ответ для использования в будущем.

Fizzix 29.02.2016 09:54

Какие браузеры не кэшируют файлы с "?" в этом?

rosell.dk 17.06.2019 12:08

Преимущество использования 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 или иметь папку для каждой версии

Karthik Sankar 30.01.2014 00:29

@ Hc Huyền Minh: Но когда скрипт должен быть перезагружен, его не следует перезагружать из прокси-кеша ...

Stefan Steiger 11.12.2017 20:16

Несмотря на то, что это зависит от платформы, 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 (см. Мой ответ на этой странице)

Ravi Ram 23.01.2014 05:09

Для страниц 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}", которое будет уникальным для каждого выпуска.

Tohid 10.11.2014 19:58

Хотя это, вероятно, отличное решение для среды разработки, оно не подходит для производства. Это полностью отключит кеш каждый раз, когда страница загружается для файла. Представьте, что загружается 10 КБ страниц в день с одним файлом размером 50 КБ, это означает 500 МБ файла Javascript ежедневно.

PhilDulac 06.06.2016 15:16

@PhilDulac, вы можете изменить его с Ticks, чтобы вернуть строковое значение дня, например, или месяца, или недели месяца. В конечном итоге это просто показывает вам, как использовать подход? V.

alex 15.06.2016 18:16

@alex Действительно. Я просто хотел предупредить, что если использование, продемонстрированное в ответе, попадет в производство, это может иметь последствия, которые не проявляются в разработке.

PhilDulac 15.06.2016 19:02

A possible way to ensure that new copies get loaded once every day might be to use ''. Таким образом, он загружается один раз в начале дня, а затем кешируется.

Robb Sadler 13.09.2017 18:17

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:
*

и создавайте этот файл с новой отметкой времени каждый раз, когда вы хотите, чтобы пользователи обновляли свой кеш. В качестве примечания: если вы добавите это, браузер перезагрузит нет (даже когда пользователь обновит страницу), пока манифест не сообщит об этом.

Это решение действительно хорошее, если вы не забываете обновлять файл манифеста :)

Mattis 09.02.2015 12:40

Пожалуйста, прочтите документацию, так как эта функция была удалена из веб-стандартов developer.mozilla.org/en-US/docs/Web/HTML/…

Flavia Obreja 26.10.2015 17:59

FWIW, я не использовал это решение. Было намного проще использовать / поддерживать подход ?<version> .

amos 18.12.2015 17:04

Теперь он устарел!

Amin.Qarabaqi 03.10.2020 16:49

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

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

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

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

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

Нам нужно кешировать файлы, если не произошло никаких изменений.

Leo Lee 18.01.2016 05:45

Как насчет добавления размера файла в качестве параметра загрузки?

<script type='text/javascript' src='path/to/file/mylibrary.js?filever=<?=filesize('path/to/file/mylibrary.js')?>'></script>

Таким образом, каждый раз, когда вы обновляете файл, параметр filever изменяется.

Как насчет того, когда вы обновляете файл и ваше обновление приводит к тому же размеру файла? Каковы шансы?

Здесь используются теги PHP, и если кто-то использует PHP, это действительно хорошая идея.

Jerther 19.04.2017 15:31

Я думаю, что добавление измененного файла было бы лучше, чем размер файла :)

Mazz 24.05.2017 12:22

Моя первоначальная мысль - добавить хеш файла вместо версии.

Mike Cheel 01.09.2017 20:29

Я предполагаю, что это также работает, если добавить отметку времени Unix, верно? например, ‘... file.js? filever == time ()?>

garanda 06.10.2017 21:36

используйте filemtime ($ file), он выводит метку времени файла, с time () вы не можете использовать кеш, поскольку он меняется каждые секунды.

neoteknic 28.11.2017 18:37

Небольшое изменение Размер может не измениться, я использую hash_file('md5', 'js/main.js').

TiTAN 02.12.2019 22:25

Один простой способ. Редактировать 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]

Это вызывает перенаправление, которое с точки зрения производительности является неоптимальным, но рабочим решением.

twicejr 01.08.2017 12:03

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

tolsen64 26.07.2017 23:03

Это атрибут .NET Core, связанный со вспомогательными функциями тегов. Он добавляет к имени скрипта версию, так что сервер / браузер всегда видит последнюю версию и загружает

ccherwin 01.08.2017 01:42

Мы создавали 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>

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

Philip Stratford 23.05.2020 17:31

Вы можете использовать приведенный ниже код по вашей причине, файл кеша с номером версии <script src = "~/JsFilePath/JsFile.js?v=@GetAppVersionNumber ()"> </ scri‌ pt>

dragonal 27.05.2020 09:23

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

<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 после обновления вместо перезапуска страницы. Это гораздо более элегантное решение. Спасибо!

ZX9 06.11.2019 17:37

Спасибо, можно использовать это для проверки того, распознается ли IP-адрес, но не использовался ли он для входа в систему с момента последнего обновления, выполните это на странице индекса после первоначального входа в систему.

Fi Horan 21.11.2019 11:25

onload = "location.reload (true);" Вышеупомянутое не сработало для меня (с использованием фляги и текущей версии Chrome) также: w3schools.com/jsref/met_loc_reload.asp

CodingMatters 31.12.2019 02:20

Вы можете добавить версию файла к своему имени, чтобы она выглядела так:

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"

В случае, если ошибки не возникнет, приветственное приветствие, показанное выше, будет почти незаметным и почти сразу будет заменено на

о нет, пожалуйста, не делай этого

Tristanisginger 26.01.2021 16:42

Другие вопросы по теме