Heroku上的rails 3.1 - Javascripts没有缓存

时间:2011-11-03 11:19:43

标签: ruby-on-rails-3 heroku thin

我在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资产的到期日期?

感谢

2 个答案:

答案 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应该在资产上设置标题,告诉浏览器永远缓存它们,留下它来处理缓存。