当前位置: 首页 > 知识库问答 >
问题:

服务工作者自身未触发服务工作者获取事件

祝灼光
2023-03-14

我注意到,当服务工作人员脚本本身加载到浏览器中时,不再触发服务工作人员的读取事件。例如,当我们有一个新版本的服务辅助角色时,旧的服务辅助角色读取事件不会被触发。因此,旧的服务工作者不能再检查新服务工作者的内容。

我确信这以前是可能的,我想知道这是否是一个bug,或者是否对此进行了任何更改。我在官方存储库或W3C草稿中没有找到与此更改相关的任何内容。

为了验证fetch事件没有被触发,我用版本号(参见代码)编程了一个小示例service worker。我通过以下方式对其进行了测试:

  1. 安装第一版Service Worker
  2. 将版本号增加到两个。
  3. 重新加载页面-

sw.js示例:

const version = 1;
console.log(`SW with v${version} executed`);

async function onFetch(event) {
    // Not triggered for sw.js
    console.log(`fetching: ${event.request.url} with v${version}`);
    return await fetch(event.request);
}

async function onInstall() {
    console.log(`sw v${version} install`);
    await self.skipWaiting();
}

async function onActivate() {
    console.log(`sw v${version} activate`);
    await self.clients.claim();
}

self.addEventListener('fetch', event => event.respondWith(onFetch(event)));
self.addEventListener('install', event => event.waitUntil(onInstall()));
self.addEventListener('activate', event => event.waitUntil(onActivate()));

正如我们从日志中看到的,sw.js文件没有被读取,但是在安装新的服务工作人员之前读取了另一个字段(test.js)。我包含了test.jsjavascript文件,以查看服务工作者是否正在获取任何东西。因此,从这个测试中,我们可以看到,对于Service Worker脚本本身,提取事件并没有被触发。

我想知道的是,有没有办法在新的service worker javascript文件加载到旧的service worker之前获取它?是否有其他事件使这成为可能?我不需要截取脚本来执行或替换旧的服务工作者。我只想在加载新服务人员之前检查其内容。

编辑:

<html>
    <body>
        <h1>hello</h1>
        <script src="test.js"></script>
        <button onclick="runFetch()">fetch</button>
        <h2 id="swVersion"></h2>
        <script>
            navigator.serviceWorker.register('/sw.js'); // First Installation
            fetch('/sw.js'); // Triggers fetch event, but is independent from update routine.
            async function runFetch() {
                console.log(await fetch('/sw.js'));
            }
        </script>
    </body>
</html>

共有1个答案

尹何平
2023-03-14

由浏览器启动的service worker更新检查总是绕过所有service workerfetch处理程序。它可能最终由HTTP缓存完成,尽管所有现代浏览器默认也会绕过HTTP缓存直接进入网络。

我非常确信,在执行service worker更新检查时,没有浏览器触发过前一个service worker的获取事件处理程序,因为这是service worker规范明确禁止的(更新请求的service workers模式需要设置为'none')。这有助于开发人员避免旧的服务人员在为新的服务人员处理fetch事件时,如果做了不正确的事情,可能会“卡住”的情况。

我不确定您为什么会有其他想法,也许您正在考虑HTTP缓存交互。或者,您可能正在考虑这样一种场景:web应用程序显式调用fetch('service-worker.js'),检查给定URL上是否存在服务工作者,这将触发服务工作者控制给定页面的fetch处理程序。但是调用fetch('service-worker.js')与服务工作者更新检查非常不同。

 类似资料:
  • 所以我尝试在我的angular web应用程序中使用service worker来显示自定义脱机页面,遇到的问题是 但是如果我把服务人员放进去。js文件在assets文件夹中它按预期工作,但由于服务在assets文件夹中,因此无法启动获取 我的问题是,如果我有我的文件在角根文件夹如何导入/给出正确的路径。 应用程序。组成部分ts 我的服务人员文件在下图中的位置 我是新的角,所以任何指导将是有帮助的

  • 我在列出索引时遇到问题。my service worker获取事件中的html文档。因此,如果我打开一个新选项卡并转到我的开发服务器,我会在ServiceWorkerFetchEventListener中看到作为请求URL列出的文档。 这是输出 好的,一切按计划进行。但是当我刷新页面时,我看不到根请求或“/”作为索引。html。 我正在做什么。我已经在服务器上添加了一个中间件,以确保浏览器不会缓存

  • 一旦安装了Service Worker,Chrome浏览器需要多长时间来检查它的更新版本?当前客户端服务工作人员通常什么时候到期? 我正试图找出与服务人员一起开发并将更改推送到prod的最佳实践。目前,一旦对服务人员的行为方式实施了更改,如果已经安装了以前的服务人员,则客户机并不总是会接受该更改。 这个问题也有一定的相关性:以编程方式更新服务工作人员——理想情况下,一旦对SW实现了更改,您会希望在

  • 离线时,我的服务人员会出现以下错误: 我的服务人员如下所示: 它位于顶层目录,就在索引中类似这样导入的清单的旁边。html:

  • 如何获取由服务人员的“获取”事件提供服务的页面的完整URL? "self.location"属性似乎只引用站点的根URL。例如,如果页https://example.com/folder/pagename.html正在执行服务工作人员正在拦截的读取,则服务工作人员的self.location属性返回https://example.com。 事件当前目标。地点和活动。明确目标。地点、事件。原始目标和

  • 我有一个糟糕的服务人员,不再更新。我首先注意到了Chrome中的问题。然后,我将以下代码放入索引中。html文件和软件中的。js(服务工作者)文件。在大多数情况下,它似乎运行良好。Firefox似乎是唯一一个没有删除服务工作者的浏览器。我使用下面的文章创建了注销脚本。 如何卸载Service Worker? 我也用过这篇文章和代码,得到了同样的结果。 我如何删除一个有缺陷的服务人员,或者实现一个“