Странная перегрузка манифеста html5
У меня странная проблема с файлом манифеста HTML5 в Chrome 5.0.375.99, но в Safari все работает нормально.
При первой загрузке страницы с файлом манифеста, указанным в первый раз, я могу наблюдать с помощью Fiddler, что все файлы в манифесте загружаются, а затем на полпути через него, кажется, снова получают файл манифеста. В этот момент инициируется событие ошибки и состояние applicationCache становится UNCACHED.
Я пробовал следующее
- перезагрузить компьютер
- перезапустите браузер
- убедитесь, что объем кэшируемых файлов не превышает 5 Мб
- проверьте правильность файлов в файле манифеста, выполнив HEAD
- Пробовал использовать другое имя файла манифеста
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 выполняет резервное копирование второго запроса, он не соответствовал и не выполнялся.
ДаН.м....