2010-07-15 40 views
3

我在Chrome 5.0.375.99下的HTML5清单文件有一个奇怪的问题,但似乎在Safari下一切正常。奇怪的html5清单重新加载

当第一次加载第一次使用清单文件指定的页面时,我可以使用Fiddler观察清单中的所有文件正在加载,然后半途通过它似乎再次获取清单文件。此时,错误事件被触发并且applicationCache的状态为UNCACHED。

我已经尝试了以下

  1. 重启电脑
  2. 重启浏览器
  3. 检查的文件被缓存的数量不超过5MB
  4. 检查,在清单文件中的文件是通过执行HEAD有效
  5. 使用不同的清单文件名尝试使用

回答

9

我刚刚安装了Chrome开发通道,问题仍然存在,但现在错误日志记录更好,我得到“应用程序缓存错误事件:更新过程中更改,调度重试”显示

看来Chrome会检查清单文件如果在下载清单文件中的最后一项之前它已经改变了。发生错误是因为我在动态生成的清单文件中使用了当前时间戳值。

我的程序集构建时间和问题消失时使用的时间戳。 :)

+0

我有同样的问题,但我不明白您的解决方案... – Sucrenoir 2012-12-14 15:03:27

+0

我也想你是如何解决这个更明确的解释。我使用node.js并表达并动态生成我的清单文件。 – mattdlockyer 2013-01-25 17:14:39

+0

这整个时间戳方法并不总是可用的,请参阅下面的解决方案。 – mattdlockyer 2013-01-26 02:32:43

1

我终于解决了这个问题。

我很懒,我希望我的服务器为我动态生成我的缓存清单。

此模块导出是对我的服务器上缓存清单请求的回答。

谢谢你关于两个请求,尖,所以这里的我如何与节点做到了:

//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); 
    } 
}; 

这里的窍门是不能重建缓存舱单的每个请求。基本上,只有在用户第一次登陆应用时,用户才会获得清单,如果它已更改,或者您可以强制其通过客户端或服务器端代码过期。

第一次访问将始终生成最新的清单,然后您可以做任何你想做的事情。

我有错误,因为我(虚拟)生成缓存清单文档与每个请求,因为铬做备份第二次请求它不匹配和失败。

Danm ...