使用 JavaScript 構建具有離線支援的漸進式 Web 應用 (PWA)


在當今的數字時代,Web 應用已成為我們日常生活不可或缺的一部分。然而,僅僅依靠穩定的網際網路連線來訪問這些應用可能會受到限制,尤其是在網路連線不良或網路中斷的地區。這就是漸進式 Web 應用 (PWA) 的優勢所在。PWA 結合了兩者的優點,提供了 Web 應用的便利性和原生移動應用的強大功能和響應速度。在本文中,我們將深入探討 PWA 的世界,並探索如何使用 JavaScript 構建具有離線支援的 PWA。在本指南結束時,您將掌握建立健壯的 Web 應用的知識和工具,即使在離線模式下也能無縫執行。

瞭解漸進式 Web 應用

在我們深入技術細節之前,讓我們花點時間來了解漸進式 Web 應用 (PWA) 的真正含義。PWA 是利用現代 Web 技術提供沉浸式和類似原生應用的使用者體驗的 Web 應用。與傳統的 Web 應用不同,PWA 可以直接從使用者的桌面訪問,就像任何其他應用一樣。這消除了使用者需要開啟 Web 瀏覽器並輸入 URL 的需求,提供了更加流暢和便捷的體驗。

PWA 的關鍵特性之一是其能夠在離線或網路連線有限的區域工作。透過利用稱為 Service Worker 的技術,PWA 可以快取必要的資源,包括 HTML、CSS、JavaScript 和媒體檔案。這種快取機制允許應用即使在網路連線丟失或較弱的情況下也能繼續執行,為使用者提供對關鍵功能的不間斷訪問。

Service Worker 的作用

Service Worker 是構建具有離線支援的 PWA 的核心。Service Worker 是一個 JavaScript 檔案,充當 Web 應用、網路和瀏覽器之間的中間層。它在後臺執行,獨立於網頁,並攔截應用發出的網路請求。

使用 Service Worker,開發人員可以對如何處理網路請求進行細粒度控制。他們可以攔截請求、快取響應,甚至在網路不可用時使用快取內容進行響應。此功能使 PWA 能夠提供“離線優先”體驗,即即使沒有網際網路連線,應用也能正常執行。

程式碼示例 1:註冊 Service Worker

讓我們從檢視一個註冊 Service Worker 的簡單程式碼片段開始:

if ('serviceWorker' in navigator) {
   navigator.serviceWorker.register('/service-worker.js')
   .then(registration => {
      console.log('Service Worker registered:', registration);
   })
   .catch(error => {
      console.error('Service Worker registration failed:', error);
   });
}

解釋

程式碼片段以一個條件語句開頭,該語句檢查 navigator 物件是否具有 serviceWorker 屬性。這驗證瀏覽器是否支援 Service Worker。如果存在該屬性,我們將在 navigator.serviceWorker 上呼叫 register() 方法,並將 Service Worker 檔案的路徑作為引數傳遞。

register() 方法返回一個 Promise,允許我們非同步處理註冊過程。在示例中,我們使用 then() 方法在註冊成功時將成功訊息記錄到控制檯。相反,如果在註冊過程中發生錯誤,我們將使用 catch() 方法捕獲它並記錄錯誤訊息。

透過註冊 Service Worker,我們在 PWA 和瀏覽器之間建立了連線,使我們能夠充分利用離線功能。

快取資源以供離線訪問

註冊 Service Worker 後,下一步是快取必要的資源。這確保了即使網路連線不可靠,PWA 也可以訪問關鍵檔案。

讓我們看看如何實現這一點:

self.addEventListener('install', event => {
   event.waitUntil(
      caches.open('my-pwa-cache')
      .then(cache => {
         return cache.addAll([
            '/',
            '/index.html',
            '/styles.css',
            '/app.js',
            '/images/logo.png'
         ]);
      })
   );
});

解釋

在此示例中,我們偵聽 install 事件,該事件在 Service Worker 首次安裝或更新時觸發。在事件偵聽器內,我們使用 caches.open() 方法開啟一個名為快取。我們將其命名為“my-pwa-cache”以幫助我們稍後識別它。

caches.open() 方法返回一個 Promise,該 Promise 解析為一個快取物件。然後,我們使用快取物件的 addAll() 方法將資源陣列新增到快取中。在這種情況下,我們包括應用的主 HTML 檔案、CSS 樣式、JavaScript 程式碼和影像。這些資源對於 PWA 的核心功能至關重要。

透過在安裝過程中快取這些資源,我們確保即使使用者處於離線狀態,它們也能隨時可用。

提供快取資源

請考慮以下程式碼。

self.addEventListener('fetch', event => {
   event.respondWith(
      caches.match(event.request)
      .then(response => {
         return response || fetch(event.request);
      })
   );
});

解釋

fetch 事件被 Service Worker 攔截,允許我們在可用時提供快取的資源。如果在快取中找到請求的資源,則 Service Worker 將使用快取版本進行響應。否則,它將回退到從網路獲取資源。

離線支援和同步

除了快取資源外,PWA 還可以利用後臺同步和本地儲存等技術來支援離線場景。後臺同步允許應用在離線時將請求排隊,並在網路連線恢復後傳送。本地儲存允許在使用者裝置上儲存資料,即使應用處於離線狀態也可以訪問這些資料。

結論

在本文中,我們探討了使用 JavaScript 構建具有離線支援的 PWA 的基礎知識。我們檢查了 Service Worker 的作用,演示瞭如何註冊和快取資源,並強調了後臺同步和本地儲存的重要性。掌握了這些知識,開發人員就可以開始建立在線上和離線環境中都能表現出色的健壯 PWA。

更新於: 2023-07-24

415 次檢視

開啟你的 職業生涯

透過完成課程獲得認證

開始學習
廣告