为何无需在Angular的App Module中导入RecipeRouting.module?
为什么无需在AppModule中导入RecipeRoutingModule?
这背后主要是Angular模块的传递导入特性,以及RouterModule中forRoot()和forChild()的设计逻辑共同作用的结果,具体拆解如下:
1. RouterModule的核心分工:forRoot() vs forChild()
RouterModule.forRoot(appRoutes):只能在根模块(AppModule)中调用一次。它会创建并提供全局单例的Router服务,同时注册根级别的路由配置,是整个应用路由系统的基础。RouterModule.forChild(routes):专门用于特性模块。它不会创建新的Router服务,而是将传入的特性路由配置注册到已存在的根Router服务实例中。也就是说,只要调用forChild()的模块最终被导入到AppModule(直接或间接),这些路由就会被添加到全局路由表中。
2. Angular模块的传递导入机制
Angular模块的依赖是可传递的:当你在AppModule中导入RecipesModule,而RecipesModule又导入了RecipeRoutingModule,那么RecipeRoutingModule中的代码(包括forChild()的调用)会被执行,对应的路由配置会自动注册到根Router服务里,不需要在AppModule中直接导入RecipeRoutingModule。
另外,RecipeRoutingModule导出RouterModule的目的,是让RecipesModule内部的组件能使用路由相关指令(比如<router-outlet>、routerLink),但AppModule已经通过AppRoutingModule(它导出了RouterModule)获得了这些能力,完全不需要重复导入。
总结
你不需要在AppModule中导入RecipeRoutingModule的原因很明确:
- 特性路由的注册逻辑通过
forChild()绑定到全局Router服务,只要包含它的特性模块被AppModule导入,配置就会生效; - Angular的传递导入机制确保了
RecipeRoutingModule的代码能被执行,无需直接导入; - AppModule已经通过
AppRoutingModule获得了RouterModule的所有导出成员,重复导入没有意义。
内容的提问来源于stack exchange,提问作者Issac Howard
相关产品推荐
相关产品推荐

