Почему некоторые из моих лениво загруженных модулей не могут быть найдены, а другие могут?

Мое приложение использует ленивую загрузку для загрузки необходимых модулей с маршрутами. Все мои модули лениво загружаются с одним и тем же маршрутом, объявленным в моем tsconfig.json. Большинство из них работает нормально, но по какой-то причине одна все еще выдает эту ошибку.

ERROR Error: Uncaught (in promise): Error: Cannot find 'TemplateModule' in '@blockframes/material'

Путь @blockframes/material объявлен в файле tsconfig.ts и относится к этому

"@blockframes/material": ["libs/material/src/index.ts"]

Другие библиотеки импортируются таким же образом, и ленивая загрузка работает для них как шарм. Самое странное здесь то, что я лениво загружаю 2 модуля из библиотеки материалов и только один работает без ошибок.

Вот мои маршруты в app-routing-module:

export const routes: Routes = [
  { path: '', redirectTo: 'layout', pathMatch: 'full' },
  {
    path: 'auth',
    loadChildren: '@blockframes/auth#AuthModule'
  },
  {
    path: 'layout',
    component: LayoutComponent,
    canActivate: [AuthGuard, OrganizationListGuard],
    canDeactivate: [OrganizationListGuard],
    children: [
      { path: '', redirectTo: 'home', pathMatch: 'full' },
      {
        path: 'organization',
        loadChildren: '@blockframes/organization#OrganizationModule'
      },
      {
        path: 'account',
        // loadChildren: '@blockframes/account#AccountModule' // TODO this fail with "Error: Uncaught (in promise): Error: Cannot find 'AccountModule' in '@blockframes/account'"
        loadChildren: 'libs/account/src/lib/account/account.module#AccountModule'
      },
      {
        path: 'home',
        canActivate: [MovieListGuard],
        canDeactivate: [MovieListGuard],
        loadChildren: '@blockframes/movie#MovieModule'
      },
      { path: 'templates',
        // loadChildren: '@blockframes/material#TemplateModule' // TODO this fail with "Error: Uncaught (in promise): Error: Cannot find 'TemplateModule' in '@blockframes/material'"
        loadChildren: 'libs/material/src/lib/template/template.module#TemplateModule'
      },
      {
        path: ':movieId',
        canActivate: [MovieActiveGuard],
        canDeactivate: [MovieActiveGuard],
        loadChildren: '@blockframes/material#DeliveryModule'
      }
    ]
  },
  {
    path: 'not-found',
    loadChildren: '@blockframes/ui#ErrorNotFoundModule'
  },
  {
    path: '**',
    redirectTo: 'not-found'
  }
];

Как видите, у меня та же проблема с @blockframes/account. Вы также можете принять к сведению, что @blockframes/material#DeliveryModule успешно загружается отложенно, даже если TemplateModule имеет ту же архитектуру, что и DeliveryModule.

Я понял, что могу изменить свои абсолютные пути на пути @blockframes (для шаблона и учетной записи), и приложение все равно будет работать после перестройки. Если я остановлю сервер и ng serve, я снова получу ошибку «Не удается найти модуль».

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

Большое спасибо за внимание, если у вас есть какие-либо вопросы по этой проблеме, я буду рад ответить на них так быстро, как смогу.


person Alvard    schedule 22.05.2019    source источник
comment
У меня была ситуация, когда у меня были проблемы с моим проектом (проект на основе @nrwl), который также не находил ленивые библиотеки. В моем случае мне пришлось включить все ленивые библиотеки в tsconfig.app.json в массив атрибутов include (что-то вроде "include": [ "**/*.ts", "../../../libs/my-lazy-load-library/src/index.ts"]   -  person julianobrasil    schedule 22.05.2019
comment
Кажется, я не могу лениво загружать два модуля из одной библиотеки на одном уровне. Например, если я прокомментирую свой @blockframes/material#DeliveryModule, мой TemplateModule больше не будет получать ошибку.   -  person Alvard    schedule 22.05.2019


Ответы (1)


Кажется, что мы не можем лениво загрузить два модуля из библиотеки продаж на одном уровне, ПО КРАЙНЕЙ МЕРЕ, с одним и тем же путем, похоже, это работает (пока кто-нибудь не найдет более элегантный способ решить эту проблему)

В tsconfig.json

"@blockframes/material": ["libs/material/src/index.ts"],
"@blockframes/template": ["libs/material/src/index.ts"]

В модуле маршрутизации приложения

@blockframes/template#TemplateModule

В качестве бонуса коллега сказал мне, что Angular 8 будет импортировать динамический импорт. Мы могли бы импортировать таким образом:

import('@blockframes/material').then(x => x.TemplateModule)

person Alvard    schedule 22.05.2019