angular - 为什么我的一些延迟加载的模块找不到而其他的可以?
问题描述
我的应用程序正在使用延迟加载来加载带有路由的必要模块。我的所有模块都使用相同的路由进行延迟加载,在我的 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
,我将再次收到无法找到模块错误。
我试图重命名我的模块,因为材料可能是关键字,但它并没有解决问题。
非常感谢您的关注,如果您对此问题有任何疑问,我将很乐意尽快回答。
解决方案
看来我们不能从同一级别的销售库中以相同的路径延迟加载两个模块,这似乎可行(直到有人找到更优雅的方法来解决这个问题)
在 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)
推荐阅读
- airflow - 无法在 Airflow UI 中暂停或取消暂停 DAG
- node.js - Puppeteer 无法将 innerText 输入到网格单元格中
- jsp - 如何将 response.sendRedirect 重定向到弹出窗口?
- elasticsearch - 在数组类型的 ElasticSearch 字段中添加分析器
- python - 如何绘制带有注释的水平堆积条
- react-native - 在现有的 React 应用上实现 Facebook、Instagram、Google 和 Apple 登录
- javascript - Javascript 日期循环错过了几个月
- ios - 为什么某些视图在小部件中显示为红色的禁止进入标志?
- java - 读取消息时,带有 FlinkRunner 的 Apache Beam 管道不会在 PubSub 上发送 ack
- batch-file - 检查连续数字文件名中的错误