Странная перегрузка манифеста html5

У меня странная проблема с файлом манифеста HTML5 в Chrome 5.0.375.99, но в Safari все работает нормально.

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

Я пробовал следующее

  1. перезагрузить компьютер
  2. перезапустите браузер
  3. убедитесь, что объем кэшируемых файлов не превышает 5 Мб
  4. проверьте правильность файлов в файле манифеста, выполнив HEAD
  5. Пробовал использовать другое имя файла манифеста

2 ответа

Решение

Я только что установил канал разработчика Chrome, и проблема все еще возникает, но теперь ведение журнала ошибок стало лучше, и я получаю сообщение "Событие ошибки кэша приложения: изменение манифеста во время обновления, планирование повторов"

Похоже, что Chrome проверяет файл манифеста, если он изменился непосредственно перед загрузкой последней записи в файле манифеста. Ошибка происходит потому, что я использовал текущее значение метки времени в динамически сгенерированном файле манифеста.

Использованная временная метка того времени, когда была собрана моя сборка, и проблема ушла.:)

Я наконец решил это с моей стороны.

Я ленив и хочу, чтобы мой сервер динамически генерировал мой кеш-манифест для меня.

Этот модуль экспорта является ответом на запрос кеш-манифеста на моем сервере.

Спасибо за подсказку о двух запросах, вот как я это сделал с узлом:

//OFFLINE CACHE
var cacheManifest = undefined;

exports.cache = function(req, res){
    if (!cacheManifest) {
        var fsutils = require('modules/utils/fsutils');
        //get the files and generate the output for cache.manifest
        fsutils.getFiles('/public', function(files) {
            var out = 'CACHE MANIFEST\n\ ';
            var len = files.length;
            for (var i = 0; i < len; ++i) {
                out += files[i] + '\n\ ';
            }
            //setup for second request
            cacheManifest = out;
            //send output
            res.header('Content-Type', 'text/cache-manifest');
            res.end(out);
        });
    } else {
        console.log('cache is cahced');
        res.header('Content-Type', 'text/cache-manifest');
        res.end(cacheManifest);
    }
};

Хитрость в том, чтобы не перестраивать ваш кеш-манифест с каждым запросом. По сути, пользователь получает манифест только в первый раз, когда он попадает в ваше приложение, если он изменился, или вы можете принудительно истечь его через клиентский или серверный код.

Первое посещение всегда генерирует последний манифест, после чего вы можете делать все, что захотите.

У меня была ошибка, потому что я (идиотски) генерировал документ с манифестом кэша с каждым запросом, и поскольку chrome выполняет резервное копирование второго запроса, он не соответствовал и не выполнялся.

ДаН.м....

Другие вопросы по тегам