網站效能與 SEO

unload 正式退休:Chrome 不再觸發它,你的「上一頁」終於能秒回

Chrome 團隊的 Barry Pollard 與 Fergal Daly 於 2026/10/16 在 Chrome for Developers 部落格宣布,unload 事件的淘汰已在 Chrome 155 完成:預設情況下,Chrome 與其他 Chromium 瀏覽器不再觸發 unload 處理器。這次淘汰從 2025 年 3 月到 2026 年 9 月分階段推出;iOS 上的 Chrome 因使用 WebKit 仍可能觸發。網站仍可透過 Permissions Policy 與 Chrome Enterprise 設定選擇保留,但官方鼓勵移除。Chrome 數據顯示,使用 unload 的導覽從 18% 降到不到 4%;unload 作為 bfcache 唯一阻擋原因的比例從 6% 降到約 1%,等於額外約 5% 的導覽能瞬間前進/返回。本文整理背景、對效能與分析數據的影響,以及以 pagehide、pageshow 改寫的實作建議。

Pixar 風格 3D 插圖:戴著派對帽的老檯燈角色抱著裝有盆栽和馬克杯的紙箱揮手道別,披著藍色披風的瀏覽器視窗角色開心地衝進由網頁卡片組成的發光漩渦,四周有彩帶和氣球。
unload 正式退休:Chrome 不再觸發它,你的「上一頁」終於能秒回

Chrome 在 10 月 16 日宣布:從 Chrome 155 起,unload 事件預設不再觸發,歷時一年半的分階段淘汰正式完成。使用 unload 的導覽從 18% 降到不到 4%,額外約 5% 的導覽因此能用上 bfcache 瞬間返回。給品牌官網、電商與行銷團隊:還靠 unload 送追蹤、存資料的程式碼,現在該搬家了。

每個網站都有一位「下班前最後一個關燈的同事」。他負責在大家離開時存檔、收拾桌面、順手寄出今天的報表。

在網頁世界裡,這位同事叫做 unload。

問題是,這位同事其實很常翹班。手機把背景分頁直接關掉時,他不在;瀏覽器把頁面塞進記憶體準備秒回時,他也不知道該不該出現。大家以為他每天都有寄報表,事實上很多天根本沒寄。

10 月 16 日,Chrome 的 Barry Pollard 與 Fergal Daly 在 Chrome for Developers 部落格宣布:這位同事正式退休了。從 Chrome 155 起,unload 事件預設不再觸發。

發生了什麼事?

unload 誕生在一個很單純的年代:網頁打開、看完、關掉。頁面關閉時,unload 讓程式有機會完成最後的工作,例如儲存使用者資料、清理資源、或發送分析數據。

但現在的頁面生命週期沒那麼好預測。很多頁面一開就是好幾天;更多頁面是在完全沒機會執行 unload 的情況下被關掉,尤其在手機上,作業系統為了節省資源,常常默默關掉背景頁面。

再加上 bfcache(往返快取)。bfcache 會把整個頁面暫存在記憶體裡,使用者按「上一頁」時直接瞬間還原,不用重新載入。可是 unload 的前提是「頁面要結束了、不會再回來」,兩者放在一起很容易出問題。各家瀏覽器的處理方式也不一樣:有的優先 bfcache、有的優先 unload,而且在沒用到 bfcache 時,大家又都會觸發 unload。結果就是:看起來有時候能用,但非常不一致。

Chrome 團隊的結論是:與其維持這種混亂,不如一次做個了斷。

淘汰是怎麼完成的?

因為這是會影響既有網站的破壞性變更,Chrome 採取了相當謹慎的分階段推出:從 2025 年 3 月到 2026 年 9 月,一邊推出一邊監測網站是否壞掉、聽取開發者回饋。現在這項工作已經完成,unload 在 Chrome 上一致地不再觸發。

幾個重要的例外與後續:

  • iOS 上的 Chrome 仍可能觸發 unload,因為它使用的是 Safari 的 WebKit 引擎,而不是完整的 Chrome。
  • 網站可以選擇退出:透過 Permissions Policy API 或 Chrome Enterprise 設定,少數網站仍會收到 unload 事件,但一樣不可靠。Chrome 表示沒有計畫移除這些退出機制,但鼓勵網站主改掉。
  • 其他 Chromium 瀏覽器也會跟進:這項淘汰很快會在 Chromium 原始碼中預設開啟,除非其他 Chromium 瀏覽器自己改掉預設值。

數字會說話

Chrome 公布的影響數據:

  • 使用 unload 的導覽比例,從 18% 降到不到 4%。
  • unload 作為 bfcache 唯一阻擋原因的導覽,從 6% 降到約 1%,也就是說,額外約 5% 的導覽現在能享受瞬間前進/返回。
  • unload 作為多個阻擋原因之一的比例,從 22% 降到約 3%,代表如果把其他阻擋原因也解決,還有更多空間。

為什麼這很重要?web.dev 的 bfcache 文章引用 Chrome 使用數據:桌機上每 10 次導覽就有 1 次、手機上每 5 次就有 1 次是「上一頁」或「下一頁」。這些導覽如果能從記憶體瞬間還原,對使用者來說就是「快到感覺不到載入」。

對你的網站代表什麼?

第一,靠 unload 做的事,可能早就沒在做了。 如果你的網站、外掛或第三方腳本還在 unload 裡送追蹤事件、儲存表單草稿、或通知後端「使用者離開了」,那這些動作在 Chrome 上已經不會發生。請盤點一下:結帳流程的放棄追蹤、文章閱讀時間統計、即時客服的離線通知,這些都是常見的 unload 用途。

第二,你的分析數據可能會「變少」,但其實是體驗變好。 web.dev 提到,很多分析工具不會把 bfcache 還原算成新的瀏覽量。當更多導覽改用 bfcache,報表上的瀏覽量可能下降,但使用者實際體驗是變快的。

第三,效能指標可能看起來「變慢」,同樣是錯覺。 被 bfcache 取代的通常是最快的那批重複載入,資料集裡少了這些快速樣本,整體分布會往慢的方向偏。對 TTFB 這類指標,建議依導覽類型分開看;Core Web Vitals 的工具(例如 Chrome 使用者體驗報告)則會把 bfcache 還原當成獨立造訪計算。

實戰改寫指南

  1. 用 pagehide 取代 unload。 web.dev 說得很直接:「永遠不要用 unload 事件。」pagehide 在所有 unload 會觸發的情況下都會觸發,頁面進入 bfcache 時也會觸發。
window.addEventListener('pagehide', (event) => {
  // 在這裡收尾,例如關閉連線、儲存狀態
});
  1. 用 pageshow 偵測 bfcache 還原。 event.persisted 為 true 時代表頁面是從 bfcache 回來的,可以在這時更新購物車數量、重新檢查登入狀態,或補送一次瀏覽量。
window.addEventListener('pageshow', (event) => {
  if (event.persisted) {
    // 從 bfcache 還原:更新過期資料、補送 page_view
  }
});
  1. beforeunload 只在需要時加。 例如表單有未儲存的變更時才加上提醒,存檔後立刻移除。

  2. 少用 Cache-Control: no-store。 頁面本身設了 no-store,瀏覽器通常不會把它放進 bfcache。只有真的含敏感資料的頁面才用;一般需要最新內容的頁面,可以改用 no-cache 或 max-age=0。

  3. 離開前關掉連線。 開著的 IndexedDB 連線、進行中的 fetch 等,可能讓某些瀏覽器不把頁面放進 bfcache。在 pagehide 關閉,在 pageshow 重新連上。

  4. 用 DevTools 測試。 在 Chrome DevTools 的 Application → Back-forward Cache 面板按 Run Test,它會告訴你頁面能不能被還原,以及原因是否「可以處理」。Lighthouse 也有對應的稽核。

  5. 想完全杜絕,可以加上標頭。 Permissions-Policy: unload=() 能防止第三方腳本或擴充功能偷偷加上 unload(目前僅 Chromium 系瀏覽器支援)。

情境演練:一家電商的「上一頁」

假設一家服飾電商,使用者常見的動線是:分類頁 → 點進商品 → 看完按「上一頁」回分類頁 → 再點下一件。這種來回跳動,正是 bfcache 最能發揮的地方。

如果分類頁因為某個舊追蹤腳本掛了 unload,或整頁設了 no-store,每次按「上一頁」都要重新載入、重新捲到剛才的位置,使用者很容易失去耐心。改成 pagehide 收尾、移除不必要的 no-store 之後,同一個動作就能瞬間回到原本的列表與捲動位置。

要注意的是,從 bfcache 回來的頁面是記憶體裡的舊快照。購物車數量、庫存提示、登入狀態這類資訊,記得在 pageshow 且 persisted 為 true 時重新整理,避免顯示過期資料。

怎麼量測成果?

改完之後,可以在分析工具裡把 bfcache 還原獨立標記成一種導覽類型,再和一般的「上一頁」導覽次數比較,算出 bfcache 命中率。Chrome 也提供 NotRestoredReasons API,告訴你頁面為什麼沒被還原;Chrome 使用者體驗報告(CrUX)也加入了導覽類型,不用自己埋點也能看到 bfcache 導覽的數量。

你可能會問

Q:我們的網站沒有自己寫 unload,需要處理嗎? A:不一定是你寫的。第三方腳本、舊版外掛也可能加上 unload。用 DevTools 或 Lighthouse 跑一次最準。

Q:iPhone 使用者呢? A:iOS 上的 Chrome 使用 WebKit,unload 仍可能觸發,但也同樣不可靠。改用 pagehide 才是跨瀏覽器的穩妥做法。

Q:這跟 SEO 有關係嗎? A:bfcache 主要改善的是使用者的往返導覽體驗,而 Core Web Vitals 工具會把 bfcache 還原當成獨立造訪計算。網站越快、越順,對使用者與搜尋表現都是加分,但不要期待「改掉 unload 就排名大躍進」。

Q:bfcache 命中率能做到 100% 嗎? A:不行。使用者重開瀏覽器、複製分頁,或頁面在記憶體裡待太久被丟棄,都不會用到 bfcache。重點是找出「頁面自己擋住 bfcache」的情況。

結語:讓翹班的同事好好退休

unload 的退休,是網頁平台少見的「真的把 API 拿掉」。Chrome 團隊自己也說,他們不常這麼做,但這次值得。

對網站經營者來說,這是一個難得的雙贏機會:把收尾工作交給更可靠的 pagehide,順便讓更多使用者按「上一頁」時瞬間回到原處。花一個下午盤點程式碼,換來的是更快、更穩、數據也更可信的網站。


來源:Unload event deprecated in Chrome(Barry Pollard、Fergal Daly,Chrome for Developers,2026/10/16)。

延伸參考:Back/forward cache(Philip Walton、Barry Pollard,web.dev,2026/10/16 更新)。

← 返回技術文章