解決方案
到了 2017 年,典型頁面會載入數十個第三方指令碼,而其中屬於追蹤性質的指令碼,與使用者真正在等待的內容排在同一個網路佇列裡。Firefox Quantum(第 57 版)改寫了網路請求排程器,其中一項變更是利用「追蹤保護」資料庫,在頁面仍在積極載入與渲染時,延後載入來自追蹤網域的指令碼。Mozilla 工程師 Jan Bambas 稱這種技術為 tailing。
最直接的做法是完全封鎖追蹤器,但 Firefox 早已有「追蹤保護」專門負責此事,而且封鎖會破壞那些渲染或業務依賴這些指令碼的網站。另一個顯而易見的選項是什麼都不做,接受分析與廣告的載荷與真實內容相互競爭。Tailing 折衷了兩者:沒有任何東西被停用,只是被降低優先順序。
對追蹤網域的請求,只在網站自身的子資源仍在載入時才被暫緩,且最多只暫緩約六秒。動態加入或非同步載入的指令碼可能被延後,而追蹤像素、XHR,以及追蹤指令碼所請求的任何東西,則一律被延後。由於 HTML 規範把下載排程與優先順序留給瀏覽器決定,這項變更依網路規則而言是合法的,而建置良好的網站感受不到功能差異,因為它們所顯示的內容並不依賴追蹤器。
頁面載入效能的提升,來自把網路頻寬、I/O 與 CPU 省下來給網站自身所需的圖片與指令碼。可見的代價則落在建置不良的網站上:Google 的 A/B 測試程式碼片段會以 opacity 為零隱藏頁面,直到來自 www.google-analytics.com 的指令碼將其顯示出來,這可能讓頁面空白達四秒;而像 L'Équipe 這樣從同步指令碼呼叫 Twitter API 的網站,在延後的 async 指令碼尚未就緒時便會失敗。Bambas 主張,這些網站原本只是僥倖才能運作,因為同樣的競態在私密瀏覽或追蹤保護下也會讓它們出錯。
達成了什麼
延後而非封鎖:暫緩對追蹤網域的請求,直到頁面自身資源載入完成,再將其釋放
為何有效
追蹤器鮮少是渲染頁面所必需的,因此延後它們可把頻寬、I/O 與 CPU 釋放給網站自身資源,而不會明顯改變使用者所見。
延後而非封鎖,使這項功能維持在 HTML 規範之內,也不會摧毀分析或廣告的經濟模式,只是將其延後。
「追蹤保護」資料庫早已對第三方網域進行分類,因此排程器無須建立或維護新清單,便獲得了一個優先順序訊號。
出問題的網站,要嘛依賴追蹤器來渲染,要嘛依賴一場只因追蹤器伺服器回應快速才贏得的競態,因此這些退化暴露的是真實的脆弱性,而非錯誤的取捨。
可套用之處
當你無法移除某項成本時,就重新安排它:把低價值的工作暫緩到使用者可見的載入完成之後,你就能取得大部分好處,而不必引發爭鬥
後續發展
Tailing 隨 Firefox 57(Quantum)一同推出。Bambas 於 2017 年 12 月發表的解說,在 Hacker News 引發了 472 點、261 則留言的討論串,並獲得 Bleeping Computer 與 gHacks 的報導。Mozilla 記錄到的退化情形,包括 Google 的頁面隱藏程式碼片段讓頁面空白達四秒,都被送進 Bugzilla,而 Bambas 主張受影響的網站需要修正才能採用新的排程方式。他並補充,更廣泛的測量仍在進行中,而本地測試顯示增益淹沒在雜訊之中,因此完整的效益尚未被量化。
追溯依據
參考來源
- Firefox 57 delays requests to tracking domains Jan Bambas's blog · janbambas.cz ·
- Firefox 57 delays tracking domains gHacks Tech News · ghacks.net ·
- Hacker News discussion: Firefox 57 delays requests to tracking domains Hacker News · news.ycombinator.com ·