HTML5应用程序清单未清除清单更改上的缓存

时间:2011-01-18 22:09:58

标签: ruby-on-rails caching html5 offline

我有一个rails应用程序,我试图使用Rack :: Offline使用HTML5应用程序缓存。 application.manifest文件已设置,正在由我的HTML页面下载和检查。 清单如下:

CACHE MANIFEST
# 2d9bf2b03a07dc960fd8fe69659ceeffd4d28ccf8619669a506c3682bf223878
404.html
422.html
500.html
login.html
stylesheets/scaffold.css
javascripts/jquery.min.js
javascripts/jquery.js
javascripts/application.js
javascripts/rmbz.js
javascripts/rails.js
images/rails.png

NETWORK:
/

我正在访问的页面是localhost:3000 / mobile,它的缓存非常好(当我取下rails服务器时可以查看)。但是,它引用的application.manifest文件已更改(实际上它通过操作注释的十六进制ID随每个请求而更改),但Chrome不更新页面。 Chrome中的控制台日志提供以下内容:

Document was loaded from Application Cache with manifest http://localhost:3000/application.manifest
Application Cache Checking event
Application Cache Downloading event
Application Cache Progress event (0 of 12) http://localhost:3000/login.html
Application Cache Progress event (1 of 12) http://localhost:3000/404.html
Application Cache Progress event (2 of 12) http://localhost:3000/422.html
Application Cache Progress event (3 of 12) http://localhost:3000/javascripts/rails.js
Application Cache Progress event (4 of 12) http://localhost:3000/javascripts/rmbz.js
Application Cache Progress event (5 of 12) http://localhost:3000/images/rails.png
Application Cache Progress event (6 of 12) http://localhost:3000/500.html
Application Cache Progress event (7 of 12) http://localhost:3000/javascripts/jquery.js
Application Cache Progress event (8 of 12) http://localhost:3000/stylesheets/scaffold.css
Application Cache Progress event (9 of 12) http://localhost:3000/javascripts/jquery.min.js
Application Cache Progress event (10 of 12) http://localhost:3000/mobile
Application Cache Progress event (11 of 12) http://localhost:3000/javascripts/application.js
Application Cache Error event: Manifest changed during update, scheduling retry

我不太明白为什么会失败。它似乎在做到最后一行之前应该做的一切!如果我在浏览器中导航到localhost:3000 / application.manifest,我会得到一个类似的日志 - 似乎清单本身就被缓存了,那么这就是为什么它会抱怨清单已经改变了?有什么想法吗?

谢谢!

5 个答案:

答案 0 :(得分:3)

Rack :: Offline似乎正在使用时间窗口刷新清单文件中的哈希值(lib / rack / offline.rb:84)。

now = Time.now.to_i - Time.now.to_i % @cache_interval

# @cache_interval defaults to 10 seconds 

浏览器请求清单文件两次:一次是在请求开始时,一次所有缓存都成功地离线存储。

当处理您的请求需要相当长的时间(必须加载大量资产)时,可能会发生第一个请求在一个时间窗口内被应答而最终请求在另一个时间窗口中被处理。因此,两个清单中的哈希值都不匹配,因此您会收到“应用程序缓存错误事件:更新期间更改清单,调度重试”错误。

为了减少开发过程中出现此类错误的几率,您可以选择设置更大的cache_interval,如下所示:

offline = Rack::Offline.configure :cache_interval => 20 do
    ...
end

答案 1 :(得分:2)

Chrome请求的最后一个文件是application.manifest,如果原始请求(如您所说)发生了更改,则会使缓存无效。您需要保持清单不变,直到清单中列出的其中一个文件发生更改。

答案 2 :(得分:2)

每次都在Rails开发模式中发生这种情况,因为默认情况下,每次点击页面时都会重新生成密钥。您可以通过在cache_classes中将true设置为environments/development.rb来解决此问题。但是,请注意cache_classes并非特定于Rack::Offline。因此,如果您确实进行了更改,则可能会在开发环境中出现意外的ActiveRecord行为。

答案 3 :(得分:1)

结帐http://railscasts.com/episodes/247-offline-apps-part-1http://railscasts.com/episodes/248-offline-apps-part-2

它解释了缓存,离线,rails / jquery等所涉及的所有问题。

答案 4 :(得分:1)

我遇到了同样的问题,不得不改变宝石本身。我的问题与/ public / images

中的嵌套文件夹有关

首先找到你的宝石安装位置(“宝石环境”会告诉你)并导航到/rack-offline-0.6.1/lib。

编辑文件rack-offline.rb。删除第33行并替换为:

"#{root}/images/**/*.png",
"#{root}/images/**/*.jpg",
"#{root}/images/**/*.gif"]

重新启动rails服务器,然后重试。为我工作,希望它能帮到你。