Если я не реализую никакого обработчика событий updateready
и не вызываю swapCache()
, означает ли это, что браузер всегда будет использовать первую (самую старую) загруженную версию приложения?
Если нет, то зачем нужен метод swapCache()
?
Если я не реализую никакого обработчика событий updateready
и не вызываю swapCache()
, означает ли это, что браузер всегда будет использовать первую (самую старую) загруженную версию приложения?
Если нет, то зачем нужен метод swapCache()
?
Swapcache гарантирует, что "последующие" вызовы кэшированных ресурсов будут взяты из нового кеша. Последующее значение после swapcache. Чтобы увидеть это в действии, попробуйте установить свойство src для img динамически после вызов swapcache в событии updateready (чтобы браузер загружал его в тот время). Убедитесь, что это изображение еще не загружено нигде на странице, так как это будет исказить этот тест. Теперь измените изображение и измените файлы манифеста (чтобы перезагрузить кешированные файлы). Перезагрузите страницу в своем браузере. Теперь вы должны увидеть новую версию изображения на вашей отображаемой странице. Теперь закомментируйте вызов в swapcache. Внесите изменения в файл манифеста и перезагрузите страницу и, следовательно, все ресурсы. Обновите страницу еще раз (чтобы убедиться, что у вас есть версия из нового кеша). Теперь измените изображение и измените манифест. Снова перезагрузите страницу: теперь вы видите старую версию изображения. В последнем случае браузер завершил загрузку новых версий в кеш, но с тех пор swapcache не был вызван, изображение все еще было взято из старого кеша.
Если вы не выполняете динамическую загрузку ресурсов на своей странице, swapcache не имеет эффекта.
В частности, если вы перезагрузите страницу в обработчике событий updateready, вызывающем swapcache сначала не имеет никакого эффекта, так как перезагрузка страницы все равно будет получена из нового кеша.
У меня есть приложение с довольно большим кешем ( > 100 Мб). Это занимает особенно много времени, чтобы обмениваться кешем (и в значительной степени блокирует браузер, пока это происходит). Поэтому я показываю сообщение о том, что приложение обновляется (пожалуйста, подождите...), затем вызовите swapCache()
, а затем отобразите новое сообщение, когда оно будет указано с указанием завершения.
Не уверен, что это отвечает на ваш вопрос (почему он обязательно нужен), но я думаю, что он обеспечивает действительный прецедент для swapCache()
по крайней мере.
Представьте себе два разных сценария.
Вы вызываете location.reload()
, когда доступно новое содержимое. Страница перезагрузится, используя все новое содержимое. applicationCache.swapCache()
в этом случае не требуется.
Пользователь продолжает взаимодействовать со своей страницей без перезагрузки. Это взаимодействие заставляет актив динамически загружаться. Ради аргументов, представьте себе, что это изображение опрокидывания, и представьте, что вы только что обновили это изображение опрокидывания. Без applicationCache.swapCache()
ваш пользователь будет продолжать видеть старое изображение опрокидывания. После applicationCache.swapCache()
, он/она увидит новое изображение опрокидывания.
Так что applicationCache.swapCache()
без перезагрузки говорит: "Храните страницу так, как она была, когда она была загружена, но теперь используйте любые новые активы, как только страница их попросит".
Метод SwapCache обеспечивает механизм для приложения, чтобы контролировать, как при применении обновлений. В обычных приложениях HTML может быть сложно определить, присутствует ли в браузере клиентов правильный JS. Кроме того, реализация браузера зависит от того, когда будет обновляться кеш, я нашел iPhone особенно упрямым. swapCache вернул мне контроль над тем, как обновляется мое приложение, то есть я могу выбрать автоматическое применение исправления или позволить пользователю выбирать, когда применять и т.д.
Мне было интересно то же самое. Кажется, я могу запустить успешное обновление, просто позвонив "window.applicationCache.update()". Если файл манифеста был изменен, запускается событие "загрузка", а затем "обновление готово".
Когда я перезагружаю его, он, похоже, был применен. Кажется, мне не нужно вызывать swapCache(). У меня есть возможность вызывать его из приложения, но пока не заметили никакого влияния на процесс обновления.
Вызов обновления() в основном исключает одну перезагрузку, AFAICS.
swapCache
переключится с предыдущего набора ресурсов, перечисленных в манифесте кэш-памяти (когда загружаемый webapp был загружен) в новый набор. Вы все это делаете в ответ на updateready
, что означает, что загружен новый манифест.
Это не следует путать с загрузкой отдельных ресурсов, для которых все еще применяются обычные политики кэширования браузеров. Другими словами, вы поменяете набор ресурсов, но отдельные ресурсы нуждаются в собственном управлении кешем, чтобы обеспечить их перезагрузку, когда вам это нужно.
Я еще не пробовал этого, но, похоже, он предложил бы структурировать код как javascript файл "контроллера обновлений", который обрабатывает процесс обновления, и источники javascript с версией имени файла (или URL) с известными точками входа.