【问题标题】:Is there a way to pass some value to a serviceworker to use during the install step?有没有办法将一些价值传递给服务人员在安装步骤中使用?
【发布时间】:2016-11-03 22:20:15
【问题描述】:

有没有办法将值传递给服务工作者,以便它可以在安装步骤中使用?

例如,如果您的网页资源位于基于项目发布版本 (resource-2.11/js/...) 的文件夹中。在某些时候,您需要知道resource-2.11 才能缓存一些文件。这个值可以传入吗?

【问题讨论】:

  • 您能否将其作为构建步骤而不是在运行时动态确定?
  • @TimoSta 是的,这可以解决我的问题。根据我所看到的一切,了解服务人员是否可以接受某种参数仍然很有用:/

标签: javascript service-worker


【解决方案1】:

有几种不同的方法。

按照 cmets 中的建议,在构建时生成 service-worker.js 文件可能是正确的方法。这样做的好处是可以确保在您的版本化前缀发生更改时触发install 事件,因为对service-worker.js 内容的任何更改都足以触发service worker update

但是,如果由于某种原因您不能这样做,那么对于“如何将值传递给安装期间可用的服务工作者”这一一般问题的另一个答案是使用 IndexedDB。您可以从主页设置一个值,然后注册服务工作者,然后服务工作者可以读取该值。您应该注意,从主页更改 IndexedDB 中的值将不会触发 Service Worker 更新。

最后,如果您想在值更改时触发服务工作线程更新,则可以使用另一种方法,但由于某种原因,您无法在构建步骤期间修改 service-worker.js。这就是将值作为 URL 查询参数包含在您从页面注册时附加到 service-worker.js 的末尾:

// From your web page:
if ('serviceWorker' in navigator) {
  const value = encodeURIComponent('some-parameter-value');
  const swUrl = `service-worker.js?_param=${value}`;
  navigator.serviceWorker.register(swUrl);
}

// From your service worker:
self.addEventListener('install', event => {
  const selfUrl = new URL(self.location);
  // Uses https://developer.mozilla.org/en-US/docs/Web/API/URLSearchParams
  const parameterValue = selfUrl.searchParams.get('_param');
  // Do something with parameterValue
});

使用不同的 URL 注册 Service Worker 将触发 Service Worker 更新,相当于更改 service-worker.js 的内容。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-07-27
    • 2018-05-18
    • 2023-03-06
    • 2017-09-02
    • 2022-11-11
    • 1970-01-01
    • 2017-05-25
    • 2022-06-10
    相关资源
    最近更新 更多