Обновления window.applicationCache замораживают браузер — как уменьшить их частоту или заставить их инициироваться пользователем

Я создал веб-приложение, которое кэширует весь необходимый код и данные для использования в автономном режиме через applicationCache. Однако каждый раз, когда приложение запускается, оно немедленно пытается проверить наличие обновлений. Это блокирует браузер на значительный промежуток времени, даже если он не находит ничего для обновления. Такое поведение сильно мешает приложению (в любом случае, разве обновления не должны выполняться в фоновом режиме?). Просто этап проверки занимает много времени на мобильном устройстве, и если он находит обновления, все ставки относительно того, сколько времени займет загрузка (т.к. он должен повторно загружать все файлы) - что также зависает браузер.

Итак, мне интересно:

  1. Есть ли способ делегировать обновления applicationCache общему веб-воркеру? ИЛИ
  2. Есть ли способ заблокировать все обновления applicationCache до тех пор, пока пользователь специально не захочет проверить наличие обновлений и не нажмет кнопку, которая инициирует обновления через applicationCache.update()? ИЛИ
  3. Существуют ли другие способы уменьшить время, затрачиваемое на проверку обновлений?
  4. Разве обновления кеша приложений не должны выполняться асинхронно в фоновом режиме?



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


ОБНОВИТЬ

Хорошо, я играл с заголовками, и ничего не помогло. Я запускаю награду. Если вы можете помочь, пожалуйста!


person ampersand    schedule 04.05.2011    source источник


Ответы (2)


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

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

http://www.html5rocks.com/tutorials/appcache/beginner/#toc-updating-cache

Что касается времени загрузки, связанного с проверкой актуальности манифеста, то с этим у меня никогда не было проблем. Насколько я понимаю, это происходит в фоновом режиме, вы просто обеспокоены тем, что браузер показывает подсказки при загрузке?

person Chris    schedule 30.05.2011
comment
спасибо за попытку. Я уже прочитал эту статью и все остальные хорошие статьи о кеше приложений. У меня уже есть аналогичная функция обновления. Я могу сказать вам следующее: я также думал, что обновления кеша должны происходить в bg, но на самом деле они зависают во время обновления. И браузер обновляется при запуске страницы НЕЗАВИСИМО от того, скажу я это или нет. Меня не интересуют намеки или что-то в этом роде. Меня беспокоит нефункциональный пользовательский интерфейс во время загрузки страницы. Я сейчас скину ссылку, чтобы вы могли все посмотреть. - person ampersand; 01.06.2011
comment
У меня не было возможности взглянуть на это, но, похоже, в обратном вызове dataLoader done выполняется значительный объем работы. Вы уверены, что не это вызывает отставание, которое вы видите? У меня был некоторый опыт работы с jQuery mobile, и мы обнаружили, что любая перестройка пользовательского интерфейса в JavaScript вызывает серьезные проблемы с производительностью (на самом деле мы дошли до того, что заменили jQuery mobile нашей собственной платформой). - person Chris; 01.06.2011
comment
DataLoader в основном делает именно это — загружает данные — из кеша. Вряд ли есть какие-либо манипуляции с домом .... Возможно, это плохой дизайн с моей стороны, но я не уверен. В любом случае, спасибо, что заглянули. - person ampersand; 01.06.2011

abort() метод может быть ответом...когда-нибудь, но я еще не встречал ни одного браузера, который его реализует.

У меня была похожая проблема, и я пробовал все, включая дикую идею поместить манифест внутрь себя, чтобы посмотреть, будет ли он кэшировать себя. Таким образом, я мог бы делать обновления вручную с запросами ajax и анализировать javascript, набитый в localStorage ... yikes.

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

Фаза проверки applicationCache пытается быть асинхронной (по крайней мере, на устройствах, которые я тестировал). Однако, если в манифесте отсутствуют какие-либо файлы, все должно дождаться завершения проверки applicationCache.

Похоже, что когда браузеру нужен файл, который не был кэширован, он ждет, пока applicationCache завершит обновление, прежде чем он сделает запрос на файл — что имеет смысл, поскольку другие ресурсы могут полагаться на отсутствующий файл. Это тормозит рендеринг и заставляет пользовательский интерфейс зависать. Если манифест недоступен (например, в другой сети), пользовательский интерфейс может быть заблокирован примерно на минуту.

Чтобы найти файлы, которые необходимо добавить в манифест, просмотрите журналы сервера, несколько раз обновляя приложение. Под подозрением будут любые запросы GET для файлов, отличных от манифеста.

person two-bit-fool    schedule 08.09.2011