我在Heroku上部署了一个Rails应用程序(web-server thin)。
当我推送它时,我可以看到资产已正确预编译 (运行:rake资产:预编译)
但是,当我转到我的应用网站时,我在两个页面之间浏览时使用相同的预编译标题
<head>
<-- ... other stuffs ... -->
<script src="/assets/application-5452d0cdbf85c04748c35fac325cd1d7.js" type="text/javascript"></script>
</head>
我可以看到(Chrome已确认[注意:禁用缓存设置为:开发人员工具中没有]和Safari&amp; Firefox相同的缓慢程度)文件重新加载。
Heroku日志正在确认
Heroku logs
2011-11-03T11:03:08+00:00 app[web.1]: cache: [GET /assets/application-5452d0cdbf85c04748c35fac325cd1d7.js?_=1320318188543] miss
从几个网站上浏览,似乎静态内容设置需要在级别的网络服务器上完成,而在ruby文档中,它解释了如何为apache做什么(http://guides.rubyonrails.org/ caching_with_rails.html)。
It’s the responsibility of the web server you use to set the far-future expiration date on cache assets that you need to take advantage of this feature.
有关瘦身的经验以及如何配置js资产的到期日期?
感谢
答案 0 :(得分:1)
经过两天的研究,我发现了什么是错的。
“负责”是jquery及其处理Ajax调用的方式
jQuery.ajax()
cacheBoolean默认值:true,false表示dataType“script”和“jsonp”如果设置为false,它将强制浏览器不缓存请求的页面。将cache设置为false还会将查询字符串参数“_ = [TIMESTAMP]”附加到URL。
添加以下代码修复了我的问题
<script>
$.ajaxSetup({ cache: true});
</script>
然后浏览器能够正确地重新加载它(我可以在开发人员工具中看到该特定的javascript:大小(来自缓存) - 时间:11ms)。 此外,rails对签署预编译资产的方式将允许我正确地重新加载它们,如果我将对javascript进行修改(也经过测试,标题中包含的内容已从
更改)<script src="/assets/application-158fadc43ade74e58a8087ec8b95e760.js" type="text/javascript"></script>
到
<script src="/assets/application-5452d0cdbf85c04748c35fac325cd1d7.js" type="text/javascript"></script>
这正是我期待和寻找的行为。
答案 1 :(得分:0)
Heroku雪松堆栈上没有任何清漆缓存,历史上为您缓存静态资产,因此Rack Cache或类似产品可能对您感兴趣。
但是,Rails应该在资产上设置标题,告诉浏览器永远缓存它们,留下它来处理缓存。