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

6

我有一个Rails应用程序,我正在尝试使用Rack::Offline使用HTML5应用程序缓存。 应用程序.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,我会得到类似的日志 - 看起来清单本身已经被缓存,那么这是否是它抱怨清单已更改的原因? 有什么想法吗?
谢谢!

你最终解决了这个问题吗?下面的答案都没有帮到你。 - Lee Quarella
已解决我的问题并在下面回答了。如果您还没有解决这个问题,希望它对您有所帮助。 - Lee Quarella
5个回答

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

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

嗨,罗伯特。更改清单不应该只是提示Chrome下载清单中的所有内容吗?这就是我正在遵循的教程所说的(http://asciicasts.com/episodes/247-offline-apps-part-1):“当哈希值更改时,这会指示浏览器缓存清单已更改,并且需要重新下载其列出的文件。在开发模式下,每个请求都会发生这种情况,但在生产中,只有当其中一个文件更改时才会发生。” - kmc
@kmc 是的,由于它下载的最后一件事情是清单(再次),而且该清单已更改,因此刚刚下载的文件缓存无效。您可以通过查看服务器日志(可能输出到控制台?)来验证此操作。我不知道您正在使用的库,但如果在清单中的文件没有更改时它会更改清单文件,则不起作用。 - robertc

2

这种情况在Rails开发模式下每次都会发生,因为默认情况下,每次访问页面时都会重新生成密钥。您可以通过在environments/development.rb中将cache_classes设置为true来解决此问题。但是,请注意,cache_classes不仅适用于Rack::Offline。如果您做出更改,则可能会在开发环境中获得一些意外的ActiveRecord行为。


1

我曾经遇到过同样的问题,不得不对 gem 进行更改。我的问题与 /public/images 中的嵌套文件夹有关。

首先找到您的 gem 安装位置("gem environment" 命令可以帮助您),并进入 /rack-offline-0.6.1/lib 目录。

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

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

重新启动Rails服务器,然后再试一次。这对我有用,希望对您有所帮助。

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接