Генерация динамического CSS с использованием шаблонов
Я хочу генерировать динамический CSS с использованием шаблонов и Tilt
а такжеSASS
в Rails 4
,
Допустим, у меня есть следующее
css.sass
шаблон:$class_name: test $width: 329 $height: 425 .view-#{$class_name} width: #{$width}px height: #{$height}px
я нуждаюсь
master.css.sass.erb
(Я не уверен насчет формата), в котором я собираюсь отображать свой шаблон столько раз, сколько мне нужно, с различными параметрами.В
application.css
Я собираюсь иметь что-то вроде этого*= require master.css.sass.erb
Каждый раз, когда я использую шаблон с различными параметрами, я собираюсь добавить строку в master.css.sass.erb
файл. Я не знаю, как передать параметры с помощью Tilt
к css.sass
шаблон. Может ли кто-нибудь помочь и сказать, возможно ли это?
Это то, что я имею до сих пор:
Шаблон
test.css.sass.erb
:$color: <%= color %> body background: #{$color} !important
master.css.sass.erb
файл:<% require 'erb' config_path = File.expand_path("../test.css.sass.erb", __FILE__) template = Tilt.new(config_path) template.render(self, :color => 'yellow') %> .thisisrendered color: red
Обратите внимание, что два файла в одной папке. Проблема в том, что визуализируется только следующий CSS:
.thisisrendered
color: red
1 ответ
Чтобы ответить на ваш вопрос: когда erb компилируется, он выводит только код ruby, содержащийся в оболочке <% = code%>. Ваш текущий код, вероятно, работает нормально (я не знаком с Tilt или прямым SASS), но вы не говорите ему выводить результат в файл sass. Изменить первую строку master.css.sass.erb
от <%
в <%=
и тогда вы можете отлаживать оттуда.
При этом я бы рекомендовал против этого процесса. Вы будете тратить ресурсы на компиляцию таблицы стилей каждый раз, когда она вызывается.
Альтернативный метод заключается в том, чтобы просто сохранять ваши таблицы стилей статичными, как в начальном примере, чтобы их можно было предварительно скомпилировать и кэшировать, а затем создать частичное подобное layouts/_conditional_styles.html.erb
используя фондовый HTML и CSS, как:
<% unless @your_sanitized_style_object.nil? %>
<style>
body{
background: <%= @your_sanitized_style_object.background_color.html_safe %> !important;
}
</style>
<% end %>
Который может переопределить таблицу стилей приложения, будучи отрисованным после файла CSS приложения в вашем layouts/application.html.erb
файл, такой как:
<%= stylesheet_link_tag "application" %>
<%= render "layouts/conditional_styles" %>
Чтобы ответить на ваш вопрос о том, почему вы используете меньше ресурсов, используя предварительно скомпилированные ресурсы, а затем переопределяете их, рассмотрите ваш пример. test.css.sass.erb
$color: <%= color %>
body
background:$color !imporant
Предполагая, что переменная цвета - красный, процесс будет выглядеть примерно так... Сначала ваше приложение будет проходить через него с помощью компилятора erb и даст вам test.css.sass
файл, такой как:
$color: #ff0000
body
background:$color !important
Затем ваше приложение будет снова проходить через код с помощью sass-компилятора, чтобы дать вам test.css
файл, такой как:
body{ background:#ff0000 !important; }
И после всего этого, он будет обслуживать файл. В вашей среде разработки вы не увидите такой большой разницы в производительности, поскольку ваше приложение по умолчанию перестраивает ресурсы для каждого запроса. Разница наступает тогда, когда приходит время подавать ваше приложение в Интернете на производстве.
Если ваши ресурсы не зависят от переменных в приложении, таблицы стилей можно предварительно скомпилировать. Это означает, что ваше приложение компилирует ресурс один раз, а после того, как оно компилирует ресурс, вы получаете таблицу стилей, например test-f25ab2b1286feb7cc98375sac732f7d0.css
,
Таблицы стилей будут идентичны, но уникальным является тот жаргон, который rails добавляет в конец имени файла, когда он что-то компилирует. Этот жаргон известен как отпечаток пальца, и его цель - сообщить серверу о входящем запросе, существует ли более новая версия файла. Если файл не был изменен, и система, выполняющая запрос, уже загрузила этот файл в свой кэш, тогда ваш браузер будет использовать кэшированную версию вместо повторной загрузки таблицы стилей.
Теперь давайте скажем ваш test.css.sass.erb
Например, файл размером около 50 КБ.
Без предварительной компиляции стоимость вашего ресурса:
необходимость проходить этот файл размером 50 КБ 2 раза при каждом запросе, чтобы скомпилировать его из erb > sass > css
необходимость обслуживать этот файл 50 КБ при каждом запросе.
С предварительно скомпилированными активами, которые переопределяются условными стилями, встроенными в html макета, как описано в моем первом ответе:
Ваши затраты на компиляцию снижаются почти до нуля, потому что таблица стилей предварительно скомпилирована, так что ничего не поделаешь
whatever.html.erb
шаблон, который содержит условные стили, уже компилируется вашим erb-компилятором, поэтому вы просто добавляете работу рендеринга переменных.Предварительно скомпилированную таблицу стилей вы обслуживаете только один раз, что означает, что вы экономите ~50 КБ в полосе пропускания на каждый запрос, используя только байты, необходимые для визуализированных зависимых стилей.
Надеюсь, это поможет, для получения дополнительной информации о том, как все это работает, я бы порекомендовал начать с Руководства по рельсам для конвейера активов.