资产管道缓存 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?的主要内容,如果未能解决你的问题,请参考以下文章