輕鬆離線存取及提升效能
重要事項:此文件不適用於您目前選取的格式電子郵件!
Service Worker 能在網路連線不穩定的情況下,提供豐富的離線體驗和一致的使用者體驗。透過在瀏覽器中快取資源,Web 應用程式能夠向使用者提供資料、素材和離線頁面,以保持他們的參與和知情。
安裝 Service Worker
Service Worker 是位於您的網頁和伺服器之間的用戶端 Proxy,用於建構絕佳的離線體驗、快速載入的應用程式外殼情境,以及傳送推播通知。
您的 Service Worker 需要在指定的網頁上註冊,否則瀏覽器將無法找到或執行它。預設情況下,這會透過一點 JavaScript 來完成。在 AMP 網頁上,您可以使用 amp-install-serviceworker
元件來達到相同的目的。
為此,首先透過頁面 <head>
中的指令碼包含 amp-install-serviceworker
元件
<script async custom-element="amp-install-serviceworker" src="https://cdn.ampproject.org/v0/amp-install-serviceworker-0.1.js"></script>
然後在您的 <body>
中的某處新增以下內容 (修改以指向您的實際 Service Worker)
<amp-install-serviceworker src="https://www.your-domain.com/serviceworker.js" layout="nodisplay"> </amp-install-serviceworker>
如果使用者導覽至您來源網域上的 AMP 網頁 (與通常從 AMP 快取提供的第一次點擊相反),Service Worker 將會接管並執行許多很棒的事情 myriad of cool things。
AMP Service Worker
如果您在這裡,表示您正在使用 AMP 建構網頁。AMP 團隊非常重視將使用者放在首位,並為他們提供世界一流的網路體驗。為了保持這些體驗的一致性,AMP 團隊專門為 AMP 建立了一個 Service Worker!
安裝 AMP Service Worker
以最少的步驟安裝 AMP Service Worker
- 將 AMP Service Worker 程式碼匯入您的 Service Worker 檔案。
importScripts('https://cdn.ampproject.org/sw/amp-sw.js');
- 使用以下程式碼安裝 Service Worker。
AMP_SW.init();
- 完成。
自動快取
AMP Service Worker 會自動快取 AMP 指令碼檔案和 AMP 文件。透過快取 AMP 指令碼檔案,它們可以立即供使用者瀏覽器使用,從而在網路不穩定的情況下實現離線功能和更快的網頁速度。
如果您的應用程式需要特定類型的文件快取,AMP Service Worker 允許自訂。例如,新增一份拒絕清單,列出應始終從網路請求的文件。在以下範例中,將 Array<RegExp>
替換為代表您想要避免快取之文件的正規表示式陣列。
AMP_SW.init( documentCachingOptions: { denyList?: Array<RegExp>; } );
在此處閱讀更多關於 自訂文件快取的資訊。
最佳化 AMP Service Worker
為了充分利用 AMP Service Worker 的功能,應設定選用欄位以快取必要的素材和預先擷取連結。
驅動使用者造訪網頁的素材,例如影片、重要圖片或可下載的 PDF,應快取,以便使用者離線時可以再次存取。
AMP_SW.init( assetCachingOptions: [{ regexp: /\.(png|jpg)/, cachingStrategy: 'CACHE_FIRST' }], );
您可以自訂快取策略並定義拒絕清單。
指向使用者可能需要造訪的網頁連結可以預先擷取,讓他們在離線時也能存取。這可以透過在連結標籤中新增 data-prefetch
屬性來完成。
<a href='....' data-rel='prefetch' />
離線體驗
透過包含離線頁面,告知使用者他們已離線,並應在恢復連線時嘗試重新載入網站。AMP Service Worker 可以快取頁面及其素材。
AMP_SW.init({ offlinePageOptions: { url: '/offline.html'; assets: ['/images/offline-header.jpg']; } })
成功的離線頁面看起來像是您網站的一部分,因為它與應用程式的其餘部分具有一致的 UI。
強制更新
如果您的 AMP Service Worker 需要停用或變更,或者向使用者部署發生錯誤,團隊正在努力實作強制更新/移除功能。
為了有效地管理 Service Worker,您應該了解標準 HTTP 快取如何影響 Service Worker 的 JavaScript 保持最新的方式。使用適當 HTTP 快取指令提供的 Service Worker 可以透過進行適當的變更並將您的 Service Worker 重新部署到您的託管環境來解決小的錯誤修復。如果您需要移除 Service Worker,最好準備一個簡單的 no-op Service Worker 檔案,如下所示
self.addEventListener('install', () => {
// Skip over the "waiting" lifecycle state, to ensure that our
// new service worker is activated immediately, even if there's
// another tab open controlled by our older service worker code.
self.skipWaiting();
});
撰寫自訂 Service Worker
您可以使用上述技術來啟用您 AMP 網站的離線存取,以及在網頁從來源網域提供服務後立即擴充網頁。這是因為您可以透過 Service Worker 的 fetch
事件修改回應,並傳回您想要的任何回應
self.addEventListener('fetch', function(event) { event.respondWith( caches.open('mysite').then(function(cache) { return cache.match(event.request).then(function(response) { var fetchPromise = fetch(event.request).then(function(networkResponse) { cache.put(event.request, networkResponse.clone()); return networkResponse; }) // Modify the response here before it goes out.. ... return response || fetchPromise; }) }) ); });
透過使用此技術,您可以修改您的 AMP 網頁,使其具有各種額外的功能,否則這些功能將無法通過 AMP 驗證,例如
- 需要自訂 JS 的動態功能。
- 針對您的網站自訂/僅與您的網站相關的元件。
-
作者: @CrystalOnScript
貢獻者: @pbakaus