[英]Service Worker Registered and Activated but Doesn't Work in Offline Mode
在 UI5 應用程序中,我已經在index.html 中注冊了我的服務工作者:
$(document).ready(function() {
if ('serviceWorker' in navigator) {
navigator.serviceWorker
.register('service-worker.js', { scope: './' })
.then(function(registration) {
console.log("Service Worker Registered");
})
.catch(function(err) {
console.log("Service Worker Failed to Register", err);
})
}
});
此外,我在根文件夾中有service-worker.js文件,以便 service worker 可以緩存它下面的所有元素。 該文件包含以下代碼:
// Set a name for the current cache
var cacheName = 'v2';
// Default files to always cache
var cacheFiles = [
'./',
'./inicio.html?I_APLICACION=CAPCGENA02',
'./resources/sap-ui-core.js',
'./resources/sap/ui/core/themes/base/fonts/SAP-icons.ttf',
'./resources/sap-ui-core.js',
'./resources/sap/ui/core/library-preload.js',
'./resources/sap/m/library-preload.js',
'./resources/sap/ui/unified/library-preload.js',
'./resources/sap/ui/comp/library-preload.js',
'./resources/sap/ui/table/library-preload.js',
'./resources/sap/ui/fl/library-preload.js',
'./resources/sap/tnt/library-preload.js',
'./resources/sap/ui/unified/themes/sap_belize/library-parameters.json',
'./resources/sap/ui/table/themes/sap_belize/library-parameters.json',
'./resources/sap/ui/comp/themes/sap_belize/library-parameters.json',
'./resources/sap/tnt/themes/sap_belize/library-parameters.json',
'./resources/sap/ui/layout/library-preload.js',
'./resources/sap/ui/unified/themes/sap_belize/library.css',
'./resources/sap/ui/table/themes/sap_belize/library.css',
'./resources/sap/ui/comp/themes/sap_belize/library.css',
'./resources/sap/tnt/themes/sap_belize/library.css',
'./css/style.css',
'./css/fonts/ttf/CMEEMEN18.ttf',
'./images/temporal/chart.PNG',
'./Component.js',
'./Component-preload.js',
'./manifest.json',
'./api/api.reformation.data.js',
'./api/ApiManager.js',
'./api/ApiStructure.js',
'./api/ibd.api.login.data.js',
'./controller/Home.controller.js',
'./controller/Login.controller.js',
'./controller/Menu.controller.js',
'./controller/fragment/ManagePartes.js',
'./controller/fragment/FilterDialogController.js',
'./controller/structure/Container.controller.js',
'./controller/structur
'./database/apiBBDD.js',
'./database/bbdd.js',
'./i18n/i18n.properties',
'./i18n/i18n_en.properties',
'./i18n/i18n_es.properties',
'./i18n/i18n_en_US.properties',
'./i18n/i18n_es_ES.properties',
'./manager/dataManager/DataManager.js',
'./manager/functionalityManager/FunctionalityManager.js',
'./manager/mappingManager/MappingManager.js',
'./manager/parserManager/ReformationParser.js',
'./manager/sessionManager/SessionManager.js',
'./manager/structureManager/ElementManager.js',
'./manager/structureManager/StructureManager.js',
'./manager/viewManager/ViewManager.js',
'./singleton/Singleton.js',
'./utils/Consts.js',
'./utils/Funcionality.js',
'./utils/FunctionalityEvent.js',
'./utils/MaskedPassword.js',
'./utils/Utils.js',
'./view/Home.view.xml',
'./view/Login.view.xml',
'./view/Menu.view.xml',
'./view/fragment/DialogConfirm.fragment.xml',
'./view/fragment/DialogEnd.fragment.xml',
'./view/fragment/DialogError.fragment.xml',
'./view/fragment/DialogTag.fragment.xml',
'./view/fragment/DialogWaiting.fragment.xml',
'./view/fragment/HistoryDialog.fragment.xml',
'./view/fragment/HistoryNoticeDialog.fragment.xml',
]
self.addEventListener('install', function(e) {
console.log('[ServiceWorker] Installed');
// e.waitUntil Delays the event until the Promise is resolved
e.waitUntil(
// Open the cache
caches.open(cacheName).then(function(cache) {
// Add all the default files to the cache
console.log('[ServiceWorker] Caching cacheFiles');
//return cache.addAll(cacheFiles);
return cache.addAll(cacheFiles.map(url => new Request(url, {credentials: 'same-origin'})));
})
); // end e.waitUntil
});
self.addEventListener('activate', function(e) {
console.log('[ServiceWorker] Activated');
e.waitUntil(
// Get all the cache keys (cacheName)
caches.keys().then(function(cacheNames) {
return Promise.all(cacheNames.map(function(thisCacheName) {
// If a cached item is saved under a previous cacheName
if (thisCacheName !== cacheName) {
// Delete that cached file
console.log('[ServiceWorker] Removing Cached Files from Cache - ', thisCacheName);
return caches.delete(thisCacheName);
}
}));
})
); // end e.waitUntil
});
self.addEventListener('fetch', function(e) {
console.log('[ServiceWorker] Fetch', e.request.url);
// e.respondWidth Responds to the fetch event
e.respondWith(
// Check in cache for the request being made
caches.match(e.request)
.then(function(response) {
// If the request is in the cache
if ( response ) {
console.log("[ServiceWorker] Found in Cache", e.request.url, response);
// Return the cached version
return response;
}
// If the request is NOT in the cache, fetch and cache
var requestClone = e.request.clone();
fetch(requestClone)
.then(function(response) {
if ( !response ) {
console.log("[ServiceWorker] No response from fetch ")
return response;
}
var responseClone = response.clone();
// Open the cache
caches.open(cacheName).then(function(cache) {
// Put the fetched response in the cache
cache.put(e.request, responseClone);
console.log('[ServiceWorker] New Data Cached', e.request.url);
// Return the response
return response;
}); // end caches.open
})
.catch(function(err) {
console.log('[ServiceWorker] Error Fetching & Caching New Data', err);
});
}) // end caches.match(e.request)
); // end e.respondWith
});
有了這一切,我就正確安裝並激活了我的服務人員。 如果我轉到緩存存儲選項卡,我會緩存信息:
我的連接是安全的 (HTTPS),但是當我進入離線模式時,請求來自緩存磁盤而不是來自服務工作者。
我猜這是因為它是從瀏覽器的自動緩存中獲取的,但是如果我點擊 Chrome 中的“禁用緩存”選項,它不會加載離線頁面。
有誰知道為什么會這樣?
這是對“有人在 SAPUI5 中從事 Service Worker 實現嗎?”的回答。
以及來自MDN的引用:
[Service Worker] 被設計為完全異步的; 因此,不能在 Service Worker 中使用諸如同步 XHR [...] 之類的 API。
所以目前, Service Worker 不攔截同步 XHR ,UI5 確實發送了許多同步 XHR,這解釋了為什么這些文件沒有被攔截。
因此,請盡量減少同步 XHR,如此處所述。
盡可能在任何地方設置async: true
。 例如
對於組件
sap.ui.component({ manifestUrl: "...", async: true, })
根視圖(在應用程序描述符中)
rootView : { viewName: "...", type: "XML", async: true, ... },
通過 bootstrap 配置preload
加載異步加載庫,值為"async"
。 例如:
data-sap-ui-preload="async"
預加載啟用xx-waitForTheme
庫。 例如:
data-sap-ui-libs="sap.m, sap.ui.core, sap.f" data-sap-ui-xx-waitForTheme="true"
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.