【问题标题】:Angular lazy loaded modules and shared model classesAngular 延迟加载模块和共享模型类
【发布时间】:2018-04-17 06:24:57
【问题描述】:

在我的应用程序中,我有很多简单的数据模型类。例如

export class Client {
   first_name: string;
   last_name: string;
   fullName(): string {
       return `${this.first_name} ${this.last_name}`;
   }
}

请注意,这不是 ClientService 提供者类。这些是在整个应用程序中使用的核心模型类。现在我想实现延迟加载的 ng 模块。 Angular docs 描述了如何共享组件、提供者、指令和管道。然而,有关于简单(非注释)类的注意事项。 Heros 示例有 an exported model class,但未在其模块之外使用。

我猜根模块应该导入所有模型类。然后功能模块应该只导入模型类声明。加载所有模块后应该有一个fullName() 方法定义。这是否意味着我应该为模型类定义一个模块?是否可以对非注释类执行此操作?

更新:我检查了 dist 目录中的文件。事实证明,客户端类方法不包含在延迟加载模块 (*.chunk.js) 中。但这是如何工作的? Angular/Webpack 如何知道哪些类应该打包到 main.bundle.js 中,哪些打包到 chunk.js 文件中?

【问题讨论】:

  • 我也有同样的问题。最后,您会在设计、清晰度、便利性和可扩展性方面推荐哪种解决方案。所有常见模型的单独共享模块是最合适的解决方案吗?我担心的是,如果我的延迟加载模块依赖于根模块中定义的模型,则它们是不可重用的。

标签: angular lazy-loading datamodel


【解决方案1】:

Webpack 进行全局应用程序源代码分析并保留 register 引用哪个类。如果一个类仅从 a lazy loaded module 引用,那么它会被打包到该延迟加载模块 (*.chunk.js) 中。

从主模块引用的公共类被打包到主包中。因此不存在于延迟加载的模块中,它们应该由主包加载。

NgModules(主加载和延迟加载)被视为依赖关系图的应用程序入口点。模型类不能被视为应用程序入口点,因此不需要注释它们(不需要额外的信息)。 Webpack 将完成解决依赖关系的所有繁琐工作。

【讨论】:

  • 其实这不是真的。在延迟加载模块中导入的共享模块包含在延迟包中:(我正在寻找一种方法来避免这种情况 - 不是关键。
  • @antoniossss 下面这句话有什么不对? “如果一个类仅从延迟加载的模块中引用,那么它会被打包到该延迟加载的模块 (*.chunk.js) 中。”
  • @GregDan。格雷格,你能详细说明一下吗?如果一个类仅从延迟加载的模块中引用,那么它在哪里打包?我能控制它吗?作者说它被打包在延迟加载的模块中,但你说这是错误的......
  • @JimbobTheSailor 我不确定误解在哪里。我说的完全一样。如果仅从延迟加载的模块中引用了一个类,则将其打包到该/该类中。这是最好的解决方案,无需更改/控制。
猜你喜欢
  • 2018-04-10
  • 1970-01-01
  • 2017-02-22
  • 1970-01-01
  • 1970-01-01
  • 2017-05-16
  • 1970-01-01
  • 2017-05-16
  • 1970-01-01
相关资源
最近更新 更多