gpt4 book ai didi

javascript - 在 `install` 之前将状态信息传递给服务人员

转载 作者:行者123 更新时间:2023-12-03 13:20:46 25 4
gpt4 key购买 nike

背景

我是服务人员的新手,但正在处理 library旨在成为“离线优先”(实际上,几乎是“仅离线”)(FWIW,其目的是允许库的使用者提供表示表格多线性文本的 JSON 配置,并获得一个允许其用户的应用程序按段落/诗句范围以高度可定制的方式浏览这些文本。)

其他项目是将库安装为依赖项,然后通过我们的 JavaScript API 提供信息,例如 JSON 配置文件的路径,指示我们的应用程序将使用哪些文件为它们生成(离线)应用程序。

虽然我知道我们可以做以下任何事情:

  • 要求用户提供硬编码路径,我们的服务人员的 install 将从该路径中获取。脚本可以使用 waitUntil使用自己的 JSON 请求来检索用户的必要文件
  • 跳过服务人员的install JSON 文件的 service worker 步骤,并依赖 fetch更新缓存的事件,如果用户在获取可能发生之前完成安装并离线,则提供后备显示。
  • 将一些状态信息从我们的主脚本发布到服务器,一旦注册,服务 worker 将在完成其 install 之前进行查询事件。

  • ...但所有选择似乎都不理想,因为分别:
  • 我们图书馆的消费者可能更愿意为他们的 JSON 配置指定他们自己的位置。
  • 鉴于 JSON 配置指定了对向用户展示任何有用信息至关重要的文件,我宁愿不允许安装完成,只是说如果用户无法保留,则必须重新联机以获取其余文件在线后install事件以查看所有必需的提取发生。
  • 除了想要避免更多地访问服务器和额外的代码之外,我更希望我们的代码如此面向离线,以便能够完全在静态文件服务器上工作。

  • 问题:

    有没有办法在 install 之前将消息或状态信息传递给服务人员?事件发生,无论是作为服务 worker URL 的查询字符串的一部分,还是通过消息传递事件?从技术上讲,消息事件甚至可以在 install 之后到达。只要事件可以在 waitUntil 之前发生就开始在 install 内已经完成。

    我知道我可以自己对此进行测试,但我想知道当关键的应用程序文件本身必须像我们这样的库中动态获取时,什么是最佳实践。

    我猜 indexedDB可能是这里唯一的选择(即,将配置信息或 JSON 配置的路径保存到 indexedDB,注册服务 worker ,并从 install 事件中检索 indexedDB 数据)?即使这也不是理想的,因为我让用户为他们的存储定义一个命名空间,但我也需要一种方法将它传递给工作人员,否则,源上的多个此类应用程序可能会发生冲突。

    最佳答案

    使用查询参数

    如果你觉得它有用,那么是的,你可以在服务 worker 安装期间提供状态,方法是在注册服务 worker 时包含一个查询参数,如下所示:

    // Inside your main page:
    const pathToJson = '/path/to/file.json';
    const swUrl = '/sw.js?pathToJson=' + encodeURIComponent(pathToJson);
    navigator.serviceWorker.register(swUrl);

    // Inside your sw.js:
    self.addEventListener('install', event => {
    const pathToJson = new URL(location).searchParams.get('pathToJson');
    event.waitUntil(
    fetch(pathToJson)
    .then(response => response.json())
    .then(jsonData => /* Do something with jsonData */)
    );
    });

    关于这种方法有几点需要注意:
  • 如果您 fetch() install 中的 JSON 文件处理程序(如代码示例中所示),每个版本的服务 worker 脚本( sw.js )都会有效地发生一次。如果 JSON 文件的内容发生了变化,但其他一切都保持不变,则 service worker 不会自动检测到并重新填充您的缓存。
  • 从第一点开始,如果您通过例如在 JSON 文件的 URL 中包含基于哈希的版本控制来解决此问题,则每次更改该 URL 时,您最终都会安装一个新的 service worker。这本身并不是一件坏事,但是如果您的 Web 应用程序中有逻辑可以监听 Service Worker 生命周期事件,则需要牢记这一点。

  • 替代方法

    您还可能会发现从主页上下文中将文件添加到缓存更容易,因为支持缓存存储 API 的浏览器通过 window.caches 公开它。 .预缓存 install 中的文件不过,Service Worker 的处理程序确实具有确保在 Service Worker 安装之前成功缓存所有文件的优势。

    另一种方法是将状态信息从 window 写入 IndexedDB。上下文,然后从 Service Worker 的 install 中的 IndexedDB 读取处理程序。

    关于javascript - 在 `install` 之前将状态信息传递给服务人员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44424709/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com