gpt4 book ai didi

javascript - Service Worker 已注册并激活但无法在离线模式下工作

转载 作者:行者123 更新时间:2023-11-29 23:26:45 24 4
gpt4 key购买 nike

在 UI5 应用程序中,我已经在 index.html 中注册了我的服务 worker :

$(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 以便服务 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
});

有了这一切,我就可以正确安装和激活我的 service worker。如果我转到“缓存存储”选项卡,我会缓存信息:

Cache Storage

我的连接是安全的 (HTTPS),但是当我进入离线模式时,请求从缓存磁盘而不是服务 worker 返回。

我猜这是因为它是从浏览器的自动缓存中获取的,但是如果我在 Chrome 中单击“禁用缓存”选项,它不会加载离线页面。

有人知道为什么会这样吗?

最佳答案

这是对 "Has anyone worked on Service Worker Implementation in SAPUI5?" 的回答
引用自 MDN :

[Service Worker] is designed to be fully async; as a consequence, APIs such as synchronous XHR [...] can't be used inside a service worker.

所以目前,Service Worker doesn't intercept sync XHRs UI5 确实发送了许多同步 XHR,这解释了为什么 those files are not intercepted .

因此,尽量减少同步 XHRs explained in here .

  1. 创建组件预加载文件
  2. 尽可能在所有地方设置 async: true。例如

    • 对于组件

      sap.ui.component({
      manifestUrl: "...",
      async: true,
      })
    • Root View (在应用描述符中)

      rootView : {
      viewName: "...",
      type: "XML",
      async: true,
      ...
      },
  3. 通过 Bootstrap 配置preload 异步加载库,值为"async"。例如:

    data-sap-ui-preload="async"
  4. 启用 xx-waitForTheme 预加载库。例如:

    data-sap-ui-libs="sap.m, sap.ui.core, sap.f"
    data-sap-ui-xx-waitForTheme="true"

我也看到了 you have some fragments .避免通过 fragment factory 延迟加载控件因为片段是通过这种方式同步获取的。

关于javascript - Service Worker 已注册并激活但无法在离线模式下工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48883323/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com