本文做者:yanxin1563git
本文做者:github
GuoJin-基礎小程序
組件化是一個老生常談的涉及面很廣的話題,即不是作好一件事而是作好一系列的事情才能達成;其中包含組件化框架在內的各架構層級、構建系統、依賴管理系統、以及配套的防劣化機制與規則規範。瀏覽器
本文主要基於百度App背景、目標和組件化歷程來說述保障並行開發和組件複用的手段,儘可能避免過多發散到構建系統、依賴管理系統,以及組件化框架這樣的具體子方向。組件化的重要性取決於應用規模、團隊規模、產品技術目標;所述內容雖然是從iOS平臺出發,但方法論與實現路徑適用於大部分平臺。微信
另外啓動速度、體積等准入流程的約束;以及目標的多樣性也是大型App複雜度來源因素;由背景產生的目標是天生的技術需求,除此以外,百度App在不一樣階段有不一樣的產品技術目標。架構
這一時期,百度App瀏覽器角色較重,你們都在一個工程裏開發,各業務和基礎邏輯交錯,沒有邊界,你中有我、我中有你;UI架構比較複雜,每一個RD都要從App主入口開始看懂主流程代碼,當心翼翼的開發。框架
這一時期的架構是這樣:工具
這一時期的主要問題有:組件化
雖然當時團隊規模只有幾十人,但已經意識到了組件化的重要性;接入業務逐步變多,同時也有部分技術組件對外輸出的需求;這一階段:性能
這一時期的架構是這樣:
這一時期的主要問題有:
這一時期重點建設了組件化框架(Pyramid、SchemeRouter)與分發框架(RemoteConfig、PMS、預取分發),及數據拆分框架(CocoaSetting);進一步保障了各組件能作到邏輯、數據各有歸屬;
這一時期的架構是這樣:
隨着百度App組件化程度的提升,主工程逐步殼化,沉澱了大批通用服務;這一時期團隊高速發展,加入了多倉庫和構建系統的支撐(EasyBox)。
這一時期的架構是這樣:
這一時期,組件化框架相對完善,各組件已能作到邏輯、資源、數據各有歸屬。主工程進一步被弱化;
層級更加明確清晰,遊離與基礎庫層和業務組件層間的通用服務有了歸屬;組件能夠自下而上的對外輸出;
整個App經過中央倉庫的組件列表(Central Repo Specs),通過EasyBox組裝整個工程;
框架容器加載及系統事件分發統一到輕量級的AppLauncher;
對接入SDK,按架構層級屬性歸屬;如僅被某一個業務組件引用,則有這個業務組件負責管理,下降對外的複雜度;
服務層可共享服務相對完善。
中臺化的大潮滾滾而來,除雲端一體化複用外,對組件化也提出了其餘的更高要求。共享組件庫+構建系統(EasyBox)協力,已能達到矩陣產品組合輸出能力。
自下而上的組件化建設
1.沒有防修改機制,業務侵入成本低;
2.交叉依賴問題:同一基礎依賴的邏輯歸屬到同一組件裏
基礎庫要在無業務侵入的狀況下通過必定程度的抽象到架構底層,二進制化實行組件負責人制度,並進行體系化建設避免上述問題。
2.三方庫主要存在如下問題:
1.沒有防修改機制,業務侵入成本低;
2.三方庫在必定用戶規模或業務規模下,確實存在bug,而github的push request不及時或無響應;
全部三方庫更新到最新發布版並二進制化避免業務侵入;差別部分明確修改點,經過運行時單獨打補丁;對外輸出時,明確這一點。
爲避免各組件對共有邏輯、共有數據集中式處理,創建容器及分發機制來分發事件、數據、以及邏輯調用。
1.Pyramid組件化框架:
1.這裏主要講Pyramid框架的分發做用,Pyramid將系統事件分發給各子組件;
2.除此以外,組件化框架還有另外兩個做用:
1)Pyramid框架組件間通訊:adapter一對一方式解耦升級爲一對多解耦;
2)它將組件間的強依賴轉變爲弱依賴,這讓技術組件對外輸出時,被依賴的組件具備某種程度的可替代性;
2.端能力:
1.分離SchemeRouter與SchemeHandler邏輯,SchemeRouter歸屬服務層組件化框架,SchemeHandler歸屬各組件;
2.因爲Scheme參數不夠明確清晰,在百度App中Scheme主要用於和H5的通訊,較少用於頁面路由;
3.配置分發服務:將集中解析並調用各業務處理邏輯改造爲分發機制,並最終升級爲雲控服務;
4.數據拆分服務:配合配置分發服務,將數據拆分到各組件內部管理;
5.資源/預取分發服務:創建資源/預取分發服務;
6.框架容器:經過Tab導航容器、棧式導航容器將各控制器UI數據拆分到各子控制器、事件分發傳遞給各子控制器;
分發與隔離機制、容器機制是並行開發的重要保障。
多業務調用的低依賴組件去業務化抽象成通用服務:帳號、分享、雲控、統計、性能、AI等
創建組件模型,各業務模塊快速組件化。
按照組件模型,肯定業務的功能範圍、邏輯與接口邊界,快速組件化。
組件接口變動、依賴變動、Warning數變化都會記錄通知相關負責人,這些在Tekes平臺管理;敬請繼續關注後續公衆號文章;沒有防劣化機制,填坑速度永遠比不上挖坑速度;一人填坑的速度也永遠比不上多人挖坑速度。
吳軍博士在《文明之光》一書中評價希臘人對世界文明的貢獻這樣寫到:近代天然科學的不少體系都是在古希臘時代奠基的,希臘人在學術研究上有別於東方文明之處不在於一兩項科學發明和發現,而在於他們將天然科學各學科分門別類,對每個學科都創建起一整套系統的體系,在此基礎上,演繹或概括出廣泛規律性,即定理或定律,繼而成爲天然科學各個學科的基石和支柱。
雖然沒有這樣的高度,但對軟件開發來說,也有殊途同歸的做用。
"本身"得來終覺淺,引用一段話做爲結語,節選自《每一個架構師都應該研究下康威定律》
架構的目標是用於管理複雜性、易變性和不肯定性,以確保在長期的系統演化過程當中,一部分架構的變化不會對架構的其它部分產生沒必要要的負面影響。這樣作能夠確保業務和研發效率的敏捷,讓應用的易變部分可以頻繁地變化,對應用的其它部分的影響儘量的小。
---------------------------------
在微信-搜索頁面中輸入「百度App技術」,便可關注微信官方帳號。