Почему некоторые из моих лениво загруженных модулей не могут быть найдены, а другие могут? - PullRequest
1 голос
/ 22 мая 2019

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

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

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

"@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, я снова получу ошибку «Не удается найти модуль».

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

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

1 Ответ

0 голосов
/ 22 мая 2019

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

In tsconfig.json

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

В app-routing-module

@blockframes/template#TemplateModule

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

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

...