javascript - 缓存第一个场景的 Service Worker 策略 - 预加载屏幕

标签 javascript progressive-web-apps service-worker offline-browsing

我目前正在开发一个小型网络应用程序,它应该实现缓存的第一个场景(用户在提供wifi的基础上下载wep应用程序,然后应该能够在室外离线使用) 我没有使用任何框架,因此自己实现缓存(SW)。 由于我还在 iframe 上集成了一些 playcanvas 内容(有自己的加载屏幕),我想知道什么加载方面的总体策略才有意义。

在一个类似的项目中,我只是让服务工作人员与应用程序的(初始)加载并行下载 Assets 。 但我想到,最好实现一个更接近 native 应用程序行为的工作流程 - 意味着在服务工作人员下载过程中显示整体加载屏幕,并在此过程完成后构建/显示我的主应用程序(或确实失败 -> 强制网络场景或之前发生过 -> 离线场景)。另一种解决方案是显示非阻塞的“ Assets 仍在下载”横幅。

导致 mit 进入第二个工作流程的主要想法是:

  • SW-Loading 屏幕/横幅可以为用户提供更好的反馈:“所有资源已下载 - 我可以安全地离线”,而旧方案可能会导致问题 - 成功向用户显示第一个状态 -而一些关键文件仍然在后面下载。
  • 使用软件加载屏幕,下载过程对我来说更容易控制/理解 - 例如,软件下载和 Playcanvas 加载的并行过程变得顺序。

如果有人可以向我提供反馈/信息,那就太好了:

  • 如果我在第二种情况下走在正确的轨道上,会变得更好,或者只是开销
  • 如何/是否可以实现一个廉价的加载屏幕,例如下载 230 个文件中的 100 个或其他。
  • 针对这种情况的一般更好策略

一如既往,感谢您的提前提醒。

最佳答案

这很大程度上取决于您希望用户体验什么。底层技术可以完成您概述的任何场景。

例如,如果您想在初始 Service Worker 安装期间显示有关预缓存进度的信息,您可以通过添加以下代码来实现。

在您的 Service Worker 中:

const PRECACHE_NAME = "...";
const URLS_TO_PRECACHE = [
  // ...
];

async function notifyClients(urlsCached, totalURLs) {
  const clients = await self.clients.matchAll({ includeUncontrolled: true });
  for (const client of clients) {
    client.postMessage({ urlsCached, totalURLs });
  }
}

self.addEventListener("install", (event) => {
  event.waitUntil(
    (async () => {
      const cache = await caches.open(PRECACHE_NAME);
      const totalURLs = URLS_TO_PRECACHE.length;
      let urlsCached = 0;

      for (const urlToPrecache of URLS_TO_PRECACHE) {
        await cache.add(urlToPrecache);
        urlsCached++;
        await notifyClients(urlsCached, totalURLs);
      }
    })()
  );
});

在您的客户端页面中:

// Optional: if controller is not set, then there isn't already a
// previous service worker, so this is a "first-time" install.
// If you would prefer, you could add this event listener
// unconditionally, and you'll get update messages even when there's an
// updated service worker.
if (!navigator.serviceWorker.controller) {
  navigator.serviceWorker.addEventListener("message", (event) => {
    const { urlsCached, totalURLs } = event.data;
    // Display a message about how many URLs have been cached.
  });
}

关于javascript - 缓存第一个场景的 Service Worker 策略 - 预加载屏幕,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71263698/

相关文章:

javascript - 使用 Javascript 处理 HTML 和 Swift 之间的交互

javascript - 如何使用 Service Worker Angular 6 在后台运行 watchposition

javascript - JS Firebase : Service worker unable to nagivate

javascript - 如何从 cordova 应用程序内的外部站点获取数据?

google-chrome - 当从 Firebase 提供服务时,带有范围请求路由器的 Workbox 预缓存音频无法在 Chrome 中播放

android - gcm 推送通知,渐进式 webapp

javascript - 获取事件未收到请求 header

javascript - 如何将javascript文件导入到angular4项目中并在组件内部使用它的功能?

javascript - lodash删除嵌套数组元素的方法

javascript - 如果浏览器不支持多个,如何使用 javascript 验证 <input type=file multiple>