6

我正在尝试将所有供应商资产提取到单独的文件中,并将它们作为压缩和组合文件也在开发环境中提供。我可以通过使用debug: falseinjavascript_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.js,并且vendor.css即使在开发环境中也可以作为一种缩小的组合资产。application.jsapplication.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

4

4 回答 4

7

总体而言:它是 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">-它只呈现 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?

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

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

L88. if request_debug_assets? && options["debug"] != false

解决方案/补丁

我将为此提出一个拉取请求,但在拉取请求被审查和合并之前,您可以在初始化程序中执行以下操作:

# 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课程中,您会发现它说所有这些都将在 Sprockets 3.x 中被弃用。我不知道 Rails 4 是否计划与 Sprockets 3.x 一起发布。如果是这样,那么最终可能不需要这些补丁。

于 2013-06-16T09:08:14.833 回答
6

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

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

在 config/development.rb

于 2013-06-24T22:52:39.727 回答
0

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

gem "sprockets-rails", github: "rails/sprockets-rails"
于 2013-07-14T03:18:30.467 回答
0

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

config.asset.debug = false

接着:

?debug_assets=1
于 2017-01-04T20:42:04.573 回答