2017-10-17 78 views
2

加載兩次當我最近讀了Angular2的doc,它說是這樣的:會在模塊中延遲加載模塊

如果我導入同一模塊的兩倍?

這不是一個問題。當三個模塊全部導入模塊'A'時,Angular 對模塊'A'進行一次評估,第一次遇到它時,再次不這樣做。

這在任何A級中的導入模塊層次結構出現是真的。 >當模塊'B'導入模塊'A'時,模塊'C'導入'B',模塊'D'導入[C,B,A],然後'D'觸發'C'的評估,觸發'B'的評估,評估'A'。 當Angular在'D'中獲得'B'和'A'時,它們已經被緩存並準備好去

角不喜歡與循環引用模塊,所以不要讓模塊「A」 ......

但我假定上述在所有預先加載模塊的上下文中說明。我懷疑這是否適用於Lazy-load模塊,例如,如果AppModule和延遲加載功能模塊都導入同一模塊(例如ModuleA),ModuleA是否會加載兩次?

我想的是:ModuleA類型的兩個模塊實例將被創建時的AppModule和延遲加載模塊的加載。我的理解是否正確?有人可以幫我澄清一下嗎?先謝謝你。

回答

1

根據實驗我做了,當我導入同一模塊中的延遲加載的模塊,裝載的是延遲加載的時候,我可以看到共享模塊的構造被再次調用。所以這回答我的問題,答案是肯定的。如果有人有不同的意見,請指出。

1

目前還不清楚你的意思是「加載」。

Angular不從服務器加載兩次。在隨後的使用中,它從緩存中使用它。

如果你的意思是否多個實例在內存中創建,然後是。

懶加載的模塊創建依賴注入新的子範圍。 如果一個模塊被延遲加載的另一個模塊加載,那麼DI範圍的層次結構就沒有意義了。

RootScope (AppModule) 
    / \ 
    LazyA LazyB 
    /  \ 
    LazyC  LazyC 

如果存在的LazyC只有一個實例,這將需要LazyALazyB供應商提供給LazyC。 如果LazyB永遠不會被加載?然後添加提供者將是沒有意義的。

角度在創建範圍後也無法更新提供者。這就是延遲加載模塊引入新的子範圍的原因。他們的提供者不會被添加到RootScope,因爲它是所有非惰性加載模塊的情況。因此創建一個新的實例是唯一的方法。

在我看來,這並不會造成傷害。 除了DI範圍外,我不知道這將如何改變。