JavaScriptでキャッシュをクリアする


179

JavaScriptでブラウザのキャッシュをクリアするにはどうすればよいですか?

最新のJavaScriptコードをデプロイしましたが、最新のJavaScriptコードを取得できません。

編集者注記:この質問は次の場所で半重複しています。次の質問の最初の回答がおそらく最良です。この受け入れられた答えは、もはや理想的なソリューションではありません。

ブラウザにキャッシュされたCSS / JSファイルを強制的に再読み込みさせる方法は?

クライアントにJavaScriptファイルの更新を強制するにはどうすればよいですか?

ローカルJavascriptソース/ jsonデータを動的に再読み込み


5
これは私を混乱させます:「最新のjavascriptコードをデプロイしましたが、最新のjavascriptコードを取得できませんでした」
instanceof me

14
クライアントブラウザーに、キャッシュされたバージョンではなく、最新バージョンのJavaScriptを強制的に使用させる方法-その場合は、Gregの回答が必要です。自分のブラウザでそれを行う方法を知りたい場合は、David Johnstoneの答えです。
Benjol 2009年


4
一般的なアプローチは?version=xxx、ビルドステップを介してJSリンクファイルにを添付することです。すべての新しいビルドは、JSファイルの新しいバージョンを要求します。
ファンメンデス

1
@JuanMendesこれは常に機能するとは限りません。最新のファビコンを見ようとする人々に問題があるとき、これと同じステップが提案されます。動作が保証されていないだけです。
uSeRnAmEhAhAhAhAhA 2014年

回答:


202

window.location.reload(true)を呼び出して、現在のページを再ロードできます。キャッシュされたアイテムをすべて無視し、ページ、CSS、画像、JavaScriptなどの新しいコピーをサーバーから取得します。これはキャッシュ全体をクリアするわけではありませんが、現在のページのキャッシュをクリアする効果があります。

ただし、最善の戦略は、他のさまざまな回答で述べられているように、パスまたはファイル名をバージョン管理することです。さらに、「ファイル名の改訂:?v=nバージョンスキーマとして使用しない理由のためにクエリ文字列使用しない」を参照してください。


6
わあ、ありがとう!これは、cache.manifestファイルからロードされたHTML5アプリケーションキャッシュでも同様に機能します。私はメモリから削除されていない古いマニフェストを持っていたので、それをキャッシュしていた1つのブラウザは新しいファイルを表示しませんでした。私はこれをJavaScriptコンソールに入力して、うまくいきました。ありがとう!
JayCrossler、2010年

2
しかし、ファイル名を変更して回転させると、以前のバージョンをすべてそのままにしておけませんか?そうしないと、検索エンジンから多くの失敗した試みが返され、古いバージョン(またはブックマーク/リンクされた画像)を読むべきではありません
Rodolfo

1
どう思いますか、
それで

1
これは、ユーザーが更新ボタンをクリックしたのと同じですか?
GMsoF 2014年

2
@Manuelこれは、location.reload(true)を呼び出した正確なURLのキャッシュからのページへのアクセスのみを無効にします。元のページは、新しいリクエストにタイムスタンプを追加するだけなので、キャッシュからクリアされることはありません。また、このページによって非同期で行われる他の呼び出しがある場合、それらのリクエストのキャッシュ動作は無効になりません。例えば。一部のhtmlをロードするreload(true)でページを更新し、そのページに同じページに表示する追加のhtmlの2番目のajax呼び出しを行うスクリプトがある場合、2番目のリクエストではキャッシュが無効になりません。
J.シェイ2017年

114

JavaScriptでキャッシュをクリアすることはできません。一般的な方法は、次のように、リビジョン番号または最終更新タイムスタンプをファイルに追加することです。

myscript.123.js

または

myscript.js?updated=1234567890


9
ただし、クエリ文字列がある場合、多くのプロキシはファイルをキャッシュしません。Kevin Hakansonの回答を参照してください。
チボー

4
HTML全体がキャッシュされたときにキャッシュをクリアするにはどうすればよいですか?HTMLがキャッシュされているため、バージョン番号が追加されても影響を受けません。助けてください
Nandakumar

キャッシュアイテムをクリアできない場合、MDNはなぜクリアできると言うのですか?何が欠けていますか?MDNの発言を試したが運が悪かった。
Sнаđошƒаӽ

41

JavaScriptファイルのsrcを変更してみますか?これから:

<script language="JavaScript" src="js/myscript.js"></script>

これに:

<script language="JavaScript" src="js/myscript.js?n=1"></script>

このメソッドは、ブラウザにJSファイルの新しいコピーを強制的にロードする必要があります。


n = 1は何をしますか?
KyelJmD 2017

何か違うこと以外は何もしません。?12345または?Kyle
Oneezy '25

ファイル名も変更する必要がありますか?または、変更が必要なsrcパスだけですか?
Fred A

20

1時間ごとまたは1週間ごとにキャッシュする以外に、ファイルデータに応じてキャッシュすることもできます。

例(PHPの場合):

<script src="js/my_script.js?v=<?=md5_file('js/my_script.js')?>"></script>

またはファイル変更時間を使用する:

<script src="js/my_script.js?v=<?=filemtime('js/my_script.js')?>"></script>

3
これを正しく理解していることを確認できますか?:オプション1を使用すると、ファイルが変更されると、md5チェックサムハッシュが変更され、URLが変更されます。ブラウザは新しいURLを確認し、ファイルの新しいロードを開始します。URLに追加された取得データはサーバーによって無視されます。それが事実であるならば、かなり気の利いたスリック。
コリン・ブローガン2013年

1
また、ファイルプロセッサ全体のMD5処理は集中的に行われますか?これまでのcssとjsファイルでこれを行うことを検討していますが、これが原因でサーバーの速度が低下するのを見たくありません。
コリン・ブローガン2013年

2
チェックサムを使用することをお勧めしますが、正しく実行する必要があります。すべてのファイルに対するすべてのリクエストを計算すると、パフォーマンスが大幅に低下します。クエリ文字列はキャッシュにも適していません。他の回答を参照してください。正しい使い方は、ファイル名にチェックサム(の一部)またはバージョン番号を追加し、代わりにこの新しい名前を使用することです(ビルドスクリプトを使用して、デプロイ時にこれを自動的に行うことができます)。gruntrevuseminを参照してください 。
Frizi 2013

10

PHPでは、次のように、コードを1時間ごとに強制的にリロードすることもできます。

<?php
echo '<script language="JavaScript" src="js/myscript.js?token='.date('YmdH').'">';
?>

または

<script type="text/javascript" src="js/myscript.js?v=<?php echo date('YmdHis'); ?>"></script>

1
こんにちは、「v」と「トークン」の意味は何ですか?
GMsoF 2013

4
@GMsoFは、追加のgetパラメータであり(この場合)、ブラウザに「異なる」ファイルであることを通知するために使用されます。これにより、ブラウザはキャッシュされたバージョンを破棄し、代わりにこのバージョンをロードします。これは多くの場合、ファイルの「最終更新日」とともに使用されます。これが理にかなっているといいのですが;-)
Jelmer、2014年

6

これをテンプレートの最後に置きます:

var scripts =  document.getElementsByTagName('script');
var torefreshs = ['myscript.js', 'myscript2.js'] ; // list of js to be refresh
var key = 1; // change this key every time you want force a refresh
for(var i=0;i<scripts.length;i++){ 
   for(var j=0;j<torefreshs;j++){ 
      if(scripts[i].src && (scripts[i].src.indexOf(torefreshs[j]) > -1)){
        new_src = scripts[i].src.replace(torefreshs[j],torefreshs[j] + 'k=' + key );
        scripts[i].src = new_src; // change src in order to refresh js
      } 
   }
}

1
ソリューションについて説明してください
ガブリエル

@GabrielEspinoza彼はjavascriptを使用してファイルをリロードし、キャッシュを更新します。
Neo Morina 2017

6

これを使ってみてください

 <script language="JavaScript" src="js/myscript.js"></script>

これに:

 <script language="JavaScript" src="js/myscript.js?n=1"></script>

5

これが、最新のプロジェクトで使用しているスニペットです。

コントローラから:

if ( IS_DEV ) {
    $this->view->cacheBust = microtime(true);
} else {
    $this->view->cacheBust = file_exists($versionFile) 
        // The version file exists, encode it
        ? urlencode( file_get_contents($versionFile) )
        // Use today's year and week number to still have caching and busting 
        : date("YW");
}

ビューから:

<script type="text/javascript" src="/javascript/somefile.js?v=<?= $this->cacheBust; ?>"></script>
<link rel="stylesheet" type="text/css" href="/css/layout.css?v=<?= $this->cacheBust; ?>">

公開プロセスでは、現在のビルドのリビジョン番号が記載されたファイルが生成されます。これは、そのファイルをURLエンコードし、それをキャッシュ無効化として使用することで機能します。フェイルオーバーとして、そのファイルが存在しない場合、キャッシュが引き続き機能するように年と週の番号が使用され、少なくとも週に1回は更新されます。

また、これにより、開発環境でのすべてのページの読み込みに対してキャッシュの無効化が提供されるため、開発者はリソース(javascript、css、ajax呼び出しなど)のキャッシュをクリアすることを心配する必要がありません。


5

または、file_get_contetsを使用してサーバーでjsファイルを読み取り、jsの内容をヘッダーにエコーすることができます


4

たぶん、「キャッシュをクリアする」ことはそれがそうであるほど簡単ではありません。ブラウザのキャッシュをクリアする代わりに、ファイルに「触れる」と、サーバーにキャッシュされたソースファイルの日付が実際に変更され(Edge、Chrome、Firefoxでテスト済み)、ほとんどのブラウザは最新の最新のコピーを自動的にダウンロードしますあなたのサーバーにあるもの(コード、グラフィック、マルチメディアも)。プログラムを実行する前に、最新のスクリプトをサーバーにコピーして「タッチタッチ」ソリューションを実行することをお勧めします。これにより、問題のあるすべてのファイルの日付が最新の日時に変更され、新しいコピーがダウンロードされます。ブラウザに:

<?php
    touch('/www/control/file1.js');
    touch('/www/control/file2.js');
    touch('/www/control/file2.js');
?>

...残りのプログラム...

この問題を解決するのに少し時間がかかりました(多くのブラウザーはコマンドによって動作が異なりますが、ファイルの時間をすべてチェックし、ブラウザーでダウンロードしたコピーと比較します(日付と時刻が異なる場合は、更新が行われます)。想定された正しい方法を実行することはできません。それには、別の使いやすく、より良い解決策が常にあります。よろしくと幸せなキャンプ。


1
私はこのアプローチが好きですが、おそらくこれを間違った領域に実装していますか?これをWordPressの設定のどこに追加するか知っていますか?私はそれをfunctions.phpファイルに追加し、JavaScriptファイルとCSSファイルへの直接リンクを追加しましたが、変更を通知するためにハードリロードを実行する必要がありました。
flipflopmedia 2017年

1
あなたがする必要があるのは、メインのhtml wordpressディレクトリで、index.phpを編集して、更新してダウンロードする必要があるファイルに対してTouch()コマンドを呼び出すか実行することです。小さな写真とjsファイルがキャッシュに詰まるという問題がありました。私はメモリから解放するために説明されているほとんどの方法を試しましたが、最善の方法は、現在の新しい正しいものをロードすることです。ファイルに何も変更せず、現在の時刻と日付を更新するだけで「タッチシング」を実行するだけで、ブラウザをだましてファイルの別のバージョンを認識させ、問題が修正されたことを確認できます。ほとんどのブラウザーで動作します
Luis H Cabrejo 2017年

3

yboussardによって提案されたコードに問題がありました。内側のjループが機能しませんでした。以下は、私が成功裏に使用した変更後の​​コードです。

function reloadScripts(toRefreshList/* list of js to be refresh */, key /* change this key every time you want force a refresh */) {
    var scripts = document.getElementsByTagName('script');
    for(var i = 0; i < scripts.length; i++) {
        var aScript = scripts[i];
        for(var j = 0; j < toRefreshList.length; j++) {
            var toRefresh = toRefreshList[j];
            if(aScript.src && (aScript.src.indexOf(toRefresh) > -1)) {
                new_src = aScript.src.replace(toRefresh, toRefresh + '?k=' + key);
                // console.log('Force refresh on cached script files. From: ' + aScript.src + ' to ' + new_src)
                aScript.src = new_src;
            }
        }
    }
}

3

PHPを使用している場合は、次のことができます。

 <script src="js/myscript.js?rev=<?php echo time();?>"
    type="text/javascript"></script>

5
この質問は4年前に尋ねられただけでなく、受け入れられなかったとしても、より良い答えが得られました。

3
また、この方法では、実際のリビジョン番号やファイルに加えられた変更に関係なく、毎回ファイルが再ダウンロードされるため、キャッシュが完全に無効になります。
Antti29、2014


2

間違った情報を入力しないでください。 キャッシュAPIは、HTTPキャッシュとは異なるタイプのキャッシュです

サーバーが正しいヘッダーを送信すると、HTTPキャッシュが起動します。javasviptを使用してアクセスすることはできません。

キャッシュAPIしたいとき、一方では発射されるで作業する場合、それは便利ですサービスワーカーあなたが要求を交差し、このタイプのキャッシュ見るからそれに答えることができるように:Ilustrationによって1 Ilustrationによって2 コース

これらのテクニックを使用して、常にユーザーに新鮮なコンテンツを提供できます。

  1. location.reload(true)を使用してください。これは私には機能しないので、お勧めしません。
  2. キャッシュAPIを使用してキャッシュに保存し、リクエストをService Workerと交差させます。サーバーが更新するファイルのキャッシュヘッダーを送信した場合、ブラウザーは最初にHTTPキャッシュから応答するため、このAPIには注意してください。それが見つからない場合は、ネットワークに移動するので、古いファイルになってしまう可能性があります
  3. 戦術ファイルからURLを変更します。私の推奨は、ファイルのコンテンツの変更に応じて名前を付ける必要があります。私はmd5を使用し、それを文字列およびURLフレンドリーに変換します。md5はファイルのコンテンツに応じて変更されます。 HTTPキャッシュヘッダーを十分な長さで自由に送信できる

私は3番目のものを見ることをお勧めします


2

メタHTMLタグを使用してブラウザのキャッシュを無効にすることもできます。コーディング/テスト中にWebページがキャッシュされないように、HTMLタグをヘッドセクションに配置するだけです。完了したら、メタタグを削除できます。

(ヘッドセクション内)

<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate" />
<meta http-equiv="Pragma" content="no-cache" />
<meta http-equiv="Expires" content="0"/>

これをヘッドに貼り付けた後にページを更新すると、新しいJavaScriptコードも更新されます。

このリンクは、必要に応じて他のオプションを提供します http://cristian.sulea.net/blog/disable-browser-caching-with-meta-html-tags/

または、このようにボタンを作成することもできます

<button type="button" onclick="location.reload(true)">Refresh</button>

更新されてキャッシュが回避されますが、テストが完了するまでページに表示された後、それを削除できます。拳オプションは一番いいものです。


1

私はフレームワークをバージョン管理する傾向があり、スクリプトとスタイルのパスにバージョン番号を適用します

<cfset fw.version = '001' />
<script src="/scripts/#fw.version#/foo.js"/>

3
OPはColdfusionについて言及していません。
marctrem、2014年

@VijayDev 404(リンク用)
2017年

1
window.parent.caches.delete("call")

コンソールでコードを実行した後、ブラウザを閉じて開きます。


1
いくつかの説明をお願いします、上のコードの「呼び出し」は何ですか?
Anand Rockzz 2017

@AnandRockzz不可能です。キャッシュAPIは、javasciptで管理できる新しいタイプのキャッシュであるため、そこから何かを削除するために、developer.mozilla.org / en-US / docs /を参照する前に保存していました。 Web / API /キャッシュ
John Balvin Arias


0

ブラウザーに同じリンクをキャッシュさせるには、URLの最後に乱数を追加する必要があります。 new Date().getTime()別の番号を生成します。

new Date().getTime()呼び出しのようにリンクの終わりを追加するだけです

'https://stackoverflow.com/questions.php?' + new Date().getTime()

出力: https://stackoverflow.com/questions.php?1571737901173


SOへようこそ!あなたの答えは不明です。編集してください。リンクに基づくこの種の返信は、リンクが消えた場合に備えてコメントする必要があります。
DavidGarcíaBodego
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.