Я создал 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 { }