Как получить сервис-воркер с включенной опцией времени выполнения? - PullRequest
0 голосов
/ 06 мая 2020

Я создал lib-pwa библиотеку, которая заботится о работнике службы.

Поскольку это библиотека, я должен загружать ее в среду из клиентского приложения и не использовать определение локальной среды.

С этой целью я использую зависимость ng-environmenter в модуле библиотеки.

import { Environmenter } from 'ng-environmenter';

function serviceWorkerFactory(environmenter: Environmenter): SwRegistrationOptions {
  const isProduction: boolean = environmenter.getGlobalEnvironment().environment.production;
  return ({
    enabled: isProduction
  });
};

@NgModule({
  imports: [
    ServiceWorkerModule.register('ngsw-worker.js'),
  ],
  providers: [
    {
      provide: SwRegistrationOptions,
      useFactory: serviceWorkerFactory,
    }
  ]
})
export class LibPwaModule { }

Но я не вижу вышеуказанного регистратора при использовании библиотеки в моем клиентском приложении.

Кроме того, другой регистратор сообщает мне, что сервис-воркер этой библиотеки включен:

public checkForAppUpdate(): void {
  console.log('PWA - In checkForAppUpdate');
  if (this.swUpdate.isEnabled) {
    console.log('PWA - Update is enabled');
    this.pwaCheckForUpdateSubscription = this.swUpdate.available
      .subscribe(() => {
        console.log('PWA - Offering a new version');
        const appNewVersion: string = this.translateService.instant('app.pwa.new_version_available');
        if (confirm(appNewVersion)) {
          this.screenDeviceService.reloadPage();
        }
      });
  }
}

Похоже, что параметры SwRegistrationOptions сервис-воркера игнорируются.

Это тоже плохо, так как я хотел бы установить его параметр enabled во время выполнения.

Для информации, мое клиентское приложение имеет следующий модуль:

import { NgModule } from '@angular/core';
import { environment } from '@env/environment';
import { EnvironmenterModule, Environment } from 'ng-environmenter';

export const globalEnvironment = {
  environment: environment,
};

export const environmenter: Environment = {
  application: {},
  global: globalEnvironment
};

@NgModule({
  imports: [
    EnvironmenterModule.forRoot(environmenter),
  ],
  exports: [
    EnvironmenterModule
  ]
})
export class EnvironmentModule { }

ОБНОВЛЕНИЕ: у моего провайдера отсутствовал dependency:

deps: [Environmenter],

Оказалось, что я также не могу использовать свойство multi: true у поставщика SwRegistrationOptions вместе с другими поставщиками в том же модуле. Это приведет к ошибке: Cannot mix multi providers and regular providers

Поэтому мне пришлось зарегистрировать сервис-воркер в его собственном модуле:

function serviceWorkerFactory(environmenter: Environmenter): SwRegistrationOptions {
  const isProduction: boolean = environmenter.getGlobalEnvironment().environment.production;
  return ({
    enabled: isProduction
  });
};

@NgModule({
  imports: [
    ServiceWorkerModule.register('ngsw-worker.js'),
    EnvironmenterModule
  ],
  providers: [
    {
      provide: SwRegistrationOptions,
      useFactory: serviceWorkerFactory,
      deps: [Environmenter]
    }
  ]
})
export class SWModule { }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...