web-dev-qa-db-ja.com

Railsアセットパイプラインからキャッシュをクリアします

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ファイルの名前を変更し、新しい名前を参照するだけで解決できました。しかし、これに対するより良い解決策がなければなりません。

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

43
Aaron Gray

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

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

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

54
benzado

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

38
Dex

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

Jquery.autoresize.jsが古いキャッシュバージョンのファイルを使用していた理由は、古いバージョンが削除され、新しいバージョンが同じ名前で同じフォルダーにコピーアンドペーストされたためです。ファイル自体は編集されなかったため、Rails=はキャッシュされた古いファイルを使用し続けました。

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

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

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

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

global-908e25f4bf641868d8683022a5b62f54.css

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

詳細については、「 指紋認証とは何ですか? 」を参照してください。

25
Aaron Gray

rake tmp:clearは私のためにトリックをしました、私は少ないレールを使用しています。

12
akz92

私が使う config.assets.version = '1.01019'私のapplication.rbキャッシュ全体を無効にします。完全に新しいバージョンをプッシュしたい場合は、バージョンを増やしてください。これは、Railsが何らかの理由で資産として再コンパイルされないEdgeケースを処理します。

6
user3670743