58

Rails で新しいプロジェクトを開始していますが、application.js マニフェスト ファイルが、私が参照する JavaScript で何かおかしなことをしているようです。これらのファイルはアセット パイプラインの一部としてキャッシュされますか?

これが何が起こったのかです。jquery.autoresize.js という名前の JavaScript ファイルを vendor/assets/javascripts フォルダーに追加し、次のように application.js マニフェストでファイルを参照しました。

//= require jquery.autoresize.js 

次に、Rails サーバーを起動しました。しかし、アプリ内を移動した後、間違ったバージョンの jquery.autoresize.js ファイルを誤って追加したことに気付きました。そのため、そのファイルを削除してから、正しいバージョンを vendor/assets/javascripts フォルダーに追加しました。しかし、恐ろしいことに、ページをリロードすると、まだ古い JavaScript ファイルがロードされています。

ブラウザのキャッシュを空にしてから、Rails サーバーを終了して再起動しようとしましたが、役に立ちませんでした。JavaScriptファイルの名前を変更し、新しい名前を参照するだけで、問題なく解決できました。しかし、これにはもっと良い解決策が必要です。

新しいアセット パイプラインは、何らかの方法で参照するファイルをキャッシュしますか? もしそうなら、どうすればそのキャッシュをクリアできますか? 助けてくれてありがとう!

4

5 に答える 5

63

実稼働環境について話していると思います。

rake assets:precompile本番環境でJavaScriptまたはスタイルシートを変更する場合は、 ;を実行する必要があります。このタスクは、さまざまな.jsファイルと.cssファイルをコンパイルおよび圧縮し、ビューによってロードされるapplication.jsファイルとapplication.cssファイルを作成します。

古いタイムスタンプjquery.autoresize.jsのバージョンに置き換えた場合、コンパイルされたバージョンが最新であると考えて、プリコンパイル手順でそれがスキップされる可能性があります。最初に実行し、ディレクトリ内のすべてを最初から再構築するように強制することで、これを回避できます。rake assets:cleanpublic/assets

于 2012-09-05T23:22:52.497 に答える
50

また、試してみてくださいrake assets:clobber。これにより、すべてが完全にリセットされ、コンパイルされたすべてのアセットが削除されます。さらに、次のようにして、本番環境にプッシュする前に環境を設定する必要があることがよくありますRAILS_ENV=production rake assets:precompile

于 2015-07-20T13:11:13.053 に答える
27

Rails は、コンテンツが編集されるたびに、個々のファイルのキャッシュを自動的にクリアします。1 つのファイルのキャッシュをクリアするには、ファイルを開き、コード行を編集して、再度保存します。Rails はそのファイルのキャッシュをクリアし、ブラウザーは次回ページが読み込まれたときに新しいファイルを読み込みます。

jquery.autoresize.js がキャッシュされた古いバージョンのファイルを使用していた理由は、古いバージョンが削除され、新しいバージョンがコピーされ、同じ名前で同じフォルダーに貼り付けられたためです。ファイル自体は編集されていないため、Rails はキャッシュされた古いファイルを引き続き使用していました。

これは、アセット パイプラインがキャッシュにフィンガープリンティングを使用するためです。

フィンガープリントは、ファイルの名前をファイルの内容に依存させる手法です。ファイルの内容が変更されると、ファイル名も変更されます。静的またはめったに変更されないコンテンツの場合、これにより、ファイルの 2 つのバージョンが同一であるかどうかを、サーバーや展開日が異なっていても簡単に判断できます。

ファイル名が一意であり、そのコンテンツに基づいている場合、HTTP ヘッダーを設定して、あらゆる場所 (CDN、ISP、ネットワーク機器、Web ブラウザーなど) にキャッシュを作成して、コンテンツの独自のコピーを保持することができます。コンテンツが更新されると、フィンガープリントが変更されます。これにより、リモート クライアントはコンテンツの新しいコピーを要求します。これは、一般にキャッシュ無効化として知られています。

Rails がフィンガープリンティングに使用する手法は、コンテンツのハッシュを名前に (通常は最後に) 挿入することです。たとえば、CSS ファイル global.css は、その内容の MD5 ダイジェストで名前を変更できます。

global-908e25f4bf641868d8683022a5b62f54.css

そのため、マニフェストで参照しているファイルを削除してから、同じ名前の新しいファイルをコピーしても、キャッシュ無効化は発生しません。ファイルを編集すると、フィンガープリントが開始され、ファイル名の新しいハッシュが生成されます。これにより、そのファイルのキャッシュが破棄されます。

詳細については、フィンガープリントとは何ですか? なぜ気にする必要があるのですか? を参照してください。.

于 2012-04-04T04:23:28.267 に答える
19

rake tmp:clear私はless-railsを使用しています。

于 2016-08-10T17:21:09.960 に答える