7

我有一个网站,其中有一个服务人员,例如:

// Import a script from another domain
importScripts('https://example.com/script.js')

假设script.js使用一些新代码进行了更新,并且由于推送事件而激活了 service worker(用户同时没有再次访问我的网站)。

importScripts每次激活 Service Worker 时是否检查更新,或者script.js在首次安装 Service Worker 时只下载一次?

每次服务工作人员收到推送消息时,有没有办法让服务工作人员代码(特别是导入的脚本)刷新?

4

3 回答 3

4

可以通过动态生成服务工作者 URL 来强制浏览器重新验证/检查包含的代码是否importScripts()已更新 - 如果每小时更改一次,则浏览器将下载并安装“新”服务工作者,包括所有导入的脚本。

以下代码将使浏览器每小时检查一次所有依赖项:

const MAXAGE = 3600; // seconds until recheck
const URL = `/sw.js?q=${Math.floor(Date.now() / (MAXAGE * 1000))}`;
navigator.serviceWorker.register(URL);

Demo——打开 JS 控制台并点击;您应该会看到导入的脚本每 10 秒重新加载一次。

(这并不能完全解决您的问题(服务工作者仅在用户访问页面时更新,而不是在收到推送通知时更新)但它可能就足够了。)

于 2017-03-23T00:14:21.100 回答
4

根据Service Worker规范,通过 导入的脚本importScripts在安装/更新 Service Worker 时存储在映射中,然后在新的更新之前重复使用。GitHub上有一个讨论更多细节。

当服务人员收到推送消息时,我想不出一种方法来重新加载导入的脚本。你的用例是什么?

于 2016-07-08T14:16:59.033 回答
0

从 chrome 68 开始,这可以通过{updateViaCache: 'none'}在注册 service worker 时进行设置来完成。它不对导入文件的内容使用缓存

在w3Chrome 更新中查看有关定义的完整参考

于 2019-03-22T14:16:23.880 回答