带offline.html 备份页面的Service Worker

2024-03-22

我无法显示offline.html 页面。我不断得到The FetchEvent for "https://my-domain.com" resulted in a network error response: a redirected response was used for a request whose redirect mode is not "follow".

这是我的 service-worker.js 的片段,它应该返回offline.html当网络不可用时。

self.addEventListener('fetch', function(event) {
     if (event.request.mode === 'navigate' || (event.request.method === 'GET' && event.request.headers.get('accept').includes('text/html'))) {
        if(event.request.url.includes("my-domain.com")){
            console.log(event.request);
            event.respondWith(
                caches.match(event.request).then(function(resp) {
                    return resp || fetch(event.request).then(function(response) {
                        let responseClone = response.clone();
                        caches.open(CACHE_NAME).then(function(cache) {
                            cache.put(event.request, responseClone);
                        });
                        return response;
                    });
                }).catch(function() {
                    return caches.match("/offline.html");
                })
            );            
        }
    }
});

下面是我的网络请求的console.log(离线时页面刷新)

Request {method: "GET", url: "https://my-domain.com", headers: Headers, destination: "unknown", referrer: "", …}
bodyUsed:false
cache:"no-cache"
credentials:"include"
destination:"unknown"
headers:Headers {}
integrity:""
keepalive:false
method:"GET"
mode:"navigate"
redirect:"manual"
referrer:""
referrerPolicy:"no-referrer-when-downgrade"
signal:AbortSignal {aborted: false, onabort: null}
url:"https://my-domain.com"
__proto__:Request

我得到了这个工作/找到了修复。这与浏览器中的重定向响应安全问题有关。来自 Chromium Bug 博客,.

解决方案: 要避免此故障,您有 2 个选择。

  1. 您可以更改安装事件处理程序以存储从 res.body 生成的响应:

    self.oninstall = evt => {
      evt.waitUntil(
          caches.open('cache_name')
            .then(cache => {
                return fetch('/')
                  .then(response => cache.put('/', new Response(response.body));
              }));
    };
    
  2. 或者通过将重定向模式设置为“手动”来更改两个处理程序以存储非重定向响应:

    self.oninstall = function (evt) {
      evt.waitUntil(caches.open('cache_name').then(function (cache) {
        return Promise.all(['/', '/index.html'].map(function (url) {
          return fetch(new Request(url, { redirect: 'manual' })).then(function (res) {
            return cache.put(url, res);
          });
        }));
      }));
    };
    self.onfetch = function (evt) {
      var url = new URL(evt.request.url);
      if (url.pathname != '/' && url.pathname != '/index.html') return;
      evt.respondWith(caches.match(evt.request, { cacheName: 'cache_name' }));
    };
    
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

带offline.html 备份页面的Service Worker 的相关文章

  • 如何向 PWA 标题栏添加返回和刷新按钮

    我正在编写一个 PWA 应用程序 我想要的是back and refresh标题栏上的按钮 但我什么也没得到 更新 按钮应该由浏览器控制 而不是我的用户界面 The display清单文件中的属性必须是fullscreen or stand
  • 难以通过网络蓝牙连接热敏打印机

    现在我正在开发能够连接热敏打印机的网络 我正在使用 Angular 框架 并且我使用库成功将热敏打印机与 USB 连接ng thermal printer 但我希望我的网络也能够通过网络蓝牙 BLE 蓝牙低功耗 连接热敏打印机 据我所知 B
  • 在 Chrome Android 中全屏运行的 PWA 不支持显示模式:独立

    这两种方法都没有用于检测standaloneChrome Android 中的模式在我的 PWA 中工作 https licitaciones chilediseno org 这是我尝试过的CSS方法 media all and displ
  • 请确保您的 Service Worker 文件包含以下内容:/(const precacheManifest =)\[\](;)/

    我对 React Workbox 还很陌生 我试图让我的 Electron React 应用程序能够缓存所有图像和数据 以便在离线时可用 这正是我在 YouTube 视频中想要实现的目标 14 00 到 21 00 分钟 使用 React
  • Chrome 85 Service Worker 一直在尝试安装

    在我的 Web 应用程序上更新 chrome 85 后 Service Worker 不再安装 它在 chrome 84 或更早版本 Safari Firefox Microsoft Edge 浏览器上运行良好 尝试查找更改日志或错误报告
  • 在没有窗口引用的选项卡 dom 之间进行通信[重复]

    这个问题在这里已经有答案了 我使用以下命令打开包含一些页面内容的新选项卡 在新进程中 var p document getElementById myElement var a document createElement a a setA
  • 我如何在 chrome Extension(manifest V3) 的服务工作者中包含 socket.io-client

    我从 cdn 复制了客户端 socket io 脚本 然后使用 importScript 但是当我真正运行时它给出了 ReferenceError document is not defined at JSONPPolling doPoll
  • FCM 数据消息无法在 Firefox 中加载

    我正在使用 Web FCM 进行云消息传递 当我发送一个通知有了标题和正文 Firefox 和 Chrome 都会显示通知并且工作正常 但是当我尝试发送 FCM 时Data消息 Firefox 不接收和记录消息 我正在使用一个HTTPS安全
  • 有没有办法在 Google Play 上提交reactjs PWA?

    我想使用 一次编写 到处运行 所以我用create react app在reactjs中创建了一个PWA 我的应用程序运行良好 我可以将其从网站放在手机的主屏幕上 不过 我也希望在移动商店中可见 从 Google Play 开始 I tri
  • 无法查看 Service Worker 日志

    看不到我的 Service Worker 的日志 以下是我尝试打开已注册和正在运行的服务工作人员日志的步骤 Open chrome serviceworker internals 单击开始并检查 刷新检查窗口 等待日志出现 但是 两者chr
  • Chrome DevTools 中缺少“添加到主屏幕”链接

    使用 Google 服务可能会令人沮丧 他们有令人难以置信的文档 但文档总是假设一切正常 如果有什么东西不像广告上说的那样有效 那你就完全靠自己了 没有错误消息 没有解决问题的帮助 甚至没有承认某些事情可能不起作用 以防万一 添加到主屏幕
  • 在 Facebook 浏览器中更新 Service Worker

    遇到了一个问题 我们的一些用户在我们网站的 Facebook 浏览器中存在有问题的 Service Worker 问题 当 Facebook 应用程序用户访问我们在 FB 上共享的页面时 他们会在 FB 浏览器上看到我们的 您离线页面 该错
  • 不透明的回复有哪些限制?

    不透明的回应 https fetch spec whatwg org concept filtered response opaque被定义为一部分获取API https fetch spec whatwg org 并表示向远程源发出请求的
  • 检测 Service Worker 离线状态的最佳实践

    我有一个服务工作者应该缓存一个offline html客户端没有网络连接时显示的页面 然而 有时它会认为导航器已离线 即使它并未离线 那是 navigator onLine false 这意味着用户可能会得到offline html而不是实
  • 当路由器处于历史模式时,PWA 不会加载(基于 Vue CLI 3 的项目)

    我有一个基于 Vue CLI 3 的应用程序 我想将其用作 PWA 我需要它在历史模式下工作 因为哈希会介入我正在执行的基于 OAuth 的身份验证过程的一部分的重定向 当路由处于哈希模式时 可以像 PWA 一样正常加载 一旦我将模式更改为
  • 打开 Chrome 扩展程序时出现 Service Worker TypeError

    当我打开 WAVE Web 可访问性评估工具 扩展时 我的服务工作人员在 Chrome 中抛出此错误 未捕获 承诺中 类型错误 请求方案 chrome extension 是 不支持的 在 sw js 52 匿名 sw js 52 Prom
  • 什么是 Service Worker 控制台? & 它在 Chrome 浏览器中的什么位置?

    我正在研究推送通知并遇到一个陌生的术语 service worker console 我已阅读并使用过该术语console log or web console在浏览器中 但我不熟悉这个术语service worker console 之后
  • PWA 可以访问联系人、GPS 或使用手机摄像头吗?

    PWA 可以访问联系人 GPS 或使用手机摄像头吗 这在任何系统 ios android 中都可能吗 是否有任何开发计划来实现这些功能 PWA 无法克服一些限制 you cannot访问电话上的联系人列表 另一方面 你can拍照并使用 GP
  • 发送网络推送通知时出错:没有端点?

    我创建了一个基本应用程序 尝试使用 web push 节点库发送推送通知 但是 我总是遇到错误 你必须至少传入一个端点 我不明白 因为我 订阅 使用 ServiceWorker Api subscribe 方法 它创建了一个到我的本地主机地
  • Angular PWA 离线存储

    我正在构建一个新的 Web 应用程序 即使没有互联网连接 它也需要无缝工作 我选择了 Angular 并正在构建一个 PWA 因为它具有使应用程序离线工作的内置功能 到目前为止 我已经让服务工作人员完美工作并由清单文件驱动 这很好地缓存了静

随机推荐