關於 Service Worker 和 Web 應用對應關係的討論

發表於2024-02-14

Web 開發領域引入 Service Worker 的動機

使用者希望應用程式能夠在緩慢或不穩定的網路連線上啟動,甚至在離線狀態下啟動。他們希望最近互動的內容(例如媒體曲目或門票和行程)處於持續可用狀態。當請求無法實現時,他們希望應用程式能夠告訴他們,而不是默默地失敗或崩潰。

使用者希望快速完成這一切,即使載入時間縮短 0.1 秒也可以將轉化率提高高達 10%。總而言之:使用者期望 PWA 可靠,這就是我們擁有 Service Worker 的原因。

當應用程式請求 Service Worker 範圍內的資源時(包括使用者離線時),Service Worker 會攔截該請求,充當網路代理。然後,它可以決定是否應該透過快取儲存 API 從網路提供資源(通常在沒有 Service Worker 的情況下會發生),或者從本地演算法建立資源。這使我們可以提供與平臺應用程式類似的體驗。它甚至可以完全離線工作。

注意一點,並非所有瀏覽器都支援 Service Worker。即使存在,這些 Service Worker 在首次載入或等待啟用時也不會可用。因此,我們在設計 Web 應用時,需要將其視為可選的,並且核心功能不能依賴於這些 Service Worker.

Service Worker 所在的資料夾決定了其範圍。位於 example.com/my-pwa/sw.js 的 Service Worker 可以控制 my-pwa 路徑或以下路徑的任何導航,例如 example.com/my-pwa/demos/ 。 Service Worker 只能控制其範圍內的專案(頁面、Worker,統稱為“客戶端”)。範圍適用於瀏覽器選項卡和 PWA 視窗。

每個範圍僅允許一名 Service Worker。當活動和執行時,無論記憶體中有多少客戶端(例如 PWA 視窗或瀏覽器選項卡),通常只有一個例項可用。

一個最佳實踐是:應該將 Service Worker 的範圍設定為儘可能靠近應用程式的根目錄。這是最常見的設定,因為它允許 Service Worker 攔截與 PWA 相關的所有請求。例如,請勿將其放入 JavaScript 資料夾或從 CDN 載入。

相關文章