从Rails资产管道清除缓存

时间:2012-04-04 02:58:08

标签: javascript ruby-on-rails caching ruby-on-rails-3.1 asset-pipeline

我正在Rails中开始一个新项目,看起来app.js清单文件正在用我引用的javascripts做一些有趣的事情 - 它是否将这些文件缓存为资产管道的一部分?

发生了什么事。我将一个名为jquery.autoresize.js的javascript文件添加到vendor / assets / javascripts文件夹中,然后在application.js清单中引用该文件,如下所示:

//= require jquery.autoresize.js 

然后我启动了rails服务器。但在我的应用程序中导航后,我意识到我不小心添加了错误版本的jquery.autoresize.js文件。因此,我删除了该文件,然后将正确的版本添加到vendor / assets / javascripts文件夹中。但是,令我恐惧的是,当我重新加载页面时,它仍在加载旧的javascript文件。

我尝试清空浏览器缓存,然后退出并重新启动Rails服务器,但无济于事。我通过简单地重命名我的javascript文件并引用新名称一起破解了一个解决方案,这个工作正常。但必须有一个更好的解决方案。

新资产管道是否以某种方式缓存您引用的文件?如果是这样,我该如何清除缓存?谢谢你的帮助!

5 个答案:

答案 0 :(得分:54)

我假设我们正在谈论生产环境。

在生产环境中更改任何javascripts或样式表时,需要运行rake assets:precompile;此任务编译和压缩各种.js和.css文件,并创建由您的视图加载的application.js和application.css文件。

如果您将jquery.autoresize.js替换为带有旧时间戳的版本,则预编译步骤可能会跳过它,认为编译后的版本是最新的。您可以先运行rake assets:clean,然后强制它从头开始重建public/assets目录中的所有内容,从而避免这种情况。

答案 1 :(得分:34)

另请尝试rake assets:clobber。这将完全重置所有内容并删除所有已编译的资产。此外,我经常需要在推送到生产之前设置环境:RAILS_ENV=production rake assets:precompile

答案 2 :(得分:25)

每次编辑内容时,Rails都会自动清除单个文件的缓存。 要清除单个文件的缓存,只需打开文件,编辑一行代码并重新保存即可。 Rails将清除该文件的缓存 ,浏览器将在下次加载页面时加载新文件。

jquery.autoresize.js使用该文件的旧缓存版本的原因是因为删除了旧版本,然后将新版本复制并粘贴到同一文件夹中。由于文件本身从未编辑过,因此Rails继续使用缓存的旧文件。

这是因为资产管道使用指纹识别缓存。

  

指纹识别是一种使文件名依赖的技术   关于文件的内容。当文件内容改变时,   文件名也被更改。对于静态或不经常的内容   改变了,这提供了一个简单的方法来判断是否有两个版本   文件是相同的,即使在不同的服务器或部署日期也是如此。

     

当文件名是唯一的并且基于其内容时,HTTP标头可以   设置鼓励各地的缓存(无论是在CDN,ISP,在   网络设备,或在网络浏览器中)保留自己的副本   内容。更新内容后,指纹将发生变化。   这将导致远程客户端请求新的副本   内容。这通常称为缓存清除。

     

Rails用于指纹识别的技术是插入哈希   将内容写入名称,通常在最后。例如一个CSS   文件global.css可以使用其内容的MD5摘要重命名:

global-908e25f4bf641868d8683022a5b62f54.css

因此,如果删除清单中引用的文件,然后复制一个具有相同名称的新文件,则不会发生缓存清除。编辑文件时,指纹识别功能会启动,并为文件名生成新的哈希值。这会破坏该文件的缓存

有关完整报道,请参阅What is Fingerprinting and Why Should I Care?

答案 3 :(得分:10)

rake tmp:clear为我做了诀窍,我使用的是少量铁路。

答案 4 :(得分:6)

我在config.assets.version = '1.01019'中使用application.rb来破坏整个缓存。当我想要推出一个完整的新版本时,我会增加版本,这样就可以了。这样可以解决Rails因任何原因无法重新编译为资产的边缘情况。