Агрессивное кэширование JavaScript

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

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

Действительно ли это - конфигурация веб-сервера? Я должен установить свои файлы JavaScript на никогда кэш? Я видел некоторые интересные методы в Google Web Toolkit, где они на самом деле создают новое имя файла JavaScript любое время, обновление сделано. Я полагаю, что это должно препятствовать тому, чтобы прокси и браузеры сохранили старые версии файлов JavaScript с теми же именами.

Существует ли список лучших практик где-нибудь?

20
задан Cœur 11 July 2019 в 15:04
поделиться

9 ответов

Мы добавляем номер сборки продукта в конец всего JavaScript (и CSS и т.д.) как так:

<script src="MyScript.js?4.0.8243">

Браузеры игнорируют все после того, как вопросительный знак кроме обновлений вызывает новый URL, что означает перезагрузку кэша.

Это обладает дополнительным преимуществом, что можно установить HTTP-заголовки, которые означают "никогда кэш!"

27
ответ дан 29 November 2019 в 23:17
поделиться

Это содержит на копию, кэшируемую в браузере, даже при том, что веб-сервер имеет более новую версию.

Это, вероятно, потому что HTTP Истекает / заголовки Управления Кэша установлены.

http://developer.yahoo.com/performance/rules.html#expires

я записал об этом здесь:

http://www.codinghorror.com/blog/archives/000932.html

Это не плохой совет, по сути, но он может вызвать огромные проблемы, если Вы понимаете его превратно. В IIS Microsoft, например, Истекает, заголовок всегда выключается по умолчанию, вероятно, по той самой причине. Путем установки Истекает заголовок на ресурсах HTTP, Вы говорите клиенту никогда проверка на новые версии того ресурса - по крайней мере, только когда дата истечения срока на Истекает заголовок. , Когда я никогда говорю, я имею в виду это - браузер не будет даже просить новую версию; это просто предположит, что его кэшированная версия хороша пойти, пока клиент не очищает кэш, или кэш достигает даты истечения срока. Yahoo отмечает, что они изменяют имя файла этих ресурсов, когда им нужны они обновленный.

Все, что Вы действительно сохраняете здесь, является стоимостью клиента, проверяющего с помощью ping-запросов сервер для новой версии и получающего 304 не измененный заголовок назад в общем падеже, который не изменил ресурс. Это не является много служебным.. если Вы не Yahoo. Несомненно, если у Вас есть ряд изображений или сценариев, которые почти никогда не изменяют, определенно используют клиент, кэширующийся, и включают заголовок Управления Кэша. Кэширование очень важно для производительности браузера; у каждого веб-разработчика должно быть глубокое понимание того, как кэширование HTTP работает. Но только используйте его хирургическим, ограниченным способом к тем определенным папкам или файлам, которые могут извлечь выгоду. Для чего-либо еще риск перевешивает преимущество. Это - конечно, не что-то, что Вы хотите включенный как общее значение по умолчанию для Вашего всего веб-сайта.. если Вам не нравится изменять имена файлов каждый раз изменения содержания.

9
ответ дан 29 November 2019 в 23:17
поделиться

Я имею также метод просто переименования вещей. Это никогда не перестало работать и довольно легко сделать.

0
ответ дан 29 November 2019 в 23:17
поделиться

Ваш веб-сервер отправляет правильные заголовки, чтобы сказать браузеру, что имеет новую версию? Я также добавил дату к querystring прежде. т.е. myscripts.js? 12:45:03 date=4/14/2008 (только дата была бы закодирована)

0
ответ дан 29 November 2019 в 23:17
поделиться

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

  • Выпуск 1: http://www.foo.com/1/js/foo.js
  • Выпуск 2: http://www.foo.com/2/js/foo.js

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

, После того как Вы делаете это, можно использовать заголовки Expires/Cache-Control, которые позволяют клиентскому кэшу ресурсы JS "навсегда", так как изменения пути с каждым выпуском, который я думаю, - то, что достигал @JasonCohen.

0
ответ дан 29 November 2019 в 23:17
поделиться

@Jason и Darren

<забастовка> IE6 рассматривают что-либо со строкой запроса как некэшируемое. Необходимо найти другой способ получить номер версии в URL, такой как поддельный каталог:

<script src="/js/version/MyScript.js"/>

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

РЕДАКТИРОВАНИЕ: Извините все; это - Сквид, не IE6, который не будет кэшироваться со строкой запроса. Больше информации здесь .

7
ответ дан 29 November 2019 в 23:17
поделиться

Некоторые очень полезные методы в здесь , даже если Вы не планируете использовать powershell для автоматизации развертывания.

0
ответ дан 29 November 2019 в 23:17
поделиться

Если это имеет значение я видел сайт deviantART , вполне большой, служа их файлам JS в качестве 54504.js. Я просто проверил, и посмотрите, что они теперь служат им в качестве v6core.css?-5855446573 v6core_jc.js? 4150339741 и т.д.

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

0
ответ дан 29 November 2019 в 23:17
поделиться

Я написал в блоге сообщение о том, как мы преодолели эту проблему здесь:

Как избежать проблем с кешированием таблиц стилей JavaScript и CSS в ASP.NET

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

7
ответ дан 29 November 2019 в 23:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: