【发布时间】:2018-08-10 03:20:09
【问题描述】:
这个问题来自企业应用的上下文。
从我读过的所有书籍和网上看到的关于 Angular 应用程序的示例中,每次我们创建一个类(组件、服务、实体等)时,我们都会在类型定义中导出它们,然后直接导入它们无论两个类属于相同还是不同的角度模块,我们都需要引用(类似于在 C# 上使用命名空间)。
例如:
// In 'Commons/logger.service.ts'
export class LoggerService { ... }
// In 'Core/common.service.ts'
export class CommonService { ... }
// In 'Products/' module
import { LoggerService } from '../Commons/logger.service'
import { CommonService } from '../Core/common.service'
export class ProductComponent { ... }
我开始从事一个(大型)企业应用程序项目,并注意到一种我以前从未见过的方法,他们创建文件来收集每种类型的类(服务、实体、方法参数、组件),然后导出它们中的每一个,导出这些文件中的每一个都在其相应的角度模块文件中,然后,不是直接从类型文件导入类型,而是从给定模块执行导入。
前面的例子会变成这样:
// In 'Commons/logger.service.ts'
export class LoggerService { ... }
// In 'Commons/services.ts'
export * from './logger.service.ts'
export * from './other.service.ts'
export * from './another.service.ts'
// In 'Commons/commons.module.ts'
export * from 'services.ts'
export * from 'entities.ts'
/* ... */
// In 'Products/' module
import { LoggerService, OtherService } from '../Commons/commons.module'
export class ProductComponent { ... }
鉴于这种方法比以前的方法更冗长,并且在某些情况下会引发尴尬的结果(如果在同一模块中导入类,则会出现循环引用警告)
我的问题是:
- 从良好设计或最佳实践的角度推荐哪种方法?
- 是否建议使用这种方法而不是前者?为什么?适用于哪些情况?
- 为什么在主要的文档来源(角度在线文档、角度书籍等)中没有引入这种方法?
- 这种方法的优缺点是什么。
【问题讨论】:
-
我猜当你有循环依赖时,这种方法可以让你正确控制模块的加载顺序
-
我认为您可能想研究在您的应用程序中使用具有导入和导出功能的共享模块。然后可以根据需要将此共享模块导入其他模块。这是一些关于它的 Angular 文档:angular.io/guide/sharing-ngmodules
-
@NicholasPesa:这种方法非常适合收集常见的导入以减少重复。我在这里谈论的是我公司的内部指南,其中每当您需要一个类型时,而不是直接从其文件中导入它,您必须从其模块中导入它,同样每当您导出新类型时,您需要遵循示例中提到的所有“导出层次结构”。就我个人而言,我认为这是为了解决最初可能不存在的问题而进行的过度设计。这就是为什么我正在寻找一些专家对该主题的意见。
-
@mdarefull 我明白你现在在说什么了。我的错误是我误读了中间部分解释你的最终目标。
-
我不知道答案......但我想知道当你总是需要所有东西时,“摇树”会做什么?
标签: angular typescript ecmascript-6