我正在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文件并引用新名称一起破解了一个解决方案,这个工作正常。但必须有一个更好的解决方案。
新资产管道是否以某种方式缓存您引用的文件?如果是这样,我该如何清除缓存?谢谢你的帮助!
答案 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
因此,如果删除清单中引用的文件,然后复制一个具有相同名称的新文件,则不会发生缓存清除。编辑文件时,指纹识别功能会启动,并为文件名生成新的哈希值。这会破坏该文件的缓存。
答案 3 :(得分:10)
rake tmp:clear
为我做了诀窍,我使用的是少量铁路。
答案 4 :(得分:6)
我在config.assets.version = '1.01019'
中使用application.rb
来破坏整个缓存。当我想要推出一个完整的新版本时,我会增加版本,这样就可以了。这样可以解决Rails因任何原因无法重新编译为资产的边缘情况。