HMR с Angular работает как веб-работник с платформой-веб-работником - PullRequest
0 голосов
/ 02 июня 2018

Я пытаюсь реализовать приложение для веб-работников, используя platformWorkerAppDynamic и т. Д., Но у меня возникают некоторые трудности с реализацией HMR.

Если я не вызываю appModule.destroy(), то HMR фактически "работает"вроде как в том, что если я внесу изменения, то горячие обновления и правильная отрисовка.Однако после этого у меня осталось N запущенных веб-работников, где N - количество раз, когда он был перегружен.Так что, если я трижды выполню горячую перезагрузку, каждое нажатие кнопки будет действовать три раза.

И наоборот, если я использую обычный для HMR метод вызова appModule.destroy(), приложение выполняет горячую перезагрузку и повторную визуализацию, как и ожидалось., но любое последующее взаимодействие с пользовательским интерфейсом (например, нажатие кнопки) приводит к ERROR TypeError: Cannot read property 'events' of null.

Например:

import '@angular/common';
import '@angular/core';
import { platformWorkerAppDynamic } from '@angular/platform-webworker-dynamic';
import { AppModule } from '../app/app.module';
import '../polyfills.ts';

if (module.hot) {
    module.hot.accept();
    module.hot.dispose(data => {
        modulePromise.then(appModule => {
            appModule.destroy();
        });
    });
}

const modulePromise = platformWorkerAppDynamic().bootstrapModule(AppModule);

Каким будет правильный способ перезагрузить модуль веб-работника?

1 Ответ

0 голосов
/ 03 июня 2018

После долгих исследований выясняется, что проблема заключается в реализации Angular веб-работника в platform-webworker;даже после уничтожения модуля приложения два ключевых прослушивателя остаются подключенными и прослушивают теперь уничтоженный код: подписка зоны в PostMessageBusSink и прослушиватели событий в PostMessageBusSource.

Я создал проблему GitHub сподробнее:

https://github.com/angular/angular/issues/24274

...