Угловой рабочий службы SwUpdate.available не срабатывает

Мне сложно интегрировать сервис-менеджера углов в мое приложение. Я последовал за гидом, и он работает до сих пор. Я могу создать ярлык на моем рабочем столе и запустить в свое приложение. Проблема в том, что мое приложение каким-то образом не обновляется. Если я изменю имя кнопки, создам приложение и помещаю его на свой сервер, приложение по-прежнему показывает старую версию, пока не нажму F5 (перезапуск приложения тоже не поможет).

Я попытался поместить следующий код в свой ngOnInot моего приложения, но это не помогло

ngOnInit() {
if (this._SwUpdate.isEnabled) {

  setInterval( () => {
    this._SwUpdate.checkForUpdate().then(() => console.log('checking for updates'));
  }, this.updateInterval);

  this._SwUpdate.available.subscribe(() => {

    console.log('update found');

    this._SwUpdate.activateUpdate().then(() => {
      console.log('updated');
      window.location.reload();
    });

  });

}

}

Приложение работает на моей машине apache2 linux. Является ли apache кэшированием чего-то или почему мое приложение не понимает, что есть новая версия?

Заранее спасибо за помощь :)

Редактировать:

Мой ngsw-config.json

{
  "index": "/index.html",
  "assetGroups": [{
    "name": "roomPlan",
    "installMode": "prefetch",
    "resources": {
      "files": [
        "/index.html",
        "/*.css",
        "/*.js"
      ]
    }
  }, {
    "name": "assets",
    "installMode": "lazy",
    "updateMode": "prefetch",
    "resources": {
      "files": [
        "/assets/**"
      ]
    }
  }]
}

Изменить 2:

Он работает, если я запускаю приложение локально, используя "http-server", но когда я копирую файлы на свой apache, он не обнаруживает обновление. На вкладке "Сеть" я вижу, что интервал работает, приложение получает новый "ngsw.json" с сервера каждые 3 секунды. Если я обновляю свое приложение, я вижу, что в ответ на "ngsw.json" есть новые значения хэш-функции. После этого браузер загружает новые "index.html" и "main. ***. Js" с моего сервера, но приложение не применяет новую версию. Согласно моему коду, он должен сказать "обновление найдено", но ничего не происходит.

Ответы

Ответ 1

Вероятно, вам нужно будет сообщить сервисному работнику проверить сервер на наличие обновлений, я обычно использую службу для этого:

export class UpdateService {

  constructor(public updates: SwUpdate) {
    if (updates.isEnabled) {
      interval(6 * 60 * 60).subscribe(() => updates.checkForUpdate()
        .then(() => console.log('checking for updates')));
    }
  }

  public checkForUpdates(): void {
    this.updates.available.subscribe(event => this.promptUser());
  }

  private promptUser(): void {
    console.log('updating to new version');
    this.updates.activateUpdate().then(() => document.location.reload())); 
  }

В вашем app-component.ts:

  constructor(private sw: UpdateService) {
    // check the service worker for updates
    this.sw.checkForUpdates();
  }


По какой-то причине, иногда Угловой не является должным образом рабочим службы. Таким образом, вы можете изменить main.ts:

Заменить:

platformBrowserDynamic().bootstrapModule(AppModule);

С:

platformBrowserDynamic().bootstrapModule(AppModule).then(() => {
  if ('serviceWorker' in navigator && environment.production) {
    navigator.serviceWorker.register('ngsw-worker.js');
  }
}).catch(err => console.log(err));

Ответ 2

При внесении изменений в ваше приложение вам понадобится активироватьUpdate (

import { SwUpdate } from '@angular/service-worker';

export class AppComponent implements OnInit {
  constructor(private swUpdate: SwUpdate) { }
  ngOninit() {
    this.swUpdate.available.subscribe(event => {
      console.log('A newer version is now available. Refresh the page now to update the cache');
    });
    this.swUpdate.checkForUpdate()
  }
}

Проверьте эту ссылку: https://angular.io/guide/service-worker-getting-started

Ответ 3

После того, как все остальные решения в стеке не сработали, я начал отлаживать угловой скрипт ngsw-worker.js. Я проследил логику обновления и оказался в методе "PrefetchAssetGroup". Я вставлял запись в журнал каждый раз, когда вызывался метод, и затем я понял, что он постоянно пытается кэшировать мой favicon.ico. Я проверил местоположение favicon.ico в моем ngsw.json и понял, что favicon там не находится. Как только я поместил значок в этом месте, все стало работать нормально.