本文首發於公衆號:符合預期的CoyPancss
不久以前,我簡單探索了service worker在一個活動運營頁面中的應用,能夠參考我以前的這篇文章:react
那個時候,我就發現了一個現象:一張圖片從service worker中加載的耗時,大於其從瀏覽器緩存中加載的耗時。最近在作頁面首屏性能優化的相關工做,那麼service worker能讓頁面首屏加載變快麼?緩存
首先明確一下業務場景:一個App的h5分享頁。這個分享頁是一個使用react開發的單頁應用,用戶的交互只會停留在這個頁面,不會跳轉到其餘的頁面。業務中使用service worker來緩存靜態資源(js,css),邏輯很簡單,就是在service worker初始化的時候,將頁面的靜態資源緩存下來,後續訪問頁面時,能夠直接從service worker中加載靜態資源。有一個點須要注意,service worker的優先級是高於瀏覽器自帶緩存的。目標是探索service worker是否可以加快頁面首屏速度。性能優化
針對本文提到的業務場景,我設計了小流量實驗來驗證service worker對網頁首屏速度的影響。網絡
首先明確一下實驗指標:post
關於首屏速度的更多指標,能夠參考我以前寫的這篇文章:性能
當考慮網頁首屏加速的時候,咱們在考慮什麼fetch
我經過用戶id將頁面的流量均分紅了兩組,對照組A,實驗組B。優化
對照組A:不包含service worker邏輯,徹底走以前的頁面加載模式。
實驗組B:包含service worker邏輯,使用service worker劫持網頁中的靜態資源請求。
在實驗組B中,包含了如下多種狀況:
我統計了5個天然天裏,各個指標的50分位值,60分位值,90分位值和平均數。咱們先來直觀地看下A組和B組各個指標的50分位值的對比吧。
從上面的直觀對比能夠看出,4個指標,B組的50分位值都略微大於A組的50分位值,差距在幾十毫秒左右。
其實,各個指標的50分位值,60分位值,90分位值和平均數,都是B組的值略大於A組的值。
到這裏,其實已經能夠得出一個結論了:在本文所描述的業務場景中,service worker並不能提升首屏速度。
下面是本次實驗的詳細數據。
首先給出一個上圖看不出來的數據:
在實驗組B中,B1,B2,B3三個組的PV佔比大體爲:20%,46%,34%。
接着,從上面的數據中,能夠發現幾個比較有意思的點:
從詳細數據來看,若是靜態文件經過service worker加載時,確實能夠較大幅度提升首屏速度。可是從總體的效果上來看,service worker並不能提升首屏速度,甚至還會略微下降首屏速度。這是由業務場景決定的。最終,我也沒有采用service worker來優化首屏速度。
那麼,什麼狀況下,能用service worker來優化首屏速度呢?我以爲主要是如下兩個場景:
本文經過實驗,收集了詳細的數據,研究了service worker在首屏加速問題上的表現。雖然最終並無在業務中採用service worker來加速首屏,可是在過程當中也收穫了不少的東西,符合預期。