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

Jar*_*man 6 ruby-on-rails sprockets ruby-on-rails-4

我正在尝试将所有供应商资产提取到单独的文件中,并在开发环境中将它们作为缩小和组合文件提供.我可以在Rails 3中使用debug: falsein javascript_link_tagstylesheet_link_taghelper这样做:

<%= stylesheet_link_tag    "vendor",      :media => "all", :debug => false %>
<%= stylesheet_link_tag    "application", :media => "all" %>
<%= javascript_include_tag "vendor",      :debug => false %>
<%= javascript_include_tag "application" %>
Run Code Online (Sandbox Code Playgroud)

这使得Rails能够为我提供服务vendor.js,vendor.css甚至在开发环境中也可以作为一种缩小的合并资产.application.js并且application.css通常在开发环境中服务.

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

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

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

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

Sub*_*has 7

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

调试如何在内部工作

假设您有一个vendor.js使用以下内容调用的文件:

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

function one() { }
function two() { }
// and some javascript code
Run Code Online (Sandbox Code Playgroud)

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

  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">- 它只会在里面呈现javascript vendor.js.它不包含任何其他require ...代码.

    但是,如果你vendor.js单独打击,没有它?body=1,它也包括所有require ...代码.

因此,上述两者的组合产生了必要的调试输出.我们想要做的是,当我们说javascript_include_tag "vendor", :debug => false,我们想要一个没有附加NO的单个<script src="vendor.js">标签. ?body=1

解释回归

回归代码在这里.特别是有缺陷的代码是这一个声明:

L88. if request_debug_assets?
Run Code Online (Sandbox Code Playgroud)

它检查request_debug_assets ?,然后:debug => true 在第92行自动进一步设置.但是request_debug_assets?返回true,因为它是在应用程序配置级别设置的.

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

L88. if request_debug_assets? && options["debug"] != false
Run Code Online (Sandbox Code Playgroud)

解决方案/补丁

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

# 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
Run Code Online (Sandbox Code Playgroud)

也做同样的事情stylesheet_include_tag.不幸的是,没有比复制/粘贴方法代码更好的方法了,但这解决了这个问题.

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


kon*_*ung 5

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

config.assets.debug = false
config.assets.compress = false 
Run Code Online (Sandbox Code Playgroud)

在config / development.rb中