HTML5 - ApplicationCache не обновляет (только) некоторые файлы

У меня есть приложение, которое использует AppCache для хранения ресурсов в кеше браузера. Мне удалось настроить манифест в файле PHP, чтобы автоматически записывать все файлы, которые должны быть кэшированы (правильно отфильтрованы). Заголовки этого файла следующие:

header('Content-Type: text/cache-manifest');
header("Cache-Control: no-store, no-cache, must-revalidate, max-age=0");
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache");

Он называется appcache.php и правильно указан в моем HTML:

<html manifest="appcache.php">

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

Однако некоторые файлы (в основном файлы Javascript и CSS) не обновляются должным образом. Иногда требуется несколько обновлений манифеста (вместе со всем процессом), иногда требуется всего одно, а иногда это занимает целую вечность, и мне приходится удалять кеш браузера или переходить в режим инкогнито .

Приложение обнаруживает обновление, поэтому манифест не перехватывается и обновляется корректно. Проблема в том, что даже файлы загружаются повторно, они по-прежнему обслуживаются в более старой версии. И главная проблема заключается в том, что это происходит только в некоторых файлах (иногда это файлы css, иногда файлы js и т. д.: файлы не обновляются случайным образом).

На самом деле я использую Chrome v59, и на моем устройстве Android с Chrome v60 происходит то же самое.

Есть ли какое-либо объяснение, почему они не обновляются правильно? Это известная ошибка? Могу ли я что-нибудь сделать, чтобы решить эту проблему?

ОБНОВЛЕНИЕ

Кажется, чаще всего это происходит, когда я делаю несколько обновлений с небольшим промежутком времени между ними. После ожидания 24 часа или около того, это работает с первой попытки. Возможно, это поможет вам догадаться, почему это происходит.

Спасибо.


person Unapedra    schedule 07.07.2017    source источник
comment
Вы когда-нибудь находили решение для этого?   -  person Toby    schedule 19.07.2018
comment
Боюсь, что не смог... Надеюсь, к настоящему моменту решили или хотя бы улучшили, может, с сервисворками (много было с тех пор, как в последний раз работал с оффлайн кешем).   -  person Unapedra    schedule 20.07.2018


Ответы (1)


Возможно, ваш файл манифеста кэшируется, вы можете установить заголовки expires для его истечения сразу.

Я бы предложил добавить метод swapCache

$(function() {    
 if (window.applicationCache) {
        applicationCache.addEventListener('updateready', function() {        
     if (window.applicationCache.status == 
       window.applicationCache.UPDATEREADY) {
       window.applicationCache.swapCache();
       console.log("appcache updated");
       window.location.reload();
      }
     });
    }
  }

Другое дело, чтобы принудительно загрузить любой новый (или измененный) файл, вы должны обновить файл манифеста (что похоже на то, что вы это делаете).

Наиболее распространенный из них заключается в том, что вы можете не обслуживать манифест с правильным типом MIME (текст/кэш-манифест).

Возможно, вы получаете сообщение об ошибке. Самый простой способ проверить ошибку — открыть страницу в Chrome и посмотреть в консоли и на вкладке ресурсов в AppCache, чтобы увидеть, есть ли ошибка (она будет жаловаться на то, что файл обслуживается неправильно. Вы также можно проверить с помощью команды curl -I:

curl -I $manifest_file_URL  
person pk_code    schedule 07.07.2017
comment
Он выполняет весь процесс правильно, и манифест обновляется (иначе события не будут запускаться). Ошибки тоже нет. И его не поймают, потому что приложение обнаруживает, что оно изменилось. Проблема в том, что некоторые файлы обновляются, а другие (в основном js и css) нет. - person Unapedra; 08.07.2017