延迟导入UI模块/组件的最佳方法是什么

时间:2019-05-23 12:55:32

标签: angular angular-material

我目前正在遵循Angular ngModule docs中推荐的模块结构。

我的理解是,共享模块通常应包含将在整个应用程序中使用的任何指令,防护,模型和其他辅助功能。然后大多数其他模块将导入该共享模块以实现此常规功能。

然后,我见过的大多数示例还将所有UI模块导入到共享模块中。因此,例如,如果我使用的是Angular Material,我将在此处导入所有共享的UI模块。 MatInputModule,MatSelectModule,...

我的问题是,是否要延迟加载模块以减小初始捆绑包大小,并假设某些UI模块仅在一个功能模块中使用。这样,只将此UI模块而不是共享模块导入到功能模块中就有意义了。

例如。如果我的身份验证模块是唯一使用MatCardModule的模块,那么我是否应该只将其导入到身份验证模块中,而不是与共享模块中所有其他导入的MatModules一起使用?

假设答案是肯定的-如果在两个不同的功能模块中使用MatCardModule(将其导入到两个单独的模块中)仍然有意义吗? Angular是否会巧妙地处理此问题-例如,如果该模块已经被下载到一个延迟加载的模块中,它将不会再次下载第二个延迟加载的模块?

TLDR 是将仅需要的UIModule导入功能模块更好(即使这意味着您将多次导入同一个UIModule)还是保留所有您自己的UI更好将UIModules导入共享模块中,然后将共享模块导入所有其他功能模块中

1 个答案:

答案 0 :(得分:0)

这是基于我的经验的IMO

我有一个共享模块,正如您提到的,我在其中添加了所有共享组件和指令。

我创建了一个名为MyCommonModule的模块,并导入和导出了Material模块以及其他第三方模块,该模块在大多数模块中都使用 然后我在AppModule中导入MyCommonModule

在某些功能模块(例如ChartModule)中还将使用一些特定的模块,您可以专门导入该模块。

关于捆绑包的大小,如果即使您不导入模块也不使用模块,即使导入了Angular也不会通过TreeShaking阶段添加它,因此,即使您导入的所有js文件大小也将与已在应用程序范围内使用的模块一样

关于您的第二个等式,如果已经下载了模块js文件,那么angular不会再次下载