6

すべてのベンダー資産を個別のファイルに抽出し、それらを開発環境でも縮小および結合されたファイルとして提供しようとしています。debug: false次のように injavascript_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.cssapplication.jsapplication.css

上記の行を使用すると、アセットで指定されたすべてのアセットの html に生成されるため、Rails 4 で同様の結果を達成することはできません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 ...コードも含まれます。

したがって、上記の 2 つを組み合わせると、必要なデバッグ出力が生成されます。私たちがやりたいことは、 と言うとき、 NOが追加されjavascript_include_tag "vendor", :debug => falseた単一の<script src="vendor.js">タグが欲しいということです。 ?body=1

回帰の説明

リグレッション コードはこちらです。具体的には、バグのあるコードは次の 1 つのステートメントです。

L88. if request_debug_assets?

request_debug_assets? をチェックしてから、:debug => true #92 行目でさらに自動的に設定します。ただしrequest_debug_assets?、アプリケーション構成レベルで設定されているため、true を返しています。

この 1 つのステートメントは、理想的には次のようにする必要があります。

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 3.x で非推奨になるとSprockets::Rails::Helper書かれていることがわかります。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 に答える