Bersihkan cache dalam JavaScript

179

Bagaimana cara menghapus cache browser dengan JavaScript?

Kami menyebarkan kode JavaScript terbaru tetapi kami tidak dapat memperoleh kode JavaScript terbaru.

Catatan Editorial: Pertanyaan ini semi-duplikat di tempat-tempat berikut, dan jawaban di pertanyaan pertama dari berikut mungkin adalah yang terbaik. Jawaban yang diterima ini bukan lagi solusi ideal.

Bagaimana cara memaksa browser untuk memuat ulang file CSS / JS yang di-cache?

Bagaimana saya bisa memaksa klien untuk me-refresh file JavaScript?

Reload secara dinamis data Javascript sumber / json lokal

Dylan Brams
sumber
5
Ini membingungkan saya: "Kami menggunakan kode javascript terbaru tapi kami tidak bisa mendapatkan kode javascript terbaru"
instanceof me
14
Saya kira maksud Anda, bagaimana cara memaksa browser klien untuk menggunakan versi javascript terbaru Anda dan bukan versi cache mereka - dalam hal ini Anda memerlukan jawaban Greg. Jika Anda ingin tahu cara melakukannya di peramban Anda sendiri, itu jawaban David Johnstone.
Benjol
4
Pendekatan umum adalah melampirkan ?version=xxxfile JS terkait Anda melalui langkah membangun. Setiap build baru akan meminta versi baru dari file JS.
Juan Mendes
1
@JuanMendes Ini tidak selalu berhasil. Langkah yang sama ini disarankan ketika orang memiliki masalah mencoba melihat favicon terbaru. Hanya saja tidak dijamin bekerja.
uSeRnAmEhAhAhAhAhA

Jawaban:

202

Anda dapat memanggil window.location.reload (true) untuk memuat ulang halaman saat ini. Ini akan mengabaikan item yang di-cache dan mengambil salinan baru halaman, css, gambar, JavaScript, dll dari server. Ini tidak menghapus seluruh cache, tetapi memiliki efek membersihkan cache untuk halaman yang Anda buka.

Namun, strategi terbaik Anda adalah versi jalan atau nama file seperti yang disebutkan dalam berbagai jawaban lainnya. Selain itu, lihat Revving Filenames: jangan gunakan querystring karena alasan tidak digunakan ?v=nsebagai skema versi Anda.

Kevin Hakanson
sumber
6
Wow terima kasih! Ini berfungsi baik untuk Cache Aplikasi HTML5 yang dimuat dari file cache.manifest juga. Saya memiliki manifes lama yang tidak dihapus dari memori, jadi satu browser yang di-cache tidak akan menampilkan file yang lebih baru. Saya mengetik ini di konsol javascript, dan bekerja dengan baik. Terima kasih!
JayCrossler
2
tetapi revving dengan mengubah nama file ... bukankah itu membuat Anda menyimpan semua versi sebelumnya? jika tidak, Anda akan mendapatkan banyak upaya gagal dari mesin pencari dan apa yang tidak untuk membaca versi yang lebih lama (atau gambar yang di-bookmark / ditautkan)
Rodolfo
1
bagaimana saya tidak berpikir dalam hal itu,
tangkap
1
Apakah ini sama dengan klik pengguna pada tombol segarkan?
GMsoF
2
@Manuel Ini hanya akan menonaktifkan mengakses halaman dari cache dari url yang Anda panggil location.reload (true) on. Itu tidak pernah membersihkan halaman asli dari cache karena itu hanya menambahkan cap waktu untuk permintaan baru, dan jika ada panggilan lain yang dibuat secara tidak sinkron oleh halaman ini, permintaan tersebut TIDAK akan menonaktifkan perilaku caching mereka. Misalnya. Jika Anda me-refresh halaman dengan reload (true) yang memuat beberapa html, dan halaman itu memiliki skrip yang membuat panggilan ajax kedua agar lebih banyak html untuk ditampilkan pada halaman yang sama, permintaan kedua tidak akan menonaktifkan cachingnya.
J. Schei
114

Anda tidak dapat menghapus cache dengan javascript. Cara yang umum adalah menambahkan nomor revisi atau cap waktu terakhir ke file, seperti ini:

myscript.123.js

atau

myscript.js?updated=1234567890

Greg
sumber
9
Perhatikan bahwa banyak proksi tidak akan men-cache file ketika memiliki string kueri. Lihat jawaban Kevin Hakanson .
chiborg
4
Bagaimana saya bisa menghapus cache ketika seluruh HTML telah di-cache? Itu tidak akan mempengaruhi bahkan ketika nomor versi ditambahkan karena HTML yang di-cache. Tolong bantu
Nandakumar
Jika saya tidak dapat menghapus item cache, lalu mengapa MDN mengatakan bahwa saya bisa? Apa yang saya lewatkan? Saya mencoba apa yang dikatakan MDN tetapi tidak berhasil.
Sнаđошƒаӽ
41

Coba ubah src file JavaScript? Dari ini:

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

Untuk ini:

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

Metode ini harus memaksa browser Anda untuk memuat salinan baru file JS.

Barry Gallagher
sumber
Apa yang dilakukan n = 1?
KyelJmD
itu tidak melakukan apa pun kecuali menjadi sesuatu yang berbeda. mungkin? 12345 atau? Kyle
Oneezy
Jadi nama file perlu diubah juga? Atau hanya jalur src yang perlu diubah?
Fred A
20

Selain caching setiap jam, atau setiap minggu, Anda dapat melakukan cache sesuai dengan data file.

Contoh (dalam PHP):

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

atau bahkan menggunakan waktu modifikasi file:

<script src="js/my_script.js?v=<?=filemtime('js/my_script.js')?>"></script>
Alexandre T.
sumber
3
Bisakah saya memverifikasi saya memahami ini dengan benar ?: Dengan opsi 1, ketika file berubah, hash checksum md5 berubah, yang kemudian mengubah url. Browser melihat url baru dan memulai memuat file baru. Data get yang ditambahkan ke url diabaikan oleh server. Kalau begitu, cukup apik.
Colin Brogan
1
Juga, apakah MD5-ing adalah seluruh prosesor file intensif? Saya sedang mempertimbangkan untuk melakukan hal ini untuk file css dan js yang pernah ada, tapi saya benci melihat hit ke server speed karena ini.
Colin Brogan
2
Menggunakan checksum adalah ide yang bagus, tetapi harus dilakukan dengan benar. Menghitungnya setiap permintaan untuk setiap file akan memukul kinerja Anda secara signifikan. Pertanyaan juga tidak baik untuk caching, lihat jawaban lain. Penggunaan yang tepat adalah menambahkan checksum (bagian dari?) Atau nomor versi ke nama file dan menggunakan nama baru ini sebagai gantinya (Anda dapat menggunakan skrip build untuk melakukan ini secara otomatis saat digunakan). Lihat mendengus , rev dan usemin .
Frizi
10

Anda juga dapat memaksa kode untuk dimuat ulang setiap jam, seperti ini, di PHP:

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

atau

<script type="text/javascript" src="js/myscript.js?v=<?php echo date('YmdHis'); ?>"></script>
Fabien Ménager
sumber
1
hai, apa yang dimaksud dengan "v" dan "token"?
GMsoF
4
@ GMsoF yang hanya parameter get tambahan yang digunakan (dalam hal ini) untuk memberitahu browser itu adalah file "berbeda". Sehingga browser akan membuang versi yang di-cache dan memuat yang ini. Ini sering digunakan dengan "tanggal modifikasi terakhir" dari suatu file. Saya harap ini masuk akal ;-)
Jelmer
6

letakkan ini di akhir templat Anda:

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
      } 
   }
}
yboussard
sumber
1
tolong berikan beberapa penjelasan tentang solusi Anda
Gabriel Espinoza
@GabrielEspinoza ia memuat ulang file dengan menggunakan javascript, yang membuat cache diperbarui.
Neo Morina
6

coba gunakan ini

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

Untuk ini:

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

Berikut cuplikan dari apa yang saya gunakan untuk proyek terbaru saya.

Dari pengontrol:

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");
}

Dari tampilan:

<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; ?>">

Proses penerbitan kami menghasilkan file dengan nomor revisi dari bangunan saat ini. Ini berfungsi dengan URL yang menyandikan file itu dan menggunakannya sebagai cache buster. Sebagai kegagalan, jika file itu tidak ada, nomor tahun dan minggu digunakan agar cache masih berfungsi, dan itu akan di-refresh setidaknya seminggu sekali.

Juga, ini menyediakan penghilang cache untuk setiap pemuatan halaman saat berada dalam lingkungan pengembangan sehingga pengembang tidak perlu khawatir dengan membersihkan cache untuk sumber daya apa pun (javascript, css, panggilan ajax, dll).

Justin Johnson
sumber
5

atau Anda bisa membaca file js oleh server dengan file_get_contets dan kemudian memasukkan gema di header isi js

albanx
sumber
4

Mungkin "membersihkan cache" tidak semudah yang seharusnya. Alih-alih membersihkan cache pada browser saya, saya menyadari bahwa "menyentuh" file tersebut sebenarnya akan mengubah tanggal file sumber di-cache di server (Diuji pada Edge, Chrome dan Firefox) dan sebagian besar browser secara otomatis akan mengunduh salinan terbaru dari apa yang ada di server Anda (kode, grafik juga multimedia apa pun). Saya sarankan Anda hanya menyalin skrip terkini di server dan solusi "melakukan hal sentuh" sebelum program Anda berjalan, sehingga itu akan mengubah tanggal semua file masalah Anda ke tanggal dan waktu terbaru, kemudian mengunduh salinan baru ke browser Anda:

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

... sisa program Anda ...

Butuh beberapa waktu untuk menyelesaikan masalah ini (karena banyak browser bertindak berbeda untuk perintah yang berbeda, tetapi mereka semua memeriksa waktu file dan membandingkannya dengan salinan yang Anda unduh di browser Anda, jika tanggal dan waktu yang berbeda, akan melakukan penyegaran), Jika Anda tidak bisa berjalan dengan cara yang benar, selalu ada solusi lain yang dapat digunakan dan lebih baik untuk itu. Salam hangat dan selamat berkemah.

Luis H Cabrejo
sumber
1
Saya suka pendekatan ini, tetapi mungkin saya menerapkan ini di area yang salah? Adakah yang tahu di mana menambahkan ini di pengaturan WordPress? Saya menambahkannya ke file functions.php, dengan tautan langsung ke file JavaScript dan CSS, tetapi saya masih harus melakukan reload keras agar perubahannya diperhatikan.
flipflopmedia
1
Apa yang perlu Anda lakukan, adalah di direktori wordpress html utama Anda, edit index.php Anda untuk memanggil atau menjalankan perintah Touch () ke file yang Anda perlu menyegarkan dan diunduh. Saya punya masalah dengan file foto dan js kecil yang terjebak dalam cache. Saya mencoba sebagian besar metode yang dijelaskan untuk melepaskan dari memori, tetapi cara terbaik adalah memuat yang benar baru saat ini. Anda dapat menyelesaikannya dengan hanya melakukan "Sentuh Hal" karena tidak mengubah apa pun pada file, cukup perbarui waktu dan tanggal saat ini sehingga membodohi peramban Anda untuk memikirkan versi lain dari file dan masalah diperbaiki. Berfungsi pada sebagian besar browser
Luis H Cabrejo
3

Saya punya beberapa masalah dengan kode yang disarankan oleh yboussard. Loop dalam tidak bekerja. Berikut adalah kode yang dimodifikasi yang saya gunakan dengan sukses.

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;
            }
        }
    }
}
Bryan
sumber
3

Jika Anda menggunakan php dapat melakukan:

 <script src="js/myscript.js?rev=<?php echo time();?>"
    type="text/javascript"></script>
pengguna3573488
sumber
6
Bukan hanya pertanyaan ini diajukan empat tahun lalu, pertanyaan itu juga memiliki jawaban yang lebih baik, bahkan jika itu tidak diterima.
4
Selain itu, metode ini akan mengunduh ulang file setiap kali terlepas dari jumlah revisi aktual atau perubahan yang dilakukan pada file tersebut, yang secara efektif akan menonaktifkan caching sama sekali.
Antti29
2

Cache.delete () dapat digunakan untuk chrome, firefox dan opera baru.

Jay Shah
sumber
Bukankah ini hanya bagian dari API Pekerja Layanan?
BanksySan
@BanksySan dari dokumen MDN:You don't have to use it in conjunction with service workers, even though it is defined in the service worker spec.
Madbreaks
2

Tolong jangan memberikan informasi yang salah. Cache api adalah jenis cache yang berbeda dari cache http

Tembolok HTTP dipecat ketika server mengirim tajuk yang benar , Anda tidak dapat mengakses dengan javasvipt.

Cache api di sisi lain ditembakkan saat Anda inginkan, ini berguna saat bekerja dengan pekerja layanan sehingga Anda dapat memotong permintaan dan menjawabnya dari jenis cache ini, lihat: ilustrasi 1 ilustrasi 2 saja

Anda bisa menggunakan teknik ini untuk selalu memiliki konten baru pada pengguna Anda:

  1. Gunakan location.reload (true) ini tidak berfungsi untuk saya, jadi saya tidak akan merekomendasikannya.
  2. Gunakan Cache api untuk menyimpan ke dalam cache dan memotong permintaan dengan pekerja layanan , berhati-hatilah dengan ini karena jika server telah mengirim header cache untuk file yang ingin Anda refresh, browser akan menjawab dari cache HTTP terlebih dahulu, dan jika tidak menemukannya, maka itu akan pergi ke jaringan, sehingga Anda bisa berakhir dengan file yang lama
  3. Ubah url dari Anda file stactics, rekomendasi saya adalah Anda harus memberi nama dengan perubahan konten file Anda, saya menggunakan md5 dan kemudian mengubahnya menjadi string dan url friendly, dan md5 akan berubah dengan isi file, di sana Anda dapat dengan bebas mengirim header cache HTTP cukup lama

Saya akan merekomendasikan yang ketiga lihat

John Balvin Arias
sumber
2

Anda juga dapat menonaktifkan caching peramban dengan tag meta HTML, cukup taruh tag html di bagian kepala untuk menghindari halaman web di-cache saat Anda melakukan pengkodean / pengujian dan ketika Anda selesai, Anda dapat menghapus meta tag.

(di bagian kepala)

<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"/>

Refresh halaman Anda setelah menempelkan ini di kepala dan harus menyegarkan kode javascript baru juga.

Tautan ini akan memberi Anda opsi lain jika Anda memerlukannya http://cristian.sulea.net/blog/disable-browser-caching-with-meta-html-tags/

atau Anda bisa membuat tombol seperti itu

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

itu menyegarkan dan menghindari caching tetapi itu akan ada di halaman Anda sampai Anda menyelesaikan pengujian, maka Anda bisa melepasnya. Opsi kepalan adalah yang terbaik.

alfmonc
sumber
1

Saya cenderung untuk versi kerangka kerja saya kemudian menerapkan nomor versi ke jalur skrip dan gaya

<cfset fw.version = '001' />
<script src="/scripts/#fw.version#/foo.js"/>
SPIFF
sumber
3
OP tidak menyebut Coldfusion.
marctrem
@VijayDev 404 untuk tautan Anda
smarber
1
window.parent.caches.delete("call")

tutup dan buka browser setelah menjalankan kode di konsol.

Apoorv
sumber
1
Tolong, beberapa penjelasan, apa "panggilan" dalam kode di atas?
Anand Rockzz
@AnandRockzz itu tidak mungkin, cache api hanya merupakan jenis cache baru yang dapat dikelola dengan javascipt, jadi untuk menghapus sesuatu dari sana, Anda telah menyimpannya sebelum melihat developer.mozilla.org/en-US/docs/ Web / API / Cache
John Balvin Arias
1

window.location.reload(true)tampaknya telah ditinggalkan oleh standar HTML5. Salah satu cara untuk melakukan ini tanpa menggunakan string kueri adalah dengan menggunakan Clear-Site-Dataheader , yang tampaknya menjadi standar .

Tuhanku
sumber
0

Karena cache browser tautan yang sama, Anda harus menambahkan nomor acak ujung url. new Date().getTime()menghasilkan angka yang berbeda.

Cukup tambahkan new Date().getTime()ujung tautan seperti panggilan

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

Keluaran: https://stackoverflow.com/questions.php?1571737901173

EMAM HASAN
sumber
Selamat datang di SO! Jawaban Anda tidak jelas. Harap edit. Balasan semacam ini, berdasarkan tautan, harus dikomentari kalau-kalau tautan itu hilang.
David García Bodego