在Rails 4开发环境中将资产组合到单个文件中

时间:2013-06-06 19:33:19

标签: ruby-on-rails sprockets ruby-on-rails-4

我正在尝试将所有供应商资产提取到单独的文件中,并在开发环境中将它们作为缩小和组合文件提供。我可以使用debug: false中的javascript_link_tagstylesheet_link_tag这样的帮助来在Rails 3中实现这一点:

<%= stylesheet_link_tag    "vendor",      :media => "all", :debug => false %>
<%= stylesheet_link_tag    "application", :media => "all" %>
<%= javascript_include_tag "vendor",      :debug => false %>
<%= javascript_include_tag "application" %>

这使得Rails即使在开发环境中也可以为我vendor.jsvendor.css提供服务。通常在开发环境中提供application.jsapplication.css

我无法在Rails 4中获得类似的结果,因为如果使用上面的行,那么这将为vendor资产中指定的每个资产生成html:

<script debug="false"... ><script>

如何在Rails 4中实现相同的功能?

我在我的博客上为Rails 3撰写了一篇关于此功能的详细博客文章。如果我的问题不够明确http://itreallymatters.net/post/45763483826/speeding-up-page-load-time-in-rails

,你可以查看一下

4 个答案:

答案 0 :(得分:6)

总体而言:它与Sprockets的回归2.继续阅读以获得解释和解决方案。

调试如何在内部工作

假设您有一个名为vendor.js的文件,其中包含以下内容:

# vendor.js
//= require jquery
//= require knockout
//= ... some more requires

function one() { }
function two() { }
// and some javascript code

首先,让我们看看资产调试的作用:

  1. 如果禁用调试,则放置一个<script src="vendor.js">标记

    (或)

    启用调试时放置多个<script src="vendor.js?body=1">, <script src="jquery.js?body=1">, <script src="knockout.js?body=1">, ...

  2. body=1也是调试的一个组成部分。如果你说<script src="vendor.js?body=1"> - 它vendor.js内呈现javascript。它不包含任何其他require ...代码。

    但是如果你单独vendor.js点击?body=1而没有require ...,那么它也会包含所有javascript_include_tag "vendor", :debug => false代码。

  3. 因此,上述两者的组合产生了必要的调试输出。我们想要做的是,当我们说<script src="vendor.js">时,我们想要一个{em> NO ?body=1附加的L88. if request_debug_assets? 标记。

    解释回归

    The regressed code is here。特别是有缺陷的代码是这一个声明:

    :debug => true

    检查request_debug_assets ?,然后自动设置request_debug_assets? further in line #92。但是L88. if request_debug_assets? && options["debug"] != false 返回true,因为它是在应用程序配置级别设置的。

    理想情况下,这一陈述应该是:

    # config/initializers/sprockets_debug_patch.rb
    module Sprockets::Rails::Helper
    
      def javascript_include_tag(*sources)
        options = sources.extract_options!.stringify_keys
    
        # CHECK options["debug"] as well, not just the global assets.debug
        if request_debug_assets? && options["debug"] != false
          # REST ALL SAME CODE AS ORIGINAL METHOD
    

    解决方案/补丁

    我会提出相同的拉取请求,但在审核并合并拉取请求之前,您可以在初始化程序中执行以下操作:

    stylesheet_include_tag

    同样为Sprockets::Rails::Helper做同样的事情。不幸的是,没有比复制/粘贴方法代码更好的方法了,但这解决了这个问题。

    在整个{{1}}课程中,您会发现所有这些都将在Sprockets 3.x 中弃用。我不知道Rails 4是否计划与Sprockets 3.x一起发货。如果是这样,那么最终可能不需要这些补丁。

答案 1 :(得分:5)

如果您现在不想使用monkeypatch并且只是尝试使用您的应用而不必担心所有资产,那么另一个选择就是设置/更改

config.assets.debug = false
config.assets.compress = false 

在config / development.rb

答案 2 :(得分:0)

我在sprockets-rails master中修复了这个问题,我很快就会发布一个新版本。同时,您可以在应用程序中获取修复程序,将sprockets-rails指向Gemfile中的github:

gem "sprockets-rails", github: "rails/sprockets-rails"

答案 3 :(得分:0)

关于Rails 4.2和sprockets-rails 2.3.3这是有效的:

config.asset.debug = false

然后:

?debug_assets=1