使用资产管道时缓存css / js文件

时间:2013-09-19 20:13:12

标签: javascript ruby-on-rails asset-pipeline

我有一个可以从移动设备大量访问的rails应用程序,所以我正在寻找在设备上积极缓存资产。我遇到的一件事是在启用资产管道的情况下使用缓存的问题。

如果我在 stylesheet_link_tag 上将:缓存选项设置为true,则会遇到服务器无法找到包含< strong> * = require_tree。指令,用于加载我的所有css文件。

No such file or directory - Asset file not found at '.../public/stylesheets/application.css'

我正在研究这个问题,我看到很多东西说你应该提供静态资产而不是使用资产管道,如果你有兴趣缓存你的css / js文件。这很好,但我听到很多关于资产管道是多么棒的东西,我喜欢它提供的缩小方面。

我的问题是:有没有办法利用资产管道的缩小方面,同时还能让浏览器缓存我的css / js文件?

1 个答案:

答案 0 :(得分:1)

是。您不应在js和css标记声明中使用cache:true。在生产模式中,您应该预编译资产,这些资产将由您的网络服务器提供。编译后的资产最终将具有指纹,因此将来如果更新资产,其指纹将发生变化,因此文件名将发生变化,您可以保证浏览器将获得新文件,因此您可以将您的网络服务器配置为对资产使用积极的缓存方法。请阅读rails guide for assets以了解资产的确切运作方式。如果向下滚动到4.1.1部分,您将看到以下文字:

  

4.1.1 远期过期标题

     

预编译资产存在于文件系统中,并由其直接提供   你的网络服务器。默认情况下,它们没有远期标头,所以   得到指纹识别的好处,你将不得不更新你的服务器   用于添加它们的配置。

     

对于Apache:

# The Expires* directives requires the Apache module `mod_expires` to be enabled.
<Location /assets/>
  # Use of ETag is discouraged when Last-Modified is present
  Header unset ETag
  FileETag None
  # RFC says only cache for 1 year
  ExpiresActive On
  ExpiresDefault "access plus 1 year"
</Location>