Temukan navigasi yang diblokir agar tidak menggunakan bfcache, dan alasannya.
Properti notRestoredReasons
, yang ditambahkan ke class PerformanceNavigationTiming
, melaporkan informasi tentang apakah frame yang ada dalam dokumen diblokir agar tidak menggunakan bfcache pada navigasi, dan alasannya. Developer dapat menggunakan informasi ini untuk mengidentifikasi halaman yang perlu diupdate agar kompatibel dengan bfcache, sehingga meningkatkan performa situs.
Status saat ini
notRestoredReasons
API telah dikirim dari Chrome 123 dan sedang diluncurkan secara bertahap.
Konsep dan penggunaan
Browser modern menyediakan fitur pengoptimalan untuk navigasi histori yang disebut cache kembali/maju (bfcache). Hal ini memungkinkan pengalaman pemuatan instan saat pengguna kembali ke halaman yang telah mereka kunjungi. Halaman dapat diblokir agar tidak masuk ke bfcache atau dihapus saat berada di bfcache karena berbagai alasan, beberapa di antaranya diwajibkan oleh spesifikasi dan beberapa khusus untuk implementasi browser.
Sebelumnya, developer tidak dapat mengetahui alasan halaman mereka diblokir agar tidak menggunakan bfcache di lapangan, meskipun ada pengujian di alat developer Chrome. Untuk mengaktifkan pemantauan di lapangan, class PerformanceNavigationTiming
telah diperluas untuk menyertakan properti notRestoredReasons
. Tindakan ini akan menampilkan objek yang berisi informasi terkait di frame atas dan semua iframe yang ada dalam dokumen:
- Alasan mengapa pengguna diblokir agar tidak dapat menggunakan bfcache.
Detail seperti frame
id
danname
, untuk membantu mengidentifikasi iframe di HTML.Hal ini memungkinkan developer mengambil tindakan untuk membuat halaman tersebut kompatibel dengan bfcache, sehingga meningkatkan performa situs.
Contoh
Instance PerformanceNavigationTiming
dapat diperoleh dari fitur seperti Performance.getEntriesByType()
dan PerformanceObserver
.
Misalnya, Anda dapat memanggil fungsi berikut untuk menampilkan semua objek PerformanceNavigationTiming
yang ada di linimasa performa dan mencatat notRestoredReasons
-nya ke dalam log:
function returnNRR() {
const navEntries = performance.getEntriesByType("navigation");
for (let i = 0; i < navEntries.length; i++) {
console.log(`Navigation entry ${i}`);
let navEntry = navEntries[i];
console.log(navEntry.notRestoredReasons);
}
}
Untuk navigasi histori, properti PerformanceNavigationTiming.notRestoredReasons
menampilkan objek dengan struktur berikut, yang mewakili status diblokir dari frame tingkat atas:
{
children: [],
id: null,
name: null,
reasons: [
{"reason", "unload-listener"}
],
src: null,
url: "https://www.example.com/page/"
}
Propertinya adalah sebagai berikut:
children
- Array objek yang mewakili status diblokir dari frame dengan origin yang sama yang disematkan dalam frame level teratas. Setiap objek memiliki struktur yang sama dengan objek induk — dengan cara ini, jumlah level frame tersemat apa pun dapat direpresentasikan di dalam objek secara rekursif. Jika frame tidak memiliki turunan, array akan kosong.
id
- String yang mewakili nilai atribut
id
frame (misalnya<iframe id="foo" src="...">
). Jika frame tidak memilikiid
, nilainya akan menjadinull
. Untuk halaman tingkat atas, ini adalahnull
. name
- String yang mewakili nilai atribut
name
frame (misalnya<iframe name="bar" src="...">
). Jika frame tidak memilikiname
, nilainya akan berupa string kosong. Untuk halaman tingkat atas, ini adalahnull
. reasons
- Array string yang masing-masing mewakili alasan halaman yang dinavigasi diblokir agar tidak menggunakan bfcache. Ada banyak alasan mengapa pemblokiran dapat terjadi. Lihat bagian Alasan pemblokiran untuk mengetahui detail selengkapnya.
src
- String yang mewakili jalur ke sumber frame (misalnya
<iframe src="b.html">
). Jika frame tidak memilikisrc
, nilainya akan berupa string kosong. Untuk halaman tingkat atas, ini adalahnull
. url
- String yang mewakili URL halaman/iframe yang dinavigasi.
Untuk objek PerformanceNavigationTiming
yang tidak mewakili navigasi histori, properti notRestoredReasons
akan menampilkan null
.
Perhatikan bahwa notRestoredReasons
juga menampilkan null
jika tidak ada alasan pemblokiran, sehingga null
ini bukan merupakan indikator bahwa bfcache digunakan atau tidak. Untuk melakukannya, Anda harus menggunakan properti event.persisted
.
Melaporkan pemblokiran bfcache dalam frame origin yang sama
Jika halaman memiliki frame dengan origin yang sama yang disematkan, nilai notRestoredReasons
yang ditampilkan akan berisi objek di dalam properti children
yang mewakili status diblokir dari setiap frame tersemat.
Contoh:
{
children: [
{
children: [],
id: "iframe-id",
name: "iframe-name",
reasons: [],
src: "./index.html",
url: "https://www.example.com/"
},
{
children: [],
id: "iframe-id2",
name: "iframe-name2",
reasons: [
{"reason": "unload-listener"}
],
src: "./unload-examples.html",
url: "https://www.example.com/unload-examples.html"
},
],
id: null,
name: null,
reasons: [],
src: null,
url:"https://www.example.com"
}
Melaporkan pemblokiran bfcache dalam frame lintas-asal
Jika halaman memiliki frame lintas-asal yang disematkan, kami membatasi jumlah informasi yang dibagikan tentangnya untuk menghindari kebocoran informasi lintas-asal. Kami hanya menyertakan informasi yang sudah diketahui halaman luar, dan apakah subtree lintas origin memblokir bfcache atau tidak. Kami tidak menyertakan alasan pemblokiran atau informasi tentang tingkat subtree yang lebih rendah (meskipun beberapa sub-tingkat memiliki origin yang sama).
Contoh:
{
children: [
{
children: [],
id: "iframe-id",
name: "iframe-name",
reasons: [],
src: "./index.html",
url: "https://www.example2.com/"
}
],
id: null,
name: null,
reasons: [
{"reason": "masked"}
],
src: null,
url:"https://www.example.com"
}
Untuk semua iframe lintas-asal, kami melaporkan null
untuk nilai reasons
untuk frame, dan frame tingkat atas akan menampilkan alasan "masked"
. Perhatikan bahwa "masked"
juga dapat digunakan untuk alasan khusus agen pengguna sehingga mungkin tidak selalu menunjukkan masalah dalam iframe.
Lihat bagian Keamanan dan privasi dalam penjelasan untuk mengetahui detail selengkapnya tentang pertimbangan keamanan dan privasi.
Alasan pemblokiran
Seperti yang telah kami sampaikan sebelumnya, ada banyak alasan mengapa pemblokiran dapat terjadi:
Berikut adalah contoh beberapa alasan paling umum mengapa bfcache tidak dapat digunakan:
unload-listener
: halaman mendaftarkan pengendaliunload
, yang mencegah penggunaan bfcache di browser tertentu. Lihat Penghentian penggunaan peristiwa penghapusan muatan untuk mengetahui informasi selengkapnya.response-cache-control-no-store
: Halaman menggunakanno-store
sebagai nilaicache-control
.related-active-contents
: Halaman dibuka dari halaman lain (baik menggunakan "tab duplikat") yang masih memiliki referensi ke halaman ini.
Masukan
Tim Chromium ingin mengetahui pengalaman Anda dengan bfcache notRestoredReasons
API.
Ceritakan kepada kami tentang desain API
Apakah ada sesuatu tentang API yang tidak berfungsi seperti yang Anda harapkan? Atau apakah ada metode atau properti yang tidak ada yang Anda perlukan untuk menerapkan ide Anda? Ada pertanyaan atau komentar tentang model keamanan? Ajukan masalah spesifikasi di repo GitHub yang sesuai, atau tambahkan pendapat Anda ke masalah yang ada.
Melaporkan masalah terkait penerapan
Apakah Anda menemukan bug pada penerapan Chromium? Atau apakah implementasinya berbeda dengan spesifikasi?
Laporkan bug di issue tracker kami. Pastikan untuk menyertakan detail sebanyak mungkin,
petunjuk sederhana untuk mereproduksi, dan tentukan komponen sebagai UI > Browser > Navigation > BFCache
.
Glitch sangat cocok untuk membagikan rekaman ulang yang cepat dan mudah.
Menampilkan dukungan untuk API
Apakah Anda berencana menggunakan bfcache notRestoredReasons
API? Dukungan publik Anda membantu tim Chromium
memprioritaskan fitur dan menunjukkan kepada vendor browser lain betapa pentingnya mendukung fitur tersebut.
Kirim tweet ke @ChromiumDev menggunakan hashtag
#NotRestoredReasons
dan
beri tahu kami tempat dan cara Anda menggunakannya.