我正在尝试创建一个动态加载模块的模块(比如路由器)。目前我能够在开发环境中这样做,但我无法在生产环境中构建我的项目。我缩小了问题的范围,我发现问题出现在我尝试模仿路由器的provideRoutes功能的地方,并将ANALYZE_FOR_ENTRY_COMPONENTS添加到我的模块提供商,如下所示:
providers: [ { provide: ANALYZE_FOR_ENTRY_COMPONENTS, useValue: dynamicModules, multi: true }, { provide: DYNAMIC_MODULE_PATHS, useValue: dynamicModules }, { provide: NgModuleFactoryLoader, useClass: SystemJsNgModuleLoader }, ModuleLoaderService ]
但我一直收到这个错误: 错误:无法找到' DynamicModule'在' ../ dynamic / dynamic.module'
如果我使用绝对或相对路径并不重要。
奇怪的是,如果我将文件重新保存在我拥有提供程序的地方,则使用ng服务然后它就可以了。
从路由器的来源我可以看到它应该像这样工作,但也许我错过了什么。
我长时间忽略了这一点,但现在它给我带来了错误如果我尝试为生产而构建。
可在此处找到示例项目: Sample
它会将消息记录到控制台中。
TL; DR;
我正在尝试动态加载模块而不使用@angular/router
中的任何功能,因此我使用的是ANALYZE_FOR_ENTRY_COMPONENTS
,但我不断收到此运行时错误:Cannot find module 'SomeModule' in 'path/to/some.module'
。只有当我第一次运行ng serve
时才会出现错误,如果我重新保存加载程序部分,然后它就会消失并且一切正常。
答案 0 :(得分:0)
好的,因为没有人帮助我,我再次遇到这个问题,我找到了问题的原因和解决方案。
TL; DR: 如果要动态加载模块,必须提供如下模块路径:
provide: [
...
{ provide: ROUTES, useValue: yourDynamicModuleRoutesArray, multi: true },
...
]
在您要加载的位置,您可以使用SystemJsNgModuleLoader(或其上方的抽象NgModuleFactoryLoader)来加载其路径给出的模块。
您可以在下面阅读我的疑虑和完整说明。
问题是,你必须提供来自@angular/router
包的ROUTES注入令牌,以便编译器能够找到你的模块路径,并为webpack的路径创建一个映射。虽然,我认为从角度来看它并不是一个很好的解决方案。因为像这样你必须提供loadChildrens
作为路由如果这些模块与任何路由无关,那么你必须创建与任何路由都不匹配的路由,但它们仍然会在路由器配置中,因为编译器和路由器使用相同的InjectionToken
。在我的情况下,我根本不希望这些loadChildrens
出现在我的routerConfig中,这就是我自己创建自定义ModuleLoader的原因,但你也无法避免将loadChildrens添加到路由器中。