我正在尝试将所有供应商资产提取到单独的文件中,并在开发环境中将它们作为缩小和组合文件提供。我可以使用debug: false
中的javascript_link_tag
和stylesheet_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.js
和application.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
,你可以查看一下答案 0 :(得分:6)
总体而言:它与Sprockets的回归2.继续阅读以获得解释和解决方案。
假设您有一个名为vendor.js
的文件,其中包含以下内容:
# vendor.js
//= require jquery
//= require knockout
//= ... some more requires
function one() { }
function two() { }
// and some javascript code
首先,让我们看看资产调试的作用:
如果禁用调试,则放置一个<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">
时,我们想要一个{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