本文簡書地址:http://www.jianshu.com/p/2d89f55fc2c4
當一個App只要幾團體開發的時分,很容易就會在一個單項目中開發。但當App開發人數越來越多,甚至幾百人,十幾個不同BU都在協調開發同一個App的時分,就必需對架構停止組件化,才干方便開發。本文次要基於手機淘寶的一次架構探究:手機淘寶客戶端架構探究理論,基於此文停止的一些學習和探究,寫一篇文章給自己梳理一下。
首先,第一個問題,為何需求組件化?
假如照舊是單工程項目,或許是多工程引入同一個項目的開發,會有以下的問題:
1. 嚴重的代碼耦合
比方a模塊要跳轉b模塊的頁面,就要在a模塊的代碼中耦合b模塊的頁面代碼
2. 協同任務困難
開發工程中需求去編譯別的模塊的代碼,還容易呈現抵觸問題,引發別的問題
3. 測試效率低下
不只測試某一個功用能夠需求耦合別的模塊代碼,做回歸測試的時分業務也太多時分費事
4. 發布不夠靈敏
呈現問題定位費事,線上熱更新也困難
為理解決這些問題,所以需求重構代碼,到達組件化的目的。
組件化的方式手機淘寶組件化兩大中心:
1. 分而治之
2. 一些皆組件
拿一張ppt裡的圖:
可以看到,手機淘寶將業務都停止細粒度的拆分,拆分出的每一個局部都作為一個組件。每個組件可以獨自停止測試與調試,並且確保了單一的功用性,方便在新業務接入的時分,可以依照需求選擇相應的組件來停止添加。
關於bundle如何組合,這裡用的是CocoaPods。
CocoaPods是一個著名的IOS類庫管理工具。這裡就不詳細引見如何裝置與用CocoaPods了,感興味的可以自己去CocoaPods Guide去看一下。
經過CocoaPods可以非常方便的選擇需求的bundle包進入項目,並且最關鍵的是可以控制bundle包的版本號,選擇波動的舊版本或許新功用的老版本,防止了協同開發的時分,能夠呈現的內部問題,方便開發與測試。
從後面“手機淘寶組件化”的圖可以看出,組件化的中心層其實是容器層。
容器層次要分為兩大塊
1. 使用生命周期
2. 總線
而總線,就是中心組件之間的解耦的關鍵。
總線次要分為三塊:
1. URL
2. 服務
3. 音訊
URL應該是整個總線傳輸的中心。
模塊經過URL跳轉的的方式,來停止模塊之間的音訊傳遞。URL的用途是最多的,比方獲取相應對象,跳轉相應頁面,或許發起懇求,都可以運用URL來停止。
這裡拿蘑菇街URL跳轉的demo:MGJRouter,來停止舉例子。
MGJRouter次要就是經過各個模塊注冊相應的URL跳轉block,樹立起一層URL與block的映射關系,然後調用方經過URL去訪問block,取得後果。
經過URL的方式,調用方不需求去依賴其他模塊代碼,只需求直接調用,或許獲取相應的後果停止處置。
比方罕見的頁面跳轉問題,經過URL路由,就可以直接跳轉到相應的頁面。
首先是注冊相應的URL內容,這裡是概況頁的內容。
[MGJRouter registerURLPattern:@"mgj://detail?id=:id" toHandler:^(NSDictionary *routerParameters) {
NSNumber *id = routerParameters[@"id"];
// create view controller with id
// push view controller
}];
然後調用方只需求調用
[MGJRouter openURL:@"mgj://detail?id=404"];
就可以翻開相應的界面。
不只可以經過openURL
的方式去翻開一個URL,也可以經過objectForUrl
去經過URL獲取一個對象,然後停止操作。
服務用來補償URL無法處置或許難以處置的功用。
服務的作用次要表現在一些組件之間的功用調用,會比URL更佳通用。比方登陸,購物車等模塊的常用功用。
服務次要經過ModuleManager
,去注冊Protocol->Class的關系,取得相應的對象,停止Protocol的辦法調用。
比方登陸組件可以提供這樣的一個Protocol
@protocol User <NSObject>
+ (NSString *)getUserName;
@end
可以看到經過協議可以直接指定前往的數據類型。然後在登陸組件內再新建個類完成這個協議,假定這個類名為UserImp,接著就可以把它與協議關聯起來
[ModuleManager registerClass:UserImp forProtocol:@protocol(User)];
關於運用方來說,要拿到這個 UserImp,需求調用
Class cls = [ModuleManager classForProtocol:@protocol(User)];
拿到之後再調用
id<User> userComponent = [[cls alloc] init];
NSString *userName = [userComponent getUserName];
就可以取得用戶的用戶名了。
音訊音訊就是罕見的NSNotification相關的音訊轉發機制,在這裡做一個音訊的一致管理和分發給各個模塊,各個模塊自己去處置呼應的音訊。
總線總結總線的次要目的就是組件與組件之間的音訊傳輸的解耦。
URL是總線中最次要的運用場景,包括頁面調用與發起懇求等功用。
服務是組件間的調用方式。需求服務提供方提供與維護波動的服務接口。
音訊是在總線中停止一致管理與分發。
關於URL為中心的總線機制有以下益處:
1. 平台一致
iOS,Android經過同一個URL總線在後台停止管理與配置。
2. 自動升級
老版本解析不了URL,走老的邏輯照舊可用。新版本可以解析URL,走新的邏輯。
3. 中心分發
業務方辨別注冊自己的URL阻攔規則,配置在自己的模塊中。經過總線來中心分發呼應可以呼應的模塊停止處置。
本文次要還是依據手機淘寶客戶端架構探究理論和視頻,自創了蘑菇街 App 的組件化之路一些詳細的完成思緒,自己整理一下思緒的總結和學習。
參考材料1.手機淘寶客戶端架構探究理論
2.組件化架構漫談
3.蘑菇街 App 的組件化之路
4.iOS使用架構談 組件化方案
【iOS架構組件化】的相關資料介紹到這裡,希望對您有所幫助! 提示:不會對讀者因本文所帶來的任何損失負責。如果您支持就請把本站添加至收藏夾哦!