web-dev-qa-db-ja.com

「config.assets.debug」設定は正確には何をしますか?

単純なRailsアプリケーションの開発を開始しました。数時間の作業の後、削除されたcssがまだWebページに適用されていることに気付きました。

この問題を修正するために、次のアクションを数回実行しました。

  1. サーバーの停止/開始
  2. 使用Railsサーバー
  3. トルクボックスサーバーを使用する
  4. ブラウザのキャッシュを削除する

しかし、何も変わりません。それは非常に奇妙でした-新しいcss定義が適用されましたが、私が削除したものはまだそこにありました。それで、あきらめて新しいプロジェクトを作ることにしました。

新しいプロジェクトをセットアップし(その足場は最初のプロジェクトと同じです)、ビューの1つを開くと、古いプロジェクトのスタイルも適用されました。 http://guides.rubyonrails.org/asset_pipeline.html をもう一度調べて、その設定を確認することにしました。

#Expands the lines which load the assets
config.assets.debug = false

問題を解決します。しかし、このオプションは正確に何をしているのでしょうか?これが本当だったのに、なぜ古いプロジェクトのcssが適用されたのですか?

25
gotqn

このオプションの効果は この投稿 で詳しく説明されていますが、ここでも要約します。 config.assets.debugを変更することの価値は、開発におけるページの読み込み時間とデバッグの容易さの間の妥協点にあります。

基本的に:

config.assets.debug = true:アセットは個別に提供され、開発中のアセットと同じように整理されます。 SASSやCoffeeScriptなどの前処理された言語は、引き続きターゲット言語として表示されます(つまり、それぞれCSSとJS)。

config.assets.debug = false:アセットはapplication.cssapplication.jsなどのファイルにバンドルされています。エラースタックトレースの行番号が正しくなくなる可能性が高く、元のコードにマップするのが難しくなります。

36
bosgood

このWebページにアクセスした場合、Rails Asset Pipelineを使用していて、javascriptファイルの1つに変更を加えてページを再ロードしたため、ここにいる可能性があります。 Chromeの[ソース]タブで検索しても反映されません。

上記のように、config.assets.debug = falseは、Sprockets gemに、すべての個々のjavascriptファイルとcssファイルをそれぞれ1つのapplication.jsとapplication.cssにバンドルするように促します。また、Sprocketsは、関連するすべてのファイルでSASSおよびCoffeeScript(-skip-coffeeを使用しなかった場合)プリプロセッサを実行して、ブラウザが理解できるcssおよびjavascriptファイルを生成します。

重要な注意点の1つは次のとおりです。 Rubyガイドはdebug = falseについてこう言っています:

アセットは、サーバーの起動後の最初のリクエストでキャッシュされます。マニフェスト内のファイルのいずれかがリクエスト間で変更された場合、サーバーは新しいコンパイル済みファイルで応答します。

つまり、リクエスト間でcssファイルまたはjavascriptファイルを変更しない場合、キャッシュが使用されます。ファイルを変更するとすぐに、キャッシュが無効になり、後続のリクエスト用に新しいキャッシュが作成されます。

したがって、JavaScriptファイルに変更を加え、その変更がページの再読み込みに反映されない場合は、このオプションconfig.assets.debugとは関係ありません。

config.action_controller.perform_cachingと呼ばれるこの他のオプションがあります。

ただし、デフォルトでは、このオプションは開発時にデフォルトでfalseに設定されます。つまり、デフォルトでは、キャッシュは実稼働環境でのみ有効になっています。また、現在のバージョンでは、Railsはデフォルトでフラグメントキャッシングにのみ付属しています。ページキャッシングとアクションキャッシング用に別々のgemをインストールする必要があります。

フラグメントキャッシングを使用すると、ビューロジックのフラグメントをキャッシュブロックにラップし、次のリクエストが着信したときにキャッシュストアから提供できます。ただし、ビューフラグメントが変更されると、キャッシュフラグメントも期限切れになります(たとえば、ビューが変わります)。

では、なぜJavaScriptの変更が反映されないのかという疑問が残ります。答えは、ブラウザ自体であるGoogle Chromeが、Railsの設定にもかかわらず、ページをキャッシュしています。キャッシュを削除するには、現在のタブを閉じ、新しいタブを開いて、サイトに再度アクセスします。

1
Donato