溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Angular2的模塊架構(gòu)淺談

發(fā)布時間:2020-06-20 08:01:15 來源:網(wǎng)絡(luò) 閱讀:430 作者:jjjssswww 欄目:網(wǎng)絡(luò)安全

一、根模塊、子模塊與惰性加載


先說根模塊。一個ng2應(yīng)用至少要有一個根模塊,包含ng2自帶的BrowserModule,并聲明為引導(dǎo)模塊,在應(yīng)用啟動時將從此模塊展開。
隨著應(yīng)用的擴(kuò)大,所有的事情都在一個模塊中完成難免會變亂(某種程度上看ng1應(yīng)用就是這么做的,并且細(xì)分了控制器來拆分應(yīng)用,這其實(shí)浪費(fèi)了最頂層模塊的意義),所以自然而然能想到,可以將系統(tǒng)分為多個模塊,每個模塊都只做各自的事情而互不干擾,所以進(jìn)一步的思路就是,用來根模塊來引導(dǎo)程序并管理所有子模塊(通過路由定向以及為它們提供全局配置與服務(wù)實(shí)例),所有的具體業(yè)務(wù)就交給各個子模塊來完成。
然后會有一個問題,那就是既然系統(tǒng)已經(jīng)被這么多個子模塊瓜分了,并且這些子模塊也不可能同時全部都會被使用,也就是只有其被激活時才有用,那仍然在應(yīng)用引導(dǎo)時從根模塊加載所有子模塊必然會導(dǎo)致性能的浪費(fèi)以及拖慢執(zhí)行速度。此時惰性加載模塊就派上用場了,將一個子模塊定義為惰性加載后,只有在通過路由激活此模塊時才會開始加載此模塊(并且ng2甚至支持異步預(yù)加載,即后臺預(yù)加載懶加載的模塊,這樣當(dāng)懶加載模塊需要被加載時其實(shí)其已經(jīng)加載完成了,又加快了響應(yīng)速度)。

 


二、除了模塊之外


每個模塊都有自己的事情要做,通常包括:

  1. 引入其他模塊                                 這個在第三部分細(xì)說


  2. 聲明模塊包含的組件、指令與管道        所有的組件、指令或管道都必須依附于某個模塊,并只在此模塊中可用。


  3. 定義模塊提供的服務(wù)              服務(wù)也有自己所屬的模塊,但由于服務(wù)是全局單例的,所以只要在一個模塊中提供之后,全局都通用。注:若多個模塊同時提供了服務(wù)(通常發(fā)生在模塊間混亂的import時),一般情況下ng2能識別并只保留一個實(shí)例,但在惰性加載的模塊中則會發(fā)生不可預(yù)計(jì)的錯誤,所以一定要避免。


  4. 定義模塊將導(dǎo)出的組件、指令與管道(還可以是此模塊引入的模塊)        與(1配合使用,同樣在第三部分細(xì)說。

 

三、模塊的關(guān)聯(lián)


模塊之間一定要有共享或繼承資源的方式,不然的話每個子模塊都必須實(shí)現(xiàn)可能用到的全部功能。

比如一個消息彈窗組件,不可能每個子模塊都自己聲明一個消息組件然后使用,這樣的維護(hù)壓力很大且代碼嚴(yán)重浪費(fèi)。

此時就用到了模塊的引入和導(dǎo)出——
模塊A可以引入另一個模塊B,然后A就可以使用B中導(dǎo)出的組件、管道和指令。

Angular2的模塊架構(gòu)淺談

 

當(dāng)我們要使用系統(tǒng)指令(如ngIf、ngFor等)時,也必須引入系統(tǒng)模塊,有一個巧妙的辦法就是實(shí)現(xiàn)上圖這樣的共享模塊,在引入系統(tǒng)模塊并導(dǎo)出的同時再導(dǎo)出自定義的其他指令、組件或管道。然后所有引入了此共享模塊的子模塊就能使用這些系統(tǒng)指令和共享指令了。


有一個基礎(chǔ)的問題是服務(wù)需不需要導(dǎo)出,答案是否定的。服務(wù)不需要導(dǎo)出,因?yàn)榉?wù)是全局單例的,一旦被初始化,就已經(jīng)全局通用了,相反如果重復(fù)的導(dǎo)入提供了同一服務(wù)的模塊就可能發(fā)生問題:
B提供服務(wù)B_S,A導(dǎo)入了B,C也導(dǎo)入了B。這種情況下ng2會找到兩處B_S的提供,但ng2尚能夠?qū)⑵浔3衷谝粋€實(shí)例B_S。但若模塊C為惰性加載的模塊,在C被創(chuàng)建時,其實(shí)會重新初始化一個實(shí)例B_S,從C跳轉(zhuǎn)回到A時,又會創(chuàng)建一個B_S,來回每次跳轉(zhuǎn)都是如此,結(jié)局就會變得混亂不堪。
對于服務(wù)更好的做法是寫一個核心模塊,專門提供全局服務(wù),保證此模塊只會被根模塊引用一次,然后所有的子模塊就都已經(jīng)可以使用這些全局服務(wù)了。

 

 

四、ng2模塊體系


最后給出一套ng2項(xiàng)目構(gòu)建的體系,這也是總結(jié)歸納了ng2官網(wǎng)的推薦得出的ng2項(xiàng)目的模塊體系。

Angular2的模塊架構(gòu)淺談

 


總體思路就是:


> 1.根模塊負(fù)責(zé)全局的路由。


> 2.核心模塊負(fù)責(zé)全局服務(wù),也可以定義一些只在根模塊中使用的組件等,并只能由根模塊引入一次,不再導(dǎo)出。


> 3.共享模塊不做服務(wù)的提供,而是定義全局共享的組件等,以及幫助子模塊導(dǎo)入系統(tǒng)模塊,讓子模塊只需要導(dǎo)入此共享模塊就夠了。


> 4.子模塊內(nèi)部可以細(xì)分自己的子路由到具體的子組件,以及提供自己的服務(wù)等。


> 5.除了頁面入口模塊(即除了根模塊外的具體業(yè)務(wù)模塊)之外的其他子模塊均考慮寫成惰性加載的模塊,以提升頁面引導(dǎo)的速度減少性能浪費(fèi)。


> 6.當(dāng)需要一個比較通用的全局服務(wù)時,可以將其加入CoreModule,也可以再創(chuàng)建一個僅被根模塊引入的特性模塊。進(jìn)一步的,甚至可以將此模塊發(fā)布到npm,這就需要更強(qiáng)的編碼能力和技術(shù)積累了。


向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

a la
AI