模块注册指导原则

一直以来 AppModuleCoreModuleSharedModule 模块使用没有很明确的规范,很容易让产生乱用。Angular模块目标是为了使组件、指令、服务和管道功能块更内聚,并每一个功能区域形成独立的业务领域或实用工具的集合。

1) 分类说明


AppModule

根模块,用于引导 Angular 启动;它非常适合导入一些需要在整个应用到处需要的模块,例如:主题系统、用户主认证模块、权限模块等模块,以及一些全局性HTTP拦截器、国际化服务等。

CoreModule

核心模块只会被导入一次,它等同 AppModule,但我们更应该把它当成一个纯服务类模块,例如:消息、数据访问等。

SharedModule

我们叫它共享模块;它不应该出现 providers,因为 ShareModule 会在所有业务模块中被导入,这会导致服务被覆盖。

NG-ZORRO、@delon/abc、@delon/chart 等从版本11开始由一次性导入改成按需导入,为此 NG-ALAIN 提炼了两个文件 shared-delon.module.tsshared-zorro.module.ts 将一些整个项目经常用到的模块合并成一个叫 SharedModule 模块内,这也就是为什么需要在业务模块内第一时间导入它。虽然这种方式可以减少不必要的导入代码,但同时也会引起编译速度,因此不建议把所有组件都放进 SharedModule 内,尽可能将需要用到的模块三次以上使用才放进这里;否则务必在业务模块内自行导入。

2) 建议


AppModule

导入模块:

  • Angular 模块:BrowserModuleBrowserAnimationsModuleHttpClientModule

  • AlainThemeModule 主题系统

  • DelonMockModule Mock数据

  • AlainAuthModule 用户认证模块

  • AlainACLModule 权限模块

  • 国际化模块

包含服务:

  • Angular 国际化

  • HTTP 拦截器

  • Angular 启动服务

  • ng-zorro-antd 基础组件服务

  • @delon/abc 业务组件服务

作用: 贯穿整个应用的定义。


CoreModule

仅只留 providers 属性。

作用: 一些通用服务,例如:用户消息、HTTP数据访问。


ShareModule

包含定义:

  • 应用通用自定义业务组件

导入模块:

  • Angular 通用模块:CommonModuleFormsModuleRouterModuleReactiveFormsModule

  • ng-zorro-antd 基础组件模块

  • @delon/abc 业务组件模块

  • 第三方通用依赖组件模块

导出所有包含的模块。

不应providers 属性。

作用: 一些通用自定义、第三方组件定义,减少业务模块的导入。


业务模块

业务模块应该包括业务定义模块和路由模块。

模块

导入模块:

不应

  • 导出任何组件

  • 尽可能不要使用 providers 属性

路由模块

只包括路由的 importexports 模块。