CSS для кэширования активов? - PullRequest
       16

CSS для кэширования активов?

12 голосов
/ 05 октября 2011

Я работаю над приложением Rails 3.1. Я создал файл application.css.scss.erb. .Erb в конце, потому что я хочу загрузить переменную из файла конфигурации в качестве переменной цвета в css:

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

Все работает нормально, но проблема, с которой я сталкиваюсь, заключается в том, что всякий раз, когда я изменяю значение внутри COLOR.highlight1, оно не отражает изменения, пока я не захожу в свой файл CSS и не меняю что-то (обычно я добавляю несколько пробелов и сохрани это). Вот когда я вижу изменения. Очевидно, что rails ищет, был ли файл изменен, чтобы обновить это изменение.

Есть ли способ, по крайней мере, во время разработки, это можно отключить, и я вижу изменения без необходимости изменять файл css?

Любая критика / мнения по моей технике также приветствуются

Ответы [ 5 ]

7 голосов
/ 25 октября 2011

Директива 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).

Для справки, вот документ для директивы depend_on из источника Sprockets (2.0.3), в 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"
  #

Если кто-нибудь знает способ указатьотносительные пути к другим местам, таким как конфиг / инициализаторы или что-то еще, пожалуйста, дайте мне знать!

3 голосов
/ 15 мая 2012

В дополнение к ответу Дэвида Фабера. Мне нужно было использовать относительные пути тоже.

Я хотел создать файл 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
0 голосов
/ 06 декабря 2012

Я пытаюсь это, это работает

в приложении. 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

в приложении / assets / stylesheets / color.css.scss.erb

//= depend_on "color.rb"
$default_color: <%= Color::default %>;
.content {
  color: $default_color;
}
0 голосов
/ 29 ноября 2011

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

  • config.assets.compile - это логическое значение, которое можно использовать для включения компиляции Sprockets в режиме реального времени.

возможно, вы захотите попробовать, но я не уверен, что его компилируют в реальном времени, хотя бы по крайней мере это должно отключить кеширование.

0 голосов
/ 05 октября 2011

может быть попробовать:

config.assets.digest = true

в вашем конфигурационном файле разработки

...