分享一個sw對請求的監(jiān)聽處理方案
監(jiān)聽所有網(wǎng)絡(luò)請求
/**
* 捕獲所有網(wǎng)絡(luò)請求
*/
self.addEventListener('fetch', async (event) => {
let urlObj = new URL(event.request.url);// 獲取請求的 URL
//只允許特定域名的請求
if ( config && config.appCache.host.includes(urlObj.hostname)) {
// 捕獲所有網(wǎng)絡(luò)請求
event.respondWith(
(async () => {
//獲取請求方式
let method = event.request.method;
//console.log('fetch',event.request.url);
let url = event.request.url;
// 如果是特定域名則保存到IndexedDB
let requestManager = new RequestManager;
const isNavigationRequest = event.request.mode === 'navigate'; // 是否為導(dǎo)航請求,用戶試圖加載一個新頁面或刷新當(dāng)前頁面
let indexedDbManager =
new IndexedDbManager(config.appCache.dbName, config.appCache.storeName, config.appCache.key || 'url');
let responsePromise;// 響應(yīng)結(jié)果
const fileExistsInIndexedDb = await indexedDbManager.exists(url);// 獲取文件是否存在
// 先檢查IndexedDB中是否存在請求的資源
if (!fileExistsInIndexedDb) { // 如果文件不存在
responsePromise = requestManager
.fetchRequest(url, requestManager, indexedDbManager, isNavigationRequest, method)
.then((networkResponse) => {
return networkResponse;
})
} else {
responsePromise = indexedDbManager.get(url); // 從IndexedDB中獲取資源
}
return await responsePromise;
})()
);
}
});
0個回答