Angular9 特性模塊分類
下面是特性模塊的五個常用分類,包括五組:
-
領域特性模塊。
-
帶路由的特性模塊。
-
路由模塊。
-
服務特性模塊
- 可視部件特性模塊。
雖然下面的指南中描述了每種類型的使用及其典型特征,但在實際的應用中,你還可能看到它們的混合體。
-
特性模塊:領域。
指導原則:
-
領域特性模塊用來給用戶提供應用程序領域中特有的用戶體驗,比如編輯客戶信息或下訂單等。
-
它們通常會有一個頂層組件來充當該特性的根組件,并且通常是私有的。用來支持它的各級子組件。
-
領域特性模塊大部分由
declarations
組成,只有頂層組件會被導出。 -
領域特性模塊很少會有服務提供者。如果有,那么這些服務的生命周期必須和該模塊的生命周期完全相同。
-
領域特性模塊通常會由更高一級的特性模塊導入且只導入一次。
- 對于缺少路由的小型應用,它們可能只會被根模塊
AppModule
導入一次。
-
-
特性模塊:路由( Routed )。
指導原則:
-
帶路由的特性模塊是一種特殊的領域特性模塊,但它的頂層組件會作為路由導航時的目標組件。
-
根據這個定義,所有惰性加載的模塊都是路由特性模塊。
-
帶路由的特性模塊不會導出任何東西,因為它們的組件永遠不會出現在外部組件的模板中。
-
惰性加載的路由特性模塊不應該被任何模塊導入。如果那樣做就會導致它被急性加載,破壞了惰性加載的設計用途。 也就是說你應該永遠不會看到它們在
AppModule
的imports
中被引用。 急性加載的路由特性模塊必須被其它模塊導入,以便編譯器能了解它所包含的組件。 - 路由特性模塊很少會有服務提供者。如果那樣做,那么它所提供的服務的生命周期必須與該模塊的生命周期完全相同。不要在路由特性模塊或被路由特性模塊所導入的模塊中提供全應用級的單例服務。
-
-
特性模塊:路由( Routing )。
指導原則:
路由模塊為其它模塊提供路由配置,并且把路由這個關注點從它的配套模塊中分離出來。
路由模塊通常會做這些:
-
定義路由。
-
把路由配置添加到該模塊的
imports
中。 -
把路由守衛和解析器的服務提供者添加到該模塊的
providers
中。 -
路由模塊應該與其配套模塊同名,但是加上“Routing”后綴。比如,"foo.module.ts" 中的
FooModule
就有一個位于 "foo-routing.module.ts" 文件中的FooRoutingModule
路由模塊。 如果其配套模塊是根模塊AppModule
,AppRoutingModule
就要使用RouterModule.forRoot(routes)
來把路由器配置添加到它的imports
中。 所有其它路由模塊都是子模塊,要使用RouterModule.forChild(routes)
。 -
按照慣例,路由模塊會重新導出這個
RouterModule
,以便其配套模塊中的組件可以訪問路由器指令,比如RouterLink
和RouterOutlet
。 - 路由模塊沒有自己的可聲明對象。組件、指令和管道都是特性模塊的職責,而不是路由模塊的。
路由模塊只應該被它的配套模塊導入。
-
-
特性模塊:服務。
指導原則:
服務模塊提供了一些工具服務,比如數據訪問和消息。理論上,它們應該是完全由服務提供者組成的,不應該有可聲明對象。Angular 的
HttpClientModule
就是一個服務模塊的好例子。根模塊
AppModule
是唯一的可以導入服務模塊的模塊。 -
特性模塊:窗口部件。
指導原則:
-
窗口部件模塊為外部模塊提供組件、指令和管道。很多第三方 UI 組件庫都是窗口部件模塊。
-
窗口部件模塊應該完全由可聲明對象組成,它們中的大部分都應該被導出。
-
窗口部件模塊很少會有服務提供者。
- 如果任何模塊的組件模板中需要用到這些窗口部件,就請導入相應的窗口部件模塊。
-
下表中匯總了各種特性模塊類型的關鍵特征。
特性模塊 | 特性模塊 | 提供者 | 導出什么 | 被誰導入 |
---|---|---|---|---|
領域 | 有 | 罕見 | 頂層組件 | 特性模塊,AppModule |
路由( Routed ) | 有 | 罕見 | 無 | 無 |
路由( Routing ) | 無 | 有(守衛) | RouterModule | 特性(供路由使用) |
服務 | 無 | 有 | 無 | AppModule |
窗口部件 | 有 | 罕見 | 有 | 特性 |