странная перегрузка манифеста html5 - PullRequest
3 голосов
/ 15 июля 2010

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

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

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

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

Ответы [ 2 ]

9 голосов
/ 31 июля 2010

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

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

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

1 голос
/ 26 января 2013

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

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

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

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

//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 выполняет резервное копирование второго запроса, он не соответствовал и не выполнялся.

даН.м. ...

...