Обновление Angular 8 устраняет ленивую загрузку модулей

У меня есть приложение, которое изначально было разработано с помощью Angular 6 и отлично работает в продакшене более двух лет. На этой неделе я начал постепенно обновлять его до последней стабильной версии с помощью руководств по обновлению Angular.

Переход с 6 на 7 прошел безупречно, но пытаться перейти с 7 на 8 было больно. Следование руководству прошло хорошо; единственное, что мне пришлось не включить в руководство, это отойти отng4-loading-spinner к ngx-loading-spinner. Приложение компилирует и загружает активные модули без проблем, но все ленивые загруженные модули (те, к которым я могу перейти без входа в систему) выдают исключение "BrowserModule уже загружен".

Я нашел здесь все связанные вопросы и ответы только об импорте BrowserModule один раз и даже удалил несколько импортированных из моего модуля приложения, которые могли импортировать BrowserModule также (включая ngx-loading-spinner).

Вопросы:

  1. Есть ли известная проблема с обновлением с 7 до 8, разрешение которой ускользает от меня?
  2. Если нет, как я могу найти виновного?

Трассировки стека:

Error: BrowserModule has already been loaded. If you need access to common directives such as NgIf and NgFor from a lazy loaded module, import CommonModule instead.
    at new BrowserModule (platform-browser.js:4394)
    at _createClass (core.js:30461)
    at _createProviderInstance (core.js:30426)
    at initNgModule (core.js:30332)
    at new NgModuleRef_ (core.js:31561)
    at createNgModuleRef (core.js:31544)
    at Object.debugCreateNgModuleRef [as createNgModuleRef] (core.js:44911)
    at NgModuleFactory_.create (core.js:46088)
    at MapSubscriber.project (router.js:6383)
    at MapSubscriber._next (map.js:29)
    at resolvePromise (zone-evergreen.js:797)
    at resolvePromise (zone-evergreen.js:754)
    at zone-evergreen.js:858
    at ZoneDelegate.invokeTask (zone-evergreen.js:391)
    at Object.onInvokeTask (core.js:39680)
    at ZoneDelegate.invokeTask (zone-evergreen.js:390)
    at Zone.runTask (zone-evergreen.js:168)
    at drainMicroTaskQueue (zone-evergreen.js:559)

2 ответа

Ответы:

  1. Я не думаю, что это известная проблема, решение которой ускользает от вас.

  2. Вы можете отследить виновника, отладив его, как показано ниже:

Вот шаги:

  • воспроизвести ошибку

  • поставить точку останова на место ошибки

  • воспроизвести это снова

  • перейти к createNgModuleRef используя Call Stack

  • проверить moduleType value и переходите прямо к этому NgModule

  • находить BrowserModule в imports массив

Вы обновили модули маршрутизации для использования нового синтаксиса?

Синтаксис Angular 7

loadChildren: 'path/your.module#YourModule'

становится синтаксисом Angular 8

loadChildren: () => import('path/your.module').then(m => m.YourModule)

Другие вопросы по тегам