Требуется ли 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) с известными точками входа.