【问题标题】:Check Service worker installation progress from component (angular)从组件检查 Service Worker 安装进度(角度)
【发布时间】:2019-08-10 21:45:22
【问题描述】:

我已将我的 Angular 应用程序更新为 PWA,因为我需要在第一次启动时预加载所有资产(应用程序有很多用于 UI 的图像)。 这就是为什么我想在服务工作者安装事件期间显示某种微调器/加载栏并在完成后隐藏它。 那么第一个问题 - 是否可以从组件处理此事件?

我找到了这个示例并尝试将其添加到第一个组件中,该组件在应用启动时加载,但没有得到任何日志。所以可能它不会那样工作。

ngOnInit() {
self.addEventListener('install', event => {
    this.log("INSTALLING ");
    const installCompleted = Promise.resolve()
                        .then(() => this.log("INSTALLED"));

    event.waitUntil(installCompleted);
});

self.addEventListener('activate', event => {
    this.log("ACTIVATING");
    const activationCompleted = Promise.resolve()
        .then((activationCompleted) => this.log("ACTIVATED"));
        event.waitUntil(activationCompleted);
});

self.addEventListener('fetch', event => {
    this.log("HTTP call intercepted - " + event.request.url);
        return event.respondWith(fetch(event.request.url));
    });
}

log(message) {
    console.log(message);
}

我还有一个关于缓存资产的问题。在我的 ngsw-config.json 中,我正在使用下一个设置:

  "name": "assets",
  "installMode": "prefetch",
  "updateMode": "prefetch",
  "resources": {
    "files": [
      "/assets/**"
    ]
  }

但是当我打开第一页时,在缓存中它不会显示 /assets 中的所有图像和文件夹。不是事件的一半。可以吗?它不应该显示所有缓存的图像吗?问题是否可能是因为我正在使用延迟加载模块并且服务工作者在加载每个模块时开始缓存? 另一方面,当我切换页面时,在网络选项卡中显示每个图像都是从服务人员加载的......

谢谢

【问题讨论】:

    标签: angular service-worker progressive-web-apps angular-service-worker


    【解决方案1】:

    您可以使用此处描述的技术(链接断开)来增强您的 Angular Service Worker 行为:

    http://jakubcodes.pl/2018/06/13/enhancing-angular-ngsw/

    它基本上将一个中间脚本文件注册为服务工作者 JavaScript 文件,并在其中调用除自己的代码之外的 Angular 脚本。

    编辑

    详细过程:

    1. 在您的 src 文件夹中创建两个 js 文件(例如“sw-master.js”和“sw-custom.js”)。后者可能包含您的自定义服务工作者代码。
    2. 将这两行添加到您的“sw-master.js”(在 NGSW 脚本之前导入自定义脚本):

      importScripts('./sw-custom.js');
      importScripts('./ngsw-worker.js');
      
    3. 在项目的“angular.json”文件中注册两个新资产:

      "assets": [
        "src/favicon.ico",
        "src/assets",
        "src/manifest.json",
        "src/sw-master.js",
        "src/sw-custom.js"
      ],
      
    4. 在“app.module.ts”中注册主脚本而不是“ngsw-worker.js”:

      ServiceWorkerModule.register('/sw-master.js', { enabled: environment.production })
      

    【讨论】:

    • 仅链接的答案对网站无益。如果您链接的网站出现故障,那么这个答案将不再相关。该链接应补充提供的答案,而不是完全的答案。
    • 完成。谢谢你的提示。
    • 谢谢@MrCircuit,好主意,但在我的情况下,“安装”和“激活”事件被调用,而不是“获取”事件。当它尝试缓存所有资产时,我是否应该拦截来自 NGSW 的所有 GET 请求?
    • 我找到了一个可能的解决方案:在 sw-master.js 文件中反转脚本导入的顺序。所以我的自定义代码首先注册了事件处理程序。不知道这是否是一个安全的解决方案,它给我的印象是只允许一个 fetch 事件。并且 fetch 事件似乎并没有拦截所有请求,我只收到了一些资产请求,但不是所有的缓存
    猜你喜欢
    • 2023-02-01
    • 2017-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多