关于Angular指南中Routed NgModule与Routing NgModule的区别疑问
嘿,我太懂你这种困惑了!当初我第一次啃Angular的NgModule指南时,也在这俩概念上卡了好一会儿,咱们一步步拆解清楚~
先从你熟悉的Routing NgModule说起吧,这个其实就是你一直在用的“路由模块对”里的那个路由模块。它的核心职责就一个:专门管路由规则的配置,完全不碰业务逻辑。比如你写的UserRoutingModule,里面会定义路径和组件的映射,导入RouterModule.forChild(routes),然后导出RouterModule,让父模块(比如AppModule)能用上这些路由配置。举个实际的代码例子:
import { NgModule } from '@angular/core'; import { RouterModule, Routes } from '@angular/router'; import { UserListComponent } from './user-list.component'; import { UserDetailComponent } from './user-detail.component'; const routes: Routes = [ { path: '', component: UserListComponent }, { path: ':id', component: UserDetailComponent } ]; @NgModule({ imports: [RouterModule.forChild(routes)], exports: [RouterModule] }) export class UserRoutingModule { }
接下来就是你搞不懂的Routed NgModule——其实它就是你说的那个“领域NgModule”!只是换了个称呼而已。它的核心是封装某一块业务的所有组件、指令、管道,完全不涉及路由配置。简单说,它就是个纯业务模块,组件只能通过路由路径访问,不会被其他模块的模板直接引用(比如你不会在其他模块里写<app-user-list>)。
举个对应的例子,UserModule就是典型的Routed NgModule:
import { NgModule } from '@angular/core'; import { CommonModule } from '@angular/common'; import { UserListComponent } from './user-list.component'; import { UserDetailComponent } from './user-detail.component'; // 划重点:这里完全不导入路由模块! @NgModule({ declarations: [UserListComponent, UserDetailComponent], imports: [CommonModule] }) export class UserModule { }
核心区别&为什么要这么拆分
职责完全分离
- Routing NgModule:只干路由配置这一件事,后期要改路径、加守卫,直接改这里就行,不用碰业务模块。
- Routed NgModule:专注业务逻辑,组件、服务、业务规则都在这里,和路由完全解耦,就算哪天换个路由方案,业务模块也不用动。
加载方式不同
- Routing NgModule:会被父模块(比如AppModule)直接import,让路由规则全局生效。
- Routed NgModule:不会被任何模块直接import!它是通过路由的
loadChildren懒加载的,只有当用户访问对应的路径时,Angular才会加载这个模块,大大减少初始包的大小。比如在App路由里这么配置:const routes: Routes = [ { path: 'users', loadChildren: () => import('./user/user.module').then(m => m.UserModule) } ];
依赖关系清晰
- Routing NgModule会依赖Routed NgModule里的组件(因为路由配置要指向这些组件),但Routed NgModule完全不依赖路由模块,独立性极强,甚至可以单独拿出来复用。
对你现有做法的补充
你之前用的“主模块+路由模块对”其实就是标准的Routed(领域)+ Routing组合,只是你之前没把“领域模块”和“Routed模块”划上等号而已。如果之前你在领域模块里导入了路由模块,其实也能跑,但更规范的做法是让业务模块彻底和路由解绑,把路由配置完全交给Routing模块来管。
这样拆分下来,你的代码结构会更清晰,维护起来也省心很多~
备注:内容来源于stack exchange,提问作者technicated

