将大型应用拆分为模块的推荐方法和权衡是什么?
特别是,我会尽量避免循环依赖,我会尽量确保组件和服务只在一个模块中声明一次。
如果不遵循这些做法会有什么影响?
如果模块A(根模块)导入模块B和C,并且模块B和C都提供了服务S,那么在运行时是否存在两个服务S实例。
如果模块B提供S的一个实现而模块C提供另一个实现,会发生什么。这是否有效,或者我们是否会在第二次服务注册被第二次服务注册覆盖的情况下获胜。
答案 0 :(得分:2)
正如@HarryNinh和@DeborahK建议的那样,官方docs是我发现的关于拆分模块的最佳文章。这只是一种分割模块的规定方式,如果有需要,可以随意偏离它。 我之前遇到同样的问题,最后我以这种方式拆分模块。 (这很大程度上受官方文档和我自己的经验影响)
AppModule或根模块 - 这是角度首先加载的模块。我尝试使其尽可能小,并从此处导入其他模块,如SharedModule和CoreModule。
共享模块 - 此模块是您在许多地方放置所需模块的地方。例如,如果您经常发现需要使用FormsModule,请将其放在此处。根据我的经验,另一个例子是我尽可能地懒得加载我的一些组件,我发现自己重复了像FormsModule这样的导入。另一个例子是如果你使用UI框架,例如angular / material或ng-bootstrap,你应该把它放在SharedModule中,以防止从延迟加载的模块重复相同的导入。您可以从FeatureModules中导入此内容。我知道你可能想知道是否有重复的模块导入。好好取自官方文档
如果我导入两次相同的模块怎么办?
这不是问题。当三个模块全部导入Module' A'时, Angular评估模块' A'曾经,它第一次遇到它, 并且不会再这样做了。
核心模块 - 这是您将提供商用于需要单个实例的服务的地方。理想的候选人是您有 AuthService 或某些数据服务。这应该只需 在AppModule中导入一次。
功能模块 - 这是您将组件和服务与相关功能放在一起的地方。通常你从AppModule导入它,但我个人倾向于不这样做,因为我想尽可能地延迟加载。
希望这有帮助。