//聯(lián)系人:石虎?QQ:1224614774?昵稱:嗡嘛呢叭咪哄
一、概念
1.為什么要組件化?
? * 組件和組件之間沒有明確的約束;
? * 組件單獨(dú)開發(fā)、單獨(dú)測試,不能揉入主項(xiàng)目中開發(fā),測試也可以針對性的測試;
? * 解決人多(更好的協(xié)作)、需求多(更好的功能模塊劃分)的問題;
? * 解決項(xiàng)目模塊間的代碼耦合問題;(堅(jiān)決抵制業(yè)務(wù)組件間代碼直接引用)
2.如何拆分組件?
? 基礎(chǔ)功能組件:(類似于性能統(tǒng)計(jì)、Networking、Patch、網(wǎng)絡(luò)診斷等)
? 按功能分庫,不涉及產(chǎn)品業(yè)務(wù)需求,跟庫Library類似
? 通過良好的接口拱上層業(yè)務(wù)組件調(diào)用;
? 不寫入產(chǎn)品定制邏輯,通過擴(kuò)展接口完成定制;
? 基礎(chǔ)UI組件:(例如下拉刷新組件、iCausel類似的組件)
? 產(chǎn)品內(nèi)通用UI組件;(各個(gè)業(yè)務(wù)模塊依賴使用,但需要保持好定制擴(kuò)展的設(shè)計(jì))
? 公共通用UI組件;(不涉及具體產(chǎn)品的視覺設(shè)計(jì), 目前較少)
產(chǎn)品業(yè)務(wù)組件:(例如圈子、1元購、登錄、客服MM等)
? 業(yè)務(wù)功能間相對獨(dú)立,相互間沒有Model共享的依賴;
? 業(yè)務(wù)之間的頁面調(diào)用只能通過UIBus進(jìn)行跳轉(zhuǎn);
? 業(yè)務(wù)之間的邏輯Action調(diào)用只能通過服務(wù)提供;
二、方案
方案一、url-block
? ?這是蘑菇街中應(yīng)用的一種頁面間調(diào)用的方式,通過在啟動(dòng)時(shí)注冊組件提供的服務(wù),把調(diào)用組件使用的url和組件提供的服務(wù)block對應(yīng)起來,保存到內(nèi)存中。在使用組件的服務(wù)時(shí),通過url找到對應(yīng)的block,然后獲取服務(wù)
下圖是url-block的架構(gòu)圖:
方案二、target-action
? ?casa的方案是通過給組件包裝一層wrapper來給外界提供服務(wù),然后調(diào)用者通過依賴中間件來使用服務(wù);其中,中間件是通過runtime來調(diào)用組件的服務(wù),是真正意義上的解耦,也是該方案最核心的地方。具體實(shí)施過程是給組件封裝一層target對象來對外提供服務(wù),不會(huì)對原來組件造成入侵;然后,通過實(shí)現(xiàn)中間件的category來提供服務(wù)給調(diào)用者,這樣使用者只需要依賴中間件,而組件則不需要依賴中間件。
下圖是casa的組件化方案架構(gòu)圖:
方案三、protocol-class
? ? 針對方案一的問題,蘑菇街又提出了另一種組件化的方案,就是通過protocol定義服務(wù)接口,組件通過實(shí)現(xiàn)該接口來提供接口定義的服務(wù),具體實(shí)現(xiàn)就是把protocol和class做一個(gè)映射,同時(shí)在內(nèi)存中保存一張映射表,使用的時(shí)候,就通過protocol找到對應(yīng)的class來獲取需要的服務(wù)。