我想在Rails 4
中使用模板和Tilt
和SASS
生成动态CSS。
-
假设我有以下
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
回答您的问题:当erb被编译时,它只输出<%= code %>包装器中包含的ruby代码。您当前的代码可能运行良好(我不熟悉Tilt或straight SASS),但是您没有告诉它将结果输出到SASS文件。将master.css.sass.erb
的第一行从<%
更改为<%=
,然后您可以从那里进行调试。
话虽如此,我还是不建议这样做。每次调用样式表时,都要浪费资源来编译它。
另一种方法是保持你的样式表静态,在你的开头的例子,这样他们可以预编译和缓存,然后创建一个部分,如layouts/_conditional_styles.html.erb
使用stock html和css,如:
<% unless @your_sanitized_style_object.nil? %>
<style>
body{
background: <%= @your_sanitized_style_object.background_color.html_safe %> !important;
}
</style>
<% end %>
可以通过在layouts/application.html.erb
文件中的应用程序css文件之后呈现来覆盖应用程序样式表,例如:
<%= stylesheet_link_tag "application" %>
<%= render "layouts/conditional_styles" %>
要回答你的问题,为什么你使用更少的资源使用预编译的资产,然后覆盖它们,考虑你的例子test.css.sass.erb
$color: <%= color %>
body
background:$color !imporant
假设color变量是红色,这个过程会像这样进行…首先,您的应用程序将使用其erb编译器运行它,并给出一个test.css.sass
文件,如:
$color: #ff0000
body
background:$color !important
然后您的应用程序将使用其sass编译器再次运行代码,以提供test.css
文件,如:
body{ background:#ff0000 !important; }
在所有这些之后,它将提供文件。在您的开发环境中,您不会看到太多的性能差异,因为您的应用程序默认为每个请求重新构建资产。当在生产环境中为web提供应用程序时,区别就出现了。
如果您的资产不依赖于应用程序中的变量,则可以预编译样式表。这意味着您的应用程序只编译一次资产,在它编译完资产后,您会得到一个样式表,如test-f25ab2b1286feb7cc98375sac732f7d0.css
。
样式表将是相同的,但唯一的是rails在预编译时在文件名末尾抛出的所有术语。这个术语被称为指纹,其目的是在传入请求时告诉服务器该文件是否有更新版本。如果文件没有被修改,并且发出请求的系统已经将该文件下载到它的缓存中,那么浏览器将使用缓存的版本,而不是重新下载样式表。
现在假设您的test.css.sass.erb
文件很大,例如50kB。
如果没有预编译,你的资源成本是:
每次请求都要遍历50kB文件2次才能从erb> sass> css编译
必须为每个请求提供50kB的文件。
使用预编译的资源,这些资源被嵌入在布局的html中的条件样式覆盖,正如我在第一个答案中解释的那样:
你的编译成本下降到几乎为零,因为样式表是预编译的,所以没有什么可做的,你的
whatever.html.erb
模板包含条件样式已经被你的动词编译器编译,所以你只是添加渲染变量的工作。您只提供预编译的样式表一次,这意味着您在每个请求上节省了约50kB的带宽,仅使用渲染依赖样式所需的字节。
希望这对您有所帮助,有关所有这些工作原理的更多信息,我建议您从Asset Pipeline Rails指南开始。