Saya mencoba mencari cara menangani cache browser web dengan benar untuk aplikasi satu halaman.
Saya memiliki desain yang cukup khas: beberapa file HTML, JS dan CSS mengimplementasikan SPA, dan banyak data JSON yang dikonsumsi oleh SPA. Masalah muncul ketika saya ingin mendorong pembaruan: Saya memperbarui bagian statis situs dan kode yang menghasilkan JSON pada saat yang sama, tetapi browser klien sering memiliki bagian statis di-cache, jadi kode lama mencoba memproses data baru dan mungkin (tergantung pada perubahan yang dibuat) mengalami masalah. (Secara khusus, IE tampaknya lebih agresif daripada Chrome atau Firefox tentang menggunakan JS yang di-cache tanpa memvalidasi ulang.)
Apa cara terbaik untuk menangani ini?
- Pastikan perubahan JSON saya kompatibel dengan mundur, dan menganggap cache browser akan kedaluwarsa dalam jangka waktu yang masuk akal.
- Sematkan nomor versi di JS statis dan JSON, kemudian jalankan
window.location.reload(true);
jika tidak cocok. - Cari tahu kombinasi header yang sesuai (
must-revalidate
atauno-cache
atau apa pun; sumber berbeda-beda tentang cara melakukan ini) untuk memastikan bahwa browser selalu memvalidasi ulang semua sumber daya pada setiap beban, bahkan jika itu berarti beberapa perjalanan bolak-balik tambahan untuk memuat situs. - Kelola kontrol-cache saya dan kedaluwarsa tajuk sehingga konten statis kedaluwarsa saat saya ingin mendorong pembaruan.
- Sesuatu yang lain
javascript
web-applications
caching
Josh Kelley
sumber
sumber
Jawaban:
Anda membutuhkan solusi penghilang cache . Peran penghilang cache adalah:
Dalam proyek berbasis Grunt, sudah biasa menggunakan grunt-rev untuk memastikan bahwa semua file yang perlu di-refresh diberi nama unik, berdasarkan kontennya.
Jika Anda memastikan bahwa file JSON Anda mendapatkan nama file cachebusting bersama dengan referensi mereka di Javascript Anda, klien akan selalu memuat file JSON yang diharapkan Javascript.
Keuntungan dari penamaan file berbasis hash adalah bahwa file yang tidak berubah akan mendapatkan nama file yang sama setelah cache-busting, sehingga browser dapat terus menggunakan konten yang di-cache dengan aman ketika tidak diubah.
Jelas ini adalah jenis hal yang Anda ingin otomatis sebagai bagian dari produksi produksi proyek Anda sehingga Anda tidak perlu melacak perubahan nama file & referensi secara manual.
sumber
Anda dapat menggunakan
if-modified-since + last-modified
atauif-none-match + etag
tajuk bersama dengancache-control
tajuk yang tepat . (Mungkin ada bug browser , tetapi tidak ada yang tidak dapat Anda kelola di browser terbaru.)Jika file-file itu statis, maka saya sarankan Anda untuk menggunakan
if-modified-since
, karena itu dapat dilakukan secara otomatis dengan server HTTP yang dikonfigurasi dengan baik. Seharusnya mengirim 304 kembali jika file tidak diubah sejak unduhan terakhir.Saya tidak berpikir Anda # 1 dan # 2 akan bekerja dalam jangka panjang. # 3 atau # 4 dapat bekerja. # 3 lebih sederhana, tetapi Anda harus belajar cara mengatasi masalah ini hanya sekali. Jadi saya akan mencoba # 4 jika saya jadi Anda, tetapi solusinya mungkin tergantung pada browser apa yang digunakan pelanggan Anda ... Misalnya IE8 memiliki masalah dengan memperbarui cache ajax, dll ...
sumber
Jika Anda dapat memasukkan Java Servlet Filter di SPA Anda, berikut ini adalah solusi yang berfungsi: CorrectBrowserCacheHandlerFilter.java
Pada dasarnya, ketika browser Anda meminta file statis, server akan mengarahkan ulang setiap permintaan ke yang sama tetapi dengan parameter permintaan hash (
?v=azErT
misalnya) yang tergantung pada konten file statis target.Melakukan hal ini, browser tidak akan pernah men-cache file statis yang dideklarasikan dalam Anda
index.html
misalnya (karena akan selalu menerima a302 Moved Temporarily
), tetapi hanya akan melakukan cache yang dengan versi hash (server akan menjawabnya200
). Jadi cache browser akan digunakan secara efisien untuk file-file statis dengan versi hash.Penafian: Saya penulis
CorrectBrowserCacheHandlerFilter.java
.sumber