JavaScriptでブラウザのキャッシュをクリアするにはどうすればいいですか?
最新のJavaScriptコードをデプロイしましたが、最新のJavaScriptコードを入手できません。
編集者注記:この質問は次の場所に半重複しています。次の質問のうち最初の質問の答えがおそらく最善です。この受け入れられた答えはもはや理想的な解決策ではありません。
ブラウザにキャッシュされたCSS/JSファイルを強制的にリロードさせるにはどうすればいいですか?
現在のページをリロードするには、 window.location.reload(true) を呼び出します。キャッシュされたアイテムは無視され、サーバーからページ、CSS、画像、JavaScriptなどの新しいコピーが取得されます。これはキャッシュ全体をクリアするわけではありませんが、自分がいるページのキャッシュをクリアする効果があります。
ただし、他のさまざまな回答で説明されているように、パスまたはファイル名をバージョン管理することが最善の策です。さらに、バージョン管理スキームとして?v=n
を使用しない理由については、 ファイル名の回転:クエリ文字列を使用しないでください を参照してください。
あなたはjavascriptでキャッシュをクリアすることはできません。一般的な方法は、次のようにリビジョン番号または最後に更新されたタイムスタンプをファイルに追加することです。
myscript.123.js
または
myscript.js?updated=1234567890
JavaScriptファイルのsrcを変更してみてください。これから:
<script language="JavaScript" src="js/myscript.js"></script>
これに:
<script language="JavaScript" src="js/myscript.js?n=1"></script>
このメソッドはブラウザにJSファイルの新しいコピーをロードさせるはずです。
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>
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>
これを使ってみてください
<script language="JavaScript" src="js/myscript.js"></script>
これに:
<script language="JavaScript" src="js/myscript.js?n=1"></script>
これをテンプレートの最後に置きます。
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
}
}
}
これが私が私の最新プロジェクトに使っているものの断片です。
コントローラから:
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呼び出しなど)のためにキャッシュをクリアすることを心配する必要はありません。
または、file_get_contetsを使用してサーバーごとにjsファイルを読み取り、そのヘッダーにjsの内容を反映させることもできます。
あなたがPHPを使用している場合は行うことができます:
<script src="js/myscript.js?rev=<?php echo time();?>"
type="text/javascript"></script>
私は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;
}
}
}
}
たぶん"キャッシュをクリアする"それほど簡単ではありません。ブラウザのキャッシュをクリアする代わりに、"touch"ファイルがサーバーにキャッシュされているソースファイルの日付を実際に変更し(Edge、Chrome、Firefoxでテスト済み)、ほとんどのブラウザは自動的に変更されます。あなたのサーバーに最新の最新コピーをダウンロードしてください(コード、グラフィック、マルチメディアも含む)。プログラムを実行する前に、最新のスクリプトをサーバーにコピーし、"タッチを行う"解決策をコピーするだけでよいのです。そうすれば、問題のあるファイルすべての日付が最新の日時に変更されます。その後、ブラウザに新しいコピーをダウンロードします。
<?php
touch('/www/control/file1.js');
touch('/www/control/file2.js');
touch('/www/control/file2.js');
?>
...あなたのプログラムの残りの部分...
この問題を解決するには少し時間がかかりました(多くのブラウザはコマンドごとに動作が異なりますが、ファイルの時間を確認し、ブラウザでダウンロードしたコピーと比較すると、日付と時刻が異なる場合は更新されます)。想定された正しい方向に進むことはできません、それに常に有用で優れた解決策があります。よろしくと幸せなキャンプ。
私は自分のフレームワークをバージョン管理してからスクリプトとスタイルパスにバージョン番号を適用する傾向があります。
<cfset fw.version = '001' />
<script src="/scripts/#fw.version#/foo.js"/>
誤った情報を入力しないでください。 Cache api とは異なる種類のキャッシュです http cache
HTTP cache はサーバが正しい headers を送信したときに発生します。javasviptでアクセスすることはできません。
Cache api あなたが望むときは解雇されます、 service worker で作業するときに便利です。リクエストを交差させてこのタイプのキャッシュから答えることができます: - 小話1小話2講座
ユーザーに常に新鮮なコンテンツを提供するために、これらのテクニックを使用することができます。
私は3番目のものをお勧めします 参照
window.parent.caches.delete("call")
コンソールでコードを実行したら、ブラウザを閉じて開きます。
Cache.delete() は、新しいクロム、Firefox、およびオペラに使用できます。
コーディング/テスト中に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>
それは更新されてキャッシュを回避しますが、テストが終了するまでページに表示されたままになります。その後、削除することができます。拳オプションが一番いいのです。