仅针对 Rails 中的一个文件进行实时资产编译

Posted

技术标签:

【中文标题】仅针对 Rails 中的一个文件进行实时资产编译【英文标题】:Live assets compilation only for one file in Rails 【发布时间】:2013-02-21 18:36:05 【问题描述】:

config.assets.compile=true 参数可以启用所谓的“实时编译”。 我需要 Rails 在实时模式下针对每个请求编译一个特定的资产(sample.css.scss.erb),但其余资产仍应进行预编译。 我怎样才能做到这一点?

【问题讨论】:

【参考方案1】:

选项 1 - 将 sample.css.scss.erb 放在与 config.assets.manifest (default="public/assets") 不同的路径中,并使用 javascript_include_tag 添加它

选项 2 - 从 config.assets.precompile 中删除它

config.assets.precompile -= %w( sample.css.scss.erb )

确保你清理然后预编译以测试它。

我没有测试任何一个选项,如果有任何适合您的方法,请告诉我们。

【讨论】:

【参考方案2】:

当css被.css.erb文件预处理时,需要对文件进行实时编译。 就是动态编译css。

例如:允许用户设置颜色并希望有条件地使用“实时编译”

在这种情况下,我会建议动态渲染 /users/:id/styles.css.erb 而不是实时编译。

原因可能有数百万用户,在生产环境中使用 Ec2 实例会花费更多。这就是为什么我会建议以下解决方案:

首先在UsersController 上定义您的自定义操作:

# config/routes.rb
match '/users/:id/styles' => 'users#styles', :as => :user_styles

链接到布局中的“样式表”:

# app/views/layouts/application.html.erb
= stylesheet_link_tag 'application', user_styles_path(current_user, :format => 'css')

在控制器中定义动作。您可以在此处执行任何您想要检索用户偏好的操作:

# app/controllers/users_controller.rb
class UsersController < ApplicationController
  def styles
    @colors = User.find(params[:id]).colors
  end
end

那个动作会自动渲染这个视图:

# app/views/users/styles.css.scss.erb
$background-color: <%= @colors[:background] %>;

body 
  background-color: $background-color;

欢迎提出更多想法和建议。

【讨论】:

以上是关于仅针对 Rails 中的一个文件进行实时资产编译的主要内容,如果未能解决你的问题,请参考以下文章

如何加快 Rails 3+ 中的资产预编译?

Rails 3.1 资产预编译 - 包括所有 javascript 文件

Rails 4.2 不创建非消化资产

Rails 预编译供应商/资产

资产监测设备中常见的DES算法简介

未检测到 Rails 预编译资产 Yarn 可执行文件