Зависимости модуля Angular Lazy Loaded (обнаружен неопределенный поставщик)

avatar
user390749
8 апреля 2018 в 02:46
833
0
1

У меня есть ядро, общие и много модулей функций в приложении Angular 5. Каждый из этих функциональных модулей загружается отложенно.

Почти все они зависят друг от друга. Например, у меня есть лениво загруженный модуль message, который зависит от другого лениво загружаемого модуля (не основного, не общего) для разрешения данных маршрута.

Когда я компилирую приложение с yarn start, все работает нормально. Однако, когда я пытаюсь собрать приложение с ng build --prod и срабатывает AOT, я получаю следующую ошибку:

ОШИБКА: Обнаружен неопределенный провайдер! Обычно это означает, что у вас циклическая зависимость (может быть вызвана использованием файлов index.ts 'barrel').

Меня беспокоит тот факт, что циклические зависимости не помечаются во время сборки.

Если я создам приложение без AOT с ng build --no-aot --prod, я не получаю никаких ошибок, и все работает нормально.

Я попытался извлечь приложение из интерфейса командной строки angular, чтобы напрямую создать приложение с помощью задачи веб-пакета, но без результата или сведений о том, что происходит.

С чего начать отладку этой проблемы?

Я использую в своем приложении много файлов-баррелей. Каждый из них имеет похожую структуру (стиль, заимствованный из курса NGRX Тодда Девиза):

import { AlertsComponent } from '@alerts/containers/alerts/alerts.component';
import { AlertComponent } from '@alerts/containers/alert/alert.component';

export const containers: Array<any> = [AlertsComponent, AlertComponent];

export * from '@alerts/containers/alerts/alerts.component';
export * from '@alerts/containers/alert/alert.component';

И эти контейнеры распределены в модуле следующим образом:

import * as fromAlertsContainers from '@alerts/containers';
import * as fromCoreGuards from '@core/guards';

@NgModule({
    imports: [RouterModule.forChild(routes), SharedModule, CommonModule],
    providers: [...fromCoreGuards.guards],
    declarations: [...fromAlertsContainers.containers],
    exports: [...fromAlertsContainers.containers]
})
export class AlertsModule {}

Я делаю что-то не так? Почему он работает с yarn start и не работает с ng build --prod?

Тестирование №1: использование forwardRef в качестве исправления.

В настоящее время тестируется следующее решение. Я буду держать вас в курсе, если оно сработает или решит проблему:

@Inject(forwardRef(() => ApiService))
private apiService: ApiService

Решение!

Вот как я решил проблему.

  1. Удалены все providers из AppModule.
  2. Повторная вставка каждого из них по одному.
  3. После каждой вставки я запускал ng build --prod и ждал результата сборки.
  4. Оказывается, у меня был следующий код, который вызывал циркуляр

    зависимость: провайдеры: [ Место нахождения, {обеспечиваем: LocationStrategy, useClass: PathLocationStrategy}, { предоставить: HTTP_INTERCEPTORS, useClass: AuthTokenInterceptor, мульти: правда } ]

PathLocationStrategy необходимо Location и Location необходимо PathLocationStrategy.

Источник
Huan
10 апреля 2018 в 09:05
0

У меня такая же проблема с Ionic 3 и Angular 5.

user390749
10 апреля 2018 в 15:57
0

Знаете ли вы какой-либо способ вывести подробный журнал команды сборки? И.Е., что происходит за кулисами?

Huan
10 апреля 2018 в 16:33
0

Пока не знаю... У меня было два ngModules, написанных мной самостоятельно, все они без проблем работают в режиме JIT, но не могут скомпилироваться с помощью AOT. github.com/Chatie/db/issues/30 github.com/zixia/auth-angular/issues/1

user390749
10 апреля 2018 в 16:58
0

Вы пытались извлечь проект из CLI и построить его напрямую с помощью задачи NPM?

Huan
10 апреля 2018 в 17:01
0

Что я сделал, так это использовал скрипт npm из ionic: npm run ionic:build --prod

user390749
10 апреля 2018 в 17:09
0

Ваше приложение использует бочки (index.ts)?

Huan
11 апреля 2018 в 04:57
0

Да, я использую бочки везде. Я обнаружил, что могу исправить это, не используя бочки. Однако я хочу выяснить, почему это не работает с моими бочками. У меня есть задача отследить эту проблему по адресу github.com/Chatie/db/issues/30.

user390749
11 апреля 2018 в 11:45
0

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

Huan
11 апреля 2018 в 17:57
0

Не сдавайся! У вас есть репо, которое могло бы легко воспроизвести эту проблему? Я мог бы поискать тебя, если хочешь.

Ответы (0)