gpt4 book ai didi

ruby-on-rails - 在Rails 4开发环境中将 Assets 合并到一个文件中

转载 作者:行者123 更新时间:2023-12-04 13:40:33 24 4
gpt4 key购买 nike

我正在尝试将所有供应商 Assets 提取到单独的文件中,并在开发环境中将它们用作缩小和组合的文件。我可以在Rails 3中通过在debug: falsejavascript_link_tag帮助器中使用stylesheet_link_tag来做到这一点:

<%= 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用作最小化和组合的 Assets 。 application.jsapplication.css通常在开发环境中使用。

我无法在Rails 4中获得类似的结果,因为如果使用上面的行,则将为 vendor Assets 中指定的每个 Assets 将其生成到html中:
<script debug="false"... ><script>
如何在Rails 4中实现同一目标?

我已经在我的博客上为Rails 3撰写了有关此功能的详细博客文章。您可以检查一下我的问题是否不够清晰 http://itreallymatters.net/post/45763483826/speeding-up-page-load-time-in-rails

最佳答案

总体而言:它是 sprockets 齿2的回归。请继续阅读以获得解释和解决方案。

内部调试的工作方式

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

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

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

首先,让我们看一下 Assets 调试的功能:
  • 如果禁用了调试,则放置一个<script src="vendor.js">标记,

    (或者)

    启用调试时放置多个<script src="vendor.js?body=1">, <script src="jquery.js?body=1">, <script src="knockout.js?body=1">, ...
  • body=1也是调试的组成部分。如果您说<script src="vendor.js?body=1">-它仅呈现vendor.js内部的javascript。它不包含任何其他require ...代码。

    但是,如果您单独打vendor.js,而没有?body=1,那么它也将包括所有require ...代码。

  • 因此,以上两种方法的结合会产生必要的调试输出。我们想要做的是,当我们说 javascript_include_tag "vendor", :debug => false时,我们想要一个没有附加 <script src="vendor.js">?body=1标签。

    解释回归

    The regressed code is here。具体来说, buggy 代码就是这一条语句:
    L88. if request_debug_assets?

    它检查request_debug_assets ?,然后自动设置 :debug => true further in line #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一起发布。如果是这样,则最终可能不需要这些修补程序。

    关于ruby-on-rails - 在Rails 4开发环境中将 Assets 合并到一个文件中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16970652/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com