ANALYZE_FOR_ENTRY_COMPONENTS无法在生产环境中动态加载模块

问题描述 投票:0回答:1

我正在尝试创建一个动态加载模块的模块(就像路由器一样)。目前我能够在开发环境中这样做,但我无法在生产中构建我的项目。我缩小了问题的范围,我发现问题出现在我尝试模仿路由器的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 ]

但是我一直收到这个错误:错误:在'../dynamic/dynamic.module'中找不到'DynamicModule'

如果我使用绝对或相对路径并不重要。

奇怪的是,如果我将文件重新保存在我拥有提供程序的地方,那么使用ng服务就可以了。

从路由器的来源我可以看到它应该像这样工作,但也许我错过了一些东西。

我忽略了这个很长一段时间,但现在它给我带来了错误如果我尝试为生产而构建。

可以在这里找到一个示例项目:Sample

它会将消息记录到控制台中。

TL; DR;

我试图动态加载模块而不使用@angular/router的任何功能,所以我使用ANALYZE_FOR_ENTRY_COMPONENTS,但我一直得到这个运行时错误:Cannot find module 'SomeModule' in 'path/to/some.module'。只有当我第一次运行ng serve时才会出现错误,如果我重新保存加载器部件,那么它就会消失并且一切正常。

angular typescript angular-router
1个回答
0
投票

好吧,因为没有人帮助我,我再次遇到这个问题,我找到了问题的原因和解决方案。

TL; DR:如果要动态加载模块,必须提供如下模块路径:

provide: [
    ...
    { provide: ROUTES, useValue: yourDynamicModuleRoutesArray, multi: true },
    ...
]

在您要加载的位置,您可以使用SystemJsNgModuleLoader(或其上方的抽象NgModuleFactoryLoader)来加载其路径给出的模块。

您可以在下面阅读我的疑虑和完整说明。

问题是,你必须提供@angular/router包中的ROUTES注入令牌,以便编译器能够找到你的模块路径,并为webpack的路径创建一个映射。虽然,我认为从角度来看它并不是一个很好的解决方案。因为像这样你必须提供loadChildrens作为路由如果这些模块与任何路由无关,那么你必须制作与任何东西都不匹配的路由,但它们仍然会在路由器配置中,因为编译器和路由器使用相同的InjectionToken。在我的情况下,我根本不想让这些loadChildrens出现在我的routerConfig中,这就是我自己创建自定义ModuleLoader的原因,但你也无法避免将loadChildrens添加到路由器中。

You can also see my answer here

© www.soinside.com 2019 - 2024. All rights reserved.