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从头开始重建目录中的所有内容.
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)
因此,如果删除清单中引用的文件,然后复制一个具有相同名称的新文件,则不会发生缓存清除.编辑文件时,指纹识别功能会启动,并为文件名生成新的哈希值.这会破坏该文件的缓存.
有关完整的故事,请参阅什么是指纹识别以及我为什么要关心?.
akz*_*z92 14
rake tmp:clear 为我做了诀窍,我正在使用少量铁路.
我用config.assets.version = '1.01019'我application.rb来破坏整个缓存.当我想要推出一个完整的新版本时,我会增加版本,这样就可以了.这样可以解决Rails因任何原因无法重新编译为资产的边缘情况.
| 归档时间: |
|
| 查看次数: |
62476 次 |
| 最近记录: |