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