SAP电商云SpartacusUI支持懒加载新功能的入口设计放在FeatureModule中。新功能通过public_api.ts向外部消费者公开公共功能。后者是从index.ts导入的,后者又从quick-order.module.ts导入内容。QuickOrderModule引入了CoreModule和ComponentsModule,这两个都是重量级的模块,需要支持延迟加载。在ng-package.json文件中,定义新函数的entryFile为public_api.ts:注意在根目录angular.json中,我们找不到快单相关的实现,说明快单不是独立的图书馆?这里解释一下快单是cart库的一部分:从这里的文件夹层级来看,也是有道理的:对于QuickOrder的新功能,它的入口并不是我们在上图中看到的QuickOrderModule,而是如图所示的那个下图QuickOrderFeatureModule,其中包含了QuickOrderRootModule的轻量级实现,上图是QuickOrderModule的重量级实现,在下面代码的第20行通过懒加载的方式导入到系统中。Root文件夹下的QuickOrderRootModule是一个非常轻量级的实现:它只包括路由设置和CMSComponent映射关系的维护。门面层通过index.ts导出:然后public_api.ts导出index.ts的全部内容:为什么要设计这个public_api.ts?使语义更清晰。此最佳实践在此处定义。public_api.ts旨在枚举和公开特定功能以供外部使用。*index.ts旨在作为默认导出机制来弃用绝对路径导入。更详细的讨论:(1)消歧:鉴于缺少“内部”修饰符和内部模块的复杂性增加,需要多个index.ts存储桶文件来提供不同的内部/外部API表面。(2)AngularCLI面向用户的工具:为了提供省力的工具默认值,需要一个公共API文件标准。NG编译器不仅仅将所有TypeScript构建为JavaScript;值得注意的是,它还会根据所选的入口点进行tree-shaking。由于其他原因,默认情况下index.ts是一个糟糕的选择。(3)Angular内部代码质量:public-api是与Angular消费者的契约,必须严格控制,伴随着文档变更、新测试、兼容性评估和公告。为此,项目设置会自动拒绝导致公共api更改的代码更改。(4)Awareness/clarity/intent:我认为这是其他评论通常暗示的。从历史上看,人们将index.ts用于内部和外部的所有内容。当然,一个项目只能使用index.ts进行公共API签名,但这并不明显。更多Jerry原创文章在这里:《王子熙》:
