瀏覽器bfcache

bfcache是“back/foward cache”的縮寫。當頁面「符合某些條件」的時候,當使用者按了瀏覽器的上下頁,瀏覽器可以快速回復剛剛瀏覽的頁面。且因為bfcache做cache的方式是對整個頁面做快照(包含了Javascript Heap(用來儲存變數、函式的地方)),因此會包含剛剛所做的改變,例如變更過的DOM內容、Javascript的執行結果等等。同時,因為不需要再次載入資源,所以速度超快。

因為Javascript也被緩存的關係,假設我們是用vue.js開發前端頁面,當離開頁面後再返回時,就勢必不會重新觸發fetch, data, asyncData, mounted, created…等等的Methods與Lifecycle Hooks。

可快取條件

目前我測起來,各個瀏覽器可bfcache的條件似乎不太一樣。例如在Chrome中點擊了File Input就會無法cache,但在ios的Safari中並不會有問題。以下把查到的以及自己測試出來的整理出來。

  1. 不要使用unload事件:可以改用pagehide替代。
  2. 有條件地使用beforeunload事件:不使用匿名函數,且使用完後立刻removeEventListener是可以的。
  3. 標頭不要有Cache-Control: no-store
  4. 不要使用window.open()開啟新視窗或分頁,改用a標籤並指定target是_blank並加上rel=”noopener”
  5. 不要使用File Input, WebSocket, WebRTC, WebAuthetication API, IndexedDB, Web Locks API

測試方式

因為WebSocket不能用,因此若有使用Hot Module Replacement的開發環境,例如Vue, React,在開發模式時無法使用bfcache也是正常的。因此測試時最好以相同於正式環境的方式來測試。

打開Chrome的console,切換到Application頁籤,左邊找到Background Services,點選Back/foward cache。針對要測試的頁面點選Test back/foward cache按鈕。點選後頁面會快速地來回chrome://terms/與當前頁面,並回應是否成功。若失敗的話則會在下方顯示錯誤的原因。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料