2017-08-31 41 views
0

我想创建一个模块,以动态地加载模块(如路由器一样)。目前,我能够在开发环境这样做,但我不能建立我的生产项目。我缩小的问题,我发现这个问题是地方在那里我试图模仿路由器的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 ]ANALYZE_FOR_ENTRY_COMPONENTS在生产中不工作负载动态地模块

但我不断收到此错误: 错误:无法在'../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,如果我重新保存装载机部分出现,然后消失,一切工作正常。

回答

0

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

TL; DR: 如果要加载的模块动态地必须提供你这样的模块路径:

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

而且要加载,你可以使用SystemJsNgModuleLoader(或它上面的抽象NgModuleFactoryLoader)加载由其路径给出的模块。

你可以阅读我的关切和下面详细说明。

的问题是,你必须从@angular/router包提供路由注入令牌编译器能够找到你的模块路径,并可以创建一个映射了其的WebPack路径。虽然,我认为从角度来看这不是一个很好的解决方案。因为这样,你必须提供loadChildrens的路线。如果这些模块不相关的任何路线,那么你不得不做出这样的不会匹配任何路线,但他们仍然会在路由器的配置里面,因为编译器和路由器使用相同的InjectionToken。在我来说,我不希望有这些loadChildrens存在于我的routerConfig可言,这就是为什么我创建的自定义ModuleLoader组件自己,但你就是无法避免加入loadChildrens到路由器也是如此。

You can also see my answer here