我在 Chrome 5.0.375.99 下的 HTML5 清单文件有一个奇怪的问题,但在 Safari 下似乎一切正常。
当第一次使用第一次指定的清单文件加载页面时,我可以使用 Fiddler 观察到清单中的所有文件都被加载,然后在中途似乎再次获得清单文件。此时触发了error事件,applicationCache的状态为UNCACHED。
我试过以下
- 重启电脑
- 重新启动浏览器
- 检查缓存的文件数量是否不超过 5mb
- 通过执行 HEAD 检查清单文件中的文件是否有效
- 尝试使用不同的清单文件名
我在 Chrome 5.0.375.99 下的 HTML5 清单文件有一个奇怪的问题,但在 Safari 下似乎一切正常。
当第一次使用第一次指定的清单文件加载页面时,我可以使用 Fiddler 观察到清单中的所有文件都被加载,然后在中途似乎再次获得清单文件。此时触发了error事件,applicationCache的状态为UNCACHED。
我试过以下
我刚刚安装了 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 执行了第二个备份请求,因此它不匹配并且失败。
丹...