从Rails资产管道清除缓存

Aar*_*ray 46 javascript caching ruby-on-rails ruby-on-rails-3.1 asset-pipeline

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

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

//= require jquery.autoresize.js 
Run Code Online (Sandbox Code Playgroud)

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

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

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

ben*_*ado 55

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

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

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

  • 在开发环境中,不使用散列文件名,因此所有内容都基于文件修改日期.(在浏览器中查看源代码以查看HTML标题中的脚本链接.)我的猜测是,在开发环境中,替换文件的修改日期较旧,因此浏览器只使用其缓存版本.您的编辑更新了文件的mod时间,这就是浏览器最终获取新版本的原因. (2认同)

Dex*_*Dex 41

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


Aar*_*ray 25

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

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

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

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

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

Rails用于指纹识别的技术是将内容的哈希值插入到名称中,通常在末尾.例如,可以使用其内容的MD5摘要重命名CSS文件global.css:

global-908e25f4bf641868d8683022a5b62f54.css
Run Code Online (Sandbox Code Playgroud)

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

有关完整的故事,请参阅什么是指纹识别以及我为什么要关心?.

  • 您可以在文件上运行“touch”来更新其时间戳,而不是编辑文件。您可以通过运行“ls -l”并检查修改日期来查看这是否是问题。 (2认同)

akz*_*z92 14

rake tmp:clear 为我做了诀窍,我正在使用少量铁路.

  • 我也必须这样做才能更新 browserify-rails,否则它将找到并使用已被删除的旧文件。`rails asset:clean` 对此不起作用。 (2认同)

use*_*743 6

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