Howto: файлы Javascript всегда актуальны - PullRequest
2 голосов
/ 22 сентября 2010

У меня есть веб-приложения .NET, которые используют много JavaScript. Файлы .aspx и .js идут рука об руку. Проблема. Файлы .aspx всегда обновляются на клиенте (не кэшируются), но файлы .js вполне могут кэшироваться. Это даже проблема, если файлы кэшируются только для одного сеанса, так как пользователи проводят много часов на моем сайте, и каждый раз, когда я обновляю пару .aspx / .js, у пользователей возникают проблемы.

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

Это мое решение:

.js-References в .aspx:

<script type='text/javascript' src='../scripts/<%# GetScriptLastModified("MyScript.js") %>'></script>

Итак, «GetScriptLastModified» добавит параметр? V =, например:

protected string GetScriptLastModified(string FileName)
{
  string File4Info = System.Threading.Thread.GetDomain().BaseDirectory + @"scripts\" + FileName;
  System.IO.FileInfo fileInfo = new System.IO.FileInfo(File4Info);
  return FileName + "?v=" + fileInfo.LastWriteTime.GetHashCode().ToString();
}

Итак, отрендеренный .js-Link будет выглядеть для клиента так:

<script type='text/javascript' src='/scripts/GamesCharts.js?v=1377815076'></script>

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

Ответы [ 3 ]

2 голосов
/ 22 сентября 2010

Safari отказывается кэшировать URL-адреса с параметрами запроса.Таким образом, вместо параметра запроса вы можете использовать что-то вроде версионного пути и использовать mod_rewrite для его удаления.

Что-то вроде:

<script type='text/javascript' src='/scripts/1377815076/GamesCharts.js'></script>

И в файле конфигурации Apache (конфигурация для других серверов оставленакак домашнее задание):

RewriteEngine On
RewriteRule  ^/scripts/[0-9]+/(.+)$    /scripts/$1
2 голосов
/ 03 июня 2011

Что мы делаем в нашей среде, мы вручную увеличиваем счетчик в вызывающем скрипте:

<script type='text/javascript' src='/scripts/GamesCharts.js?v=1'></script>

Когда происходит обновление файла js, мы просто увеличиваем счетчик:

<script type='text/javascript' src='/scripts/GamesCharts.js?v=2'></script>

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

0 голосов
/ 22 сентября 2010

Просто мысль: вы, вероятно, могли бы просто визуализировать JS как ASPX;Я сделал это для принудительной перезагрузки CSS раньше с помощью JSP.Не горжусь этим решением, но оно работало раньше.

<script type='text/javascript' src='/mycode/GamesCharts.js.aspx'></script>

Затем просто статически визуализируйте JS в файле ASPX.

...