angular - 核心、共享和功能模块中应该包含哪些内容?
问题描述
我已经阅读了很多关于这个主题的文章,但仍然无法处理这个问题。对不起,如果它是重复的,无论如何!
所以基本上,我正在从头开始构建一个 Angular 应用程序,并且我想按照最佳约定来组织我的代码。我有一个核心模块,目前包括一个通用数据访问单例服务和一个使用它的身份验证服务。我无法掌握的是,我什么时候应该做一个功能模块,什么时候该功能属于核心模块。
核心模块树:
例如,Auth 听起来像应用程序核心,但在我的情况下,它还包含一些声明(组件等),并且可能需要从共享模块中导入一些 UI 原子/分子。它是否值得一个功能模块,直接在根模块中导入?我应该让核心模块导出身份验证模块的声明吗?或者我应该分离身份验证(核心模块)的提供者并制作另一个身份验证功能模块(用于声明)?
布局模块、模态模块等也是如此。
谢谢!
解决方案
对于小型应用程序,您无需考虑这一点。但是如果应用程序足够大,你可以模块化你的应用程序。
对于具有大量路由的大型应用程序,您可以考虑延迟加载。延迟加载将有助于保持初始包大小更小,这意味着在加载应用程序时,首先只会加载核心模块。它将减少您的应用程序的初始加载时间。
核心模块
- 该模块随应用程序一起加载。
- 将包含单例项 - 在整个应用程序中仅实例化一次或仅在一个地方使用的项。
- AppModule 只会导入一次,其他功能模块不会导入此模块。
您可以将以下项目放入核心模块中(如果您认为合适,您可以放入其他项目)。
- 模型:用于多个功能模块的模型。
- 组件:身份验证、配置文件、页眉、页脚、布局、主页、错误、对话框等。
- 服务:将由多个功能模块使用的单例服务,即日志、存储、共享、模式、身份验证、文件、微调器等。
为了防止其他功能模块重新导入核心模块,您可以在 CoreModule 中添加以下构造函数:
constructor(@Optional() @SkipSelf() parentModule: CoreModule) {
if (parentModule) {
throw new Error(
'CoreModule is already loaded. Import it in the AppModule only.');
}
}
共享模块
- 包含被功能模块的组件重用和引用的常用指令、管道和组件
- 由核心模块和其他功能模块导入。
- 导入:CommonModule、RouterModule、FormsModule、ReactiveFormsModule、Material 模块和其他库模块。
- 声明:将在不同功能模块中重用的组件,即 HexadecimalCellEditorComponent。
- 出口:所有进口和申报的物品。
- 提供者:本模块不应提供任何服务。
功能模块
声明仅在该模块中使用的模型、组件、服务和其他项目。
并且对于每个功能模块,您还可以创建一个路由模块。
推荐阅读
- c++ - 为什么 const 按值结构绑定允许用户修改引用的变量?
- javascript - 我如何找到重复并添加行号/计数
- javascript - 将 :text: 替换为文件夹中我自己的 gif
- apache-flink - 失败时flink如何处理打开的事务
- javascript - Javascript 按钮 [数据]
- reactjs - react-tabs 重新渲染选项卡(或以编程方式更改选项卡)
- javascript - 仅将数组长度限制为 2 个数据
- laravel - 如何在 Laravel Lighthouse Resolver 中使用 toArray?
- ios - 除了重要的位置更新,应用程序终止后还有其他方法获取位置吗?
- reactjs - Cloudinary 和 React - 帮助我将图像 url 和相应图像的文件夹添加到同一个对象