资产管道缓存 CSS?

Posted

技术标签:

【中文标题】资产管道缓存 CSS?【英文标题】:Asset Pipeline Cacheing CSS? 【发布时间】:2011-12-01 03:28:09 【问题描述】:

我正在开发 Rails 3.1 应用程序。我创建了一个application.css.scss.erb 文件。 .erb 到底是因为我想从配置文件中加载一个变量作为 css 中的颜色变量:

$highlight1: #<%= COLOR.highlight1 %>;
$highlight2: #<%= COLOR.highlight2 %>;

一切正常,但我遇到的问题是,每当我更改 COLOR.highlight1 中的值时,它不会反映更改,直到我进入我的 css 文件并更改某些内容(我通常添加一些空格和保存)。那是我看到变化的时候。显然,rails 正在查看文件是否已更改以更新更改。

有什么方法可以至少在开发过程中将其关闭,我可以看到更改而无需修改 css 文件?

也欢迎对我的技术提出任何批评/意见

【问题讨论】:

出于好奇,为什么需要将它存储在常量中? 实际上,我需要包含需要 LESS 的 Twitter Bootstrap。长话短说,我想要一个单独的地方,我可以在其中声明颜色,然后使用该颜色在 SASS 中声明值(这是我的应用程序自始至终使用的)和一点 LESS(这是 Twitter Bootstrap 的工作原理) .有意义吗? 您尝试使用 guard 来监视您的 ruby​​ 文件并强制更新 sass - railscasts.com/episodes/264-guard 【参考方案1】:

也许可以试试:

config.assets.digest = true

在您的开发配置文件中

【讨论】:

【参考方案2】:

Sprockets depend_on 指令用于声明这些类型的依赖项。因此,在您的 css.scss.erb 文件的顶部,连同其他指令(require 和friends),放置如下内容:

//= depend_on "/path/to/colors.rb"

那么当/path/to/colors.rb文件发生变化时,它也会强制css更新。

不幸的是,我从来没有让它与一个资产目录(javascripts/stylesheets/images)的文件外部的相对路径一起工作,所以Sprockets解析的方式可能有问题防止这种情况发生的路径,否则我会遗漏一些东西。这使您可以选择指定绝对路径,这几乎肯定不会在您的所有应用程序环境中工作,或者将常量文件放入您的资产目录(例如,app/assets/stylesheets/colors.rb)。

作为参考,这里是来自 Sprockets (2.0.3) 源代码的 depend_on 指令的文档,位于 sprockets/directive_processor.rb

  # Allows you to state a dependency on a file without
  # including it.
  #
  # This is used for caching purposes. Any changes made to
  # the dependency file will invalidate the cache of the
  # source file.
  #
  # This is useful if you are using ERB and File.read to pull
  # in contents from another file.
  #
  #     //= depend_on "foo.png"
  #

如果有人知道如何指定到其他地方的相对路径,例如 config/initializers 之类的,请告诉我!

【讨论】:

如果您想使用相对路径,请参阅the answer below。【参考方案3】:

http://guides.rubyonrails.org/configuring.html

config.assets.compile 是一个布尔值,可用于在生产中打开实时 Sprockets 编译。

可能想尝试一下,但我不确定它是否实时编译,至少它应该禁用缓存。

【讨论】:

【参考方案4】:

除了大卫费伯的回答。我也需要使用相对路径。

我想用语言环境字典生成一个 js 文件,如果语言环境文件被更改,它将更新:

//= depend_on "../../../config/locales/en.yml"
//= depend_on "../../../config/locales/ja.yml"

var locales = <%= locales.to_json %>;

事实证明,当前(Rails 3.2.3)相对路径只有在相对路径也在资产路径中时才有效!

所以丑陋的解决方案是在config/application.rb中添加路径:

config.assets.paths.unshift Rails.root.join("config", "locales").to_s

【讨论】:

【参考方案5】:

我试试这个,它有效

在 application.rb 中

config.autoload_paths += %W(#config.root/lib/assets_variables)
config.assets.paths << File.join(Rails.root, 'lib', 'assets_variables')

在 lib/assets_variables/color.rb 中

module Color
  def self.default
    'blue'
  end
end

在 app/assets/stylesheets/color.css.scss.erb 中

//= depend_on "color.rb"
$default_color: <%= Color::default %>;
.content 
  color: $default_color;

【讨论】:

以上是关于资产管道缓存 CSS?的主要内容,如果未能解决你的问题,请参考以下文章

在中间人中为视频启用资产管道

从 Rails 资产管道中清除缓存

Rails 3.1 资产管道和缓存

Rails:application.css 不在资产管道中

Rails 5生产资产管道CSS未呈现

使用 Rails 3.1 资产管道有条件地使用某些 css