Pengguna menekan butang kembali lebih kerap berbanding hampir mana-mana kawalan lain dalam pelayar. Mereka menjangkakan skrin sebelumnya muncul serta-merta, tepat di tempat mereka meninggalkannya. Pelayar moden memenuhi jangkaan tersebut dengan cache kembali/hadapan, atau bfcache. Daripada memusnahkan halaman apabila anda beralih, pelayar membekukannya dalam memori. Apabila anda kembali, ia memulihkan satu snapshot. Pelayar melangkau proses parsing HTML, pelaksanaan semula JavaScript, dan pengiraan semula susun atur. Hasilnya terasa sekelip mata kerana halaman tersebut tidak pernah benar-benar mati.
Apa yang sebenarnya dilakukan oleh bfcache
Pemuatan halaman biasa adalah mahal. Pelayar mesti mengambil sumber, menokenkan HTML, membina DOM, menjalankan skrip, menyelesaikan gaya, melakukan susun atur, mengecat piksel, dan menggabungkan lapisan. bfcache memintas hampir kesemuanya dengan mengekalkan halaman dalam keadaan beku di dalam RAM. Ia bukan cache cakera. Halaman yang telah dirender, termasuk heap JavaScript, kedudukan skrol, dan keadaan borang, berada dalam memori semasa pengguna membaca halaman seterusnya. Apabila pengguna menekan kembali, pelayar mencairkan snapshot tersebut dan mencetuskan acara pageshow. Halaman disambung semula tanpa menyentuh rangkaian atau melakukan semula susun atur dari awal. Bagi pengguna pada peranti perlahan atau sambungan yang tidak stabil, perbezaan antara pemulihan bfcache dan pemuatan segar boleh mencecah ratusan milisaat atau lebih.
Apa yang merosakkannya
Seorang pembangun baru-baru ini menjalankan eksperimen bersih untuk mengetahui dengan tepat apa yang menyekat bfcache. Mereka membina enam halaman ringkas, setiap satu menguji satu penghalang yang disyaki, kemudian beralih dan menekan kembali. Keputusannya adalah jelas.
Halaman asas tanpa pengepala atau skrip yang luar biasa berjaya dipulihkan. Halaman dengan pendengar beforeunload juga dipulihkan tanpa masalah. Secara mengejutkan, halaman yang disajikan dengan Cache-Control: no-store juga memasuki bfcache, bercanggah dengan panduan lama. Malah artikel blog langsung, yang mungkin kelihatan terlalu dinamik untuk dibekukan, berjaya dipulihkan.
Dua halaman gagal. Halaman dengan pendengar acara unload tidak dapat dipulihkan. Halaman dengan sambungan WebSocket yang terbuka juga disekat. Dua kegagalan ini menunjukkan perangkap yang memerangkap laman produksi sebenar setiap hari.
Perangkap acara unload
Acara unload telah lama menjadi isyarat utama untuk pembersihan saat akhir. Pembangun menggunakannya untuk mengosongkan suar analitik, menghentikan pemasa, atau memadam keadaan sementara. Masalahnya ialah bfcache dibina atas idea bahawa halaman tersebut mungkin kembali aktif. Jika pelayar melihat pendengar unload, ia menganggap halaman tersebut menjangkakan pemusnahan sepenuhnya dan enggan membekukannya. Tidak kira jika fungsi yang dipasang itu kosong. Kehadiran pendengar itu sahaja sudah cukup untuk membatalkan caching pada setiap pelayar moden.
Penggantinya ialah pagehide. Acara ini dicetuskan kedua-duanya apabila halaman sedang dibekukan untuk bfcache dan apabila ia benar-benar dibuang. Jika anda perlu membezakan antara keduanya, sifat event.persisted adalah true apabila halaman menuju ke bfcache. Walau bagaimanapun, bagi kebanyakan tugas pembongkaran, pagehide merangkumi kedua-dua laluan. Pindahkan setiap bahagian logik pembersihan keluar daripada unload dan masukkan ke dalam pagehide. Kemudian buang setiap pendengar unload sepenuhnya, termasuk yang terselip dalam petikan analitik pihak ketiga atau plugin lama.
Perangkap sambungan aktif
Sambungan rangkaian atau storan yang terbuka menandakan bahawa halaman anda masih melakukan kerja sebenar. Pelayar menyenaraikan sumber aktif pada saat navigasi. Jika ia menemui WebSocket yang terbuka, sambungan rakan WebRTC yang aktif, atau sambungan IndexedDB yang masih ada, ia membatalkan pembekuan dan meruntuhkan halaman seperti biasa. Snapshot tidak boleh dipercayai selagi bait mungkin masih mengalir.
Anda harus menutup sumber-sumber ini di dalam pendengar pagehide. Panggil kaedah close WebSocket anda. Tutup sambungan rakan WebRTC. Batalkan atau sahkan sebarang transaksi IndexedDB yang tertunggak. Jika aplikasi anda memerlukan saluran tersebut apabila pengguna kembali, buka semula di dalam pageshow. Corak close-on-pagehide, restore-on-pageshow ini memastikan halaman layak untuk navigasi kembali sekelip mata tanpa kehilangan fungsi.
Kejutan no-store
Selama bertahun-tahun, kepercayaan konvensional menyatakan bahawa Cache-Control: no-store menghalang bfcache. Chrome telah mengubah tingkah laku tersebut pada tahun 2025. Halaman yang disajikan dengan no-store kini boleh memasuki bfcache. Pelayar hanya akan mengeluarkan snapshot yang dibekukan kemudian jika keadaan pengesahan atau kuki berubah dengan cara yang membatalkan keadaan yang disimpan. Jika anda telah menggunakan no-store sebagai
