刷新服务工作者中使用 importScripts 导入的脚本

Refresh scripts imported with importScripts in service worker

我有一个网站有这样的服务人员:

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

假设 script.js 更新了一些新代码并且服务工作线程由于推送事件而被激活(用户在此期间没有再次访问我的网站)。

importScripts 是在每次激活 service worker 时检查更新,还是在首次安装 service worker 时只下载 script.js 一次?

每次服务工作者收到推送消息时,是否有任何方法可以刷新服务工作者代码(尤其是导入的脚本)?

来自 Service Workers specification, scripts imported via importScripts are stored in a map when the Service Worker is installed/updated and are then reused until a new update. There's a discussion on GitHub 更多详细信息。

我想不出一种方法来在 service worker 收到推送消息时重新加载导入的脚本。你的用例是什么?

可以强制浏览器 revalidate/check 通过 importScripts() 包含的代码是否已通过动态生成 service worker URL 更新——如果这每小时更改一次,那么浏览器将下载并安装 "new" service worker,包括所有导入的脚本。

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

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

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

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

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

w3 and Chrome Updates

查看有关定义的完整参考