具代表性的面試主題

前端面試:如何安全設計 Speculation Rules 導航加速?

前端困難
OfferCC 編輯團隊發佈 更新

題幹

新聞網站希望用 Speculation Rules API 加速文章詳情跳轉。請說明如何選擇 prefetch 與 prerender、限制規則範圍,並處理登入態副作用、資料新鮮度、瀏覽器降級、取消和監控。

題幹與適用場景

新聞網站希望用 Speculation Rules API 加速文章詳情跳轉。請說明如何選擇 prefetch 與 prerender、限制規則範圍,並處理登入態副作用、資料新鮮度、瀏覽器降級、取消和監控。

Chrome 文件指出,prefetch 主要提前取得資源,prerender 會在不可見頁面中載入並渲染;後者收益較高,也更容易提前觸發腳本和副作用。題目考察效能工程、漸進增強和安全邊界,不是背 API 欄位。

面試官考察點

重點看候選人能否依導航命中率和副作用風險選擇策略;能否控制規則選擇器、同源範圍、快取和隱私;能否在不支援 API 或預先渲染被取消時保持正常導航;能否用真實使用者指標證明收益,而非只看實驗室分數。

30 秒回答框架

「我先用高命中、唯讀、同源文章連結做保守 prefetch;只有確認頁面沒有寫入副作用、命中率高且資源預算允許時才 prerender。規則按範本和使用者意圖分層,登入、付款、個人化和有副作用的路由不預先渲染。伺服器用快取和請求冪等保護,客戶端偵測 document.prerendering 並延後分析上報。舊瀏覽器直接走普通導航,最後比較啟用率、LCP、INP、頻寬和取消率。」

分步驟深入解答

第一步:先劃分導航風險

把文章詳情、說明頁等唯讀頁列為候選;排除下單、登出、按讚寫入、付款和強個人化頁面。預先渲染會執行頁面生命週期程式碼,任何寫入都必須由使用者真實啟用觸發。

第二步:選擇 prefetch 或 prerender

命中率低或副作用不確定時只做 prefetch。prerender 適用於高命中、同源、首屏穩定且能承受額外 CPU 與記憶體的頁面。不要把全站連結都設為 prerender;按範本或明確意圖設定規則。

第三步:控制規則和資源預算

使用文件規則或伺服器產生規則,只匹配文章連結;限制並行候選數量和資源大小。為預取回應設定合適快取、Vary 和失效策略,避免帶有使用者私密資料的回應被錯誤共用。

第四步:隔離副作用與登入態

伺服器寫入介面必須要求真實操作和 CSRF 防護,不能因預先渲染請求改變狀態。分析、廣告和通知腳本在 document.prerendering 階段延後,啟用後再傳送一次並去重。個人化回應使用私有快取或直接排除。

第五步:設計相容與取消路徑

不支援 Speculation Rules 的瀏覽器直接使用普通連結。預先渲染可能因記憶體、網路或規則限制被取消,頁面仍須正常載入。不要假設預先渲染一定完成,也不要為追求瞬時導航阻塞點擊回饋。

第六步:處理資料新鮮度

內容變更頻繁時縮短快取並在啟用時校驗版本;對帶 ETag 的資源使用條件請求。若預先渲染頁面已過期,啟用後靜默刷新可變區域,不閃回舊內容,也不重複傳送使用者操作。

第七步:觀測真實收益

分組比較啟用與未啟用使用者的啟用率、導航等待、LCP、INP、CLS、頻寬、CPU、記憶體和取消率。按瀏覽器、網路、裝置和登入狀態分層;若首屏更快但流量或錯誤率上升,應縮小規則或退回 prefetch。

設計取捨與邊界

命中率與資源成本

prerender 命中率低時會浪費 CPU、記憶體和頻寬;prefetch 成本較低但收益有限。以真實啟用率和資源預算設定門檻。

新鮮度與瞬時導航

長快取提高命中率卻增加陳舊風險。靜態內容可使用版本化 URL;動態內容在啟用時校驗,並將刷新限制在可變區域。

相容性與維護成本

規則應是漸進增強層,普通連結始終可用。避免把業務狀態機綁在預先渲染生命週期,減少跨瀏覽器差異。

失敗演練與演進計畫

預先渲染提前觸發寫入

在測試環境記錄預先渲染請求,確認按讚、統計和通知介面沒有副作用;將寫操作改為真實啟用後執行。

低命中率造成資源浪費

按裝置和網路關閉低階環境的 prerender,比較頻寬與 INP,再由 prefetch 小流量灰度到 prerender。

啟用後內容過期

模擬發布更新發生在預先渲染與點擊之間,驗證 ETag 和局部刷新,確保看到最新標題與正文。

常見誤區與追問

誤區一:所有連結都 prerender

追問:命中率、並行上限和記憶體預算是多少?應提出規則篩選與關閉條件。

誤區二:預先渲染等同快取

追問:頁面執行哪些腳本?如何延後分析並保護登入態?

誤區三:只看 Lighthouse 分數

追問:真實使用者的啟用率、取消率和頻寬變化如何分層驗證?

誤區四:沒有普通導航回退

追問:瀏覽器不支援或預先渲染被取消時,點擊鏈路是否仍可用?

誤區五:忽略資料新鮮度

追問:文章在預先渲染後更新,啟用時怎樣避免顯示舊內容?

延伸追問與參考答案

為什麼不直接對所有頁面 prerender?

因為預先渲染會消耗額外資源並可能執行腳本。只選高命中、唯讀、同源且有預算的頁面。

如何避免分析事件重複?

在預先渲染階段偵測 document.prerendering,延後事件到啟用並以導航 ID 去重。

如何證明優化有效?

用真實使用者分流,比較啟用導航的 LCP、INP、等待時間、頻寬和取消率,並按裝置與網路分層。

公開來源

同類題目

資源

產品比較

每份比較均依官方資料整理,並標示複核日期。

查看完整比較