web-dev-qa-db-ja.com

キャッシュを回避するためのJavascriptのバージョン管理、これらのプラクティスの違いは?

Javascriptまたはcssファイルのlast_modified_timeを使用し、そのunixタイムスタンプを名前のキーとして使用して、ファイルが変更されたときにキャッシュを無効にすることにした場合。次の2つの方法の違いは何ですか?ファイル名は:my_script.js、タイムスタンプは:1321951817

1 /ファイルは次のように含まれます:<script type="text/javascript" src="http://example.com/js/my_script.js?v=1321951817"></script>したがって、クエリ文字列パラメータは、vが変更されるたびに新しいキャッシュを作成します。

2 /ファイルは次のように含まれます:<script type="text/javascript" src="http://example.com/js/my_script.1321951817.js"></script>ファイル名は変更のたびに変更され、書き換えルールはタイムスタンプを削除し、要求されたURLをmy_script.jsにポイントします。

3/更新:以下の回答に基づくもう1つの方法:ファイルの名前が変更され、次のように含まれます:<script type="text/javascript" src="http://example.com/js/my_script.1321951817.js"></script>ファイル名が変更され、書き換えルールは使用されません。

質問:これら2つの手法は本質的に同じですか、それとも直接ファイル名の代わりにクエリ文字列パラメーターを使用することの長所/短所はありますか。

15
DhruvPathak

更新されたクエリ文字列を使用することは悪い解決策です。スティーブ・スーダーズがそれについてそう言っていることを見てください: http://www.stevesouders.com/blog/2008/08/23/revving-filenames-dont-use-querystring/

理想的な方法は、ファイル自体の名前を変更することです。最終変更日のタイムスタンプを好む人もいますが、これは問題だと思います。

最新のWeb開発では、ページを可能な限り最適化する必要があります。つまり、cssとjavascriptを組み合わせて、最小化された単一のファイルにします。つまり、プロセスにビルドステップを導入し、ファイルの最終変更時刻は常に最後のビルドになります。これをファイル名として設定すると、基本的にユーザーのキャッシュが常に無効になり、必要がない場合もあります。

ファイルの名前を、コンテンツのmd5合計に変更することをお勧めします。そうすれば、常に新しいビルドを実行できますが、ファイル名はコンテンツが変更された場合にのみ変更されます。これにより、ファイル名がコンテンツの識別子になります。これを使用すると、すべての静的コンテンツに遠い将来の期限切れヘッダーを設定して、心配する必要がなくなります。

このワークフローはすぐに退屈になるので、これにはビルドシステムの使用をお勧めします。私の会社は少し前にオープンソース化しており、Webページを最適化する他の多くのことの中でこれを行っています: https://github.com/One-com/assetgraph-builder 他にも多くのビルドがあります同じことをするツール。周りを見て、開発セットアップに最適なものを見つけてください。

22
Munter

あなたはそれを自分で言っています:2番目の例では、ロードしているすべてのページを正規表現でチェックする書き換えルールを使用しています。

最初のものは、ブラウザをだまして別のファイルだと思っただけです。だから最初のものは行く方法です。

6
baklap