1.背景
1.1 組件化目的
將一個(gè)復(fù)雜龐大的移動端工程,通過解耦重組組件的方式來提高開發(fā)效率枫耳。組件化不僅僅是把代碼分庫這么簡單乏矾,處理好各個(gè)組件之間的通信與解耦是重點(diǎn)難點(diǎn)。
1.2 組件化優(yōu)點(diǎn)
1.組件化完成后迁杨,各個(gè)組件之間不會有任何直接依賴钻心,也就是說一個(gè)組件不會import另一個(gè)組件,各個(gè)組件之間的 Podfile 也無相互顯式依賴铅协,各個(gè)組件在編譯時(shí)也是完全是解耦的捷沸。加快了編譯速度,各個(gè)組件也可以單獨(dú)開發(fā)和測試狐史。
2.組件化對代碼的封裝性痒给、合理性都有較高要求,提升開發(fā)伙伴的設(shè)計(jì)能力预皇。
3.如果有新的App需要之前類似業(yè)務(wù)功能侈玄,可快速組裝成新App。
1.3 組件化缺點(diǎn)
組件化適合在迭代了很多版本后到某一時(shí)期吟温,出現(xiàn)了一些相對獨(dú)立的業(yè)務(wù)模塊的時(shí)候再引入。但此時(shí)因?yàn)榇a時(shí)間久遠(yuǎn)突颊,之前的開發(fā)伙伴也許不在崗位了鲁豪,解耦就比較復(fù)雜。并且由于工具和流程的復(fù)雜化律秃,導(dǎo)致團(tuán)隊(duì)之間協(xié)作的成本變高爬橡,某些情況下可能會導(dǎo)致開發(fā)效率下降。
1.4 實(shí)際業(yè)務(wù)分析
fcs項(xiàng)目現(xiàn)在越來越大棒动,并且有一些大且具體的業(yè)務(wù)模塊糙申,例如啟蒙、摩比船惨、AI在線課柜裸、大課后等×蝗瘢可以考慮組件化架構(gòu)方案「硗Γ現(xiàn)在各個(gè)模塊之間有一些依賴關(guān)系,使用組件化之后各個(gè)組件就只對中間層依賴怜浅。
2.組件通信方案
業(yè)界常用組件化方案:
2.1 路由URL跳轉(zhuǎn)方案
1)App之間跳轉(zhuǎn):
使用URL Scheme(舉例: weixin:)
使用Universal Links方式铐然。使我們的App通過HTTP鏈接來啟動App
2)native和h5跳轉(zhuǎn):
通過一個(gè)URL綁定一個(gè)頁面蔬崩,移動端通過URL打開相應(yīng)前端頁面。
3)native內(nèi)
給每個(gè)類設(shè)計(jì)url搀暑,通過key(url)沥阳,找類,跳轉(zhuǎn)
2.2 服務(wù)注冊方案
每個(gè)組件提供對外的服務(wù)協(xié)議聲明自点,調(diào)用方直接調(diào)用服務(wù)接口沪袭。具有“面向協(xié)議編程”思想,優(yōu)點(diǎn)是代碼自動補(bǔ)全和編譯時(shí)檢查有效樟氢,實(shí)現(xiàn)簡單冈绊。
業(yè)界成熟的開源庫是阿里的BeeHive。
2.3 基于反射的遠(yuǎn)程調(diào)用方案
使用performSelector進(jìn)行消息傳遞埠啃,在runtime時(shí)期發(fā)送消息死宣,反射調(diào)用。缺點(diǎn)是有大量的硬編碼碴开,假如拼寫錯(cuò)誤的話毅该,在運(yùn)行時(shí)才能發(fā)現(xiàn),導(dǎo)致效率低潦牛、質(zhì)量低眶掌。
業(yè)界成熟的開源庫是CTMediator,對該方案進(jìn)行了優(yōu)化完善巴碗。
3.BeeHive 原理及實(shí)踐
github鏈接:BeeHive
(BeeHive:蜂窩朴爬。蜂窩是世界上高度模塊化的工程結(jié)構(gòu)肾筐,六邊形的設(shè)計(jì)能帶來無限擴(kuò)張的可能蒲障。
3.1 用法及代碼示例
組件側(cè)(BeeHiveBigClassExample):
1.創(chuàng)建protocol
//1. 創(chuàng)建 protocol。此protocol表示大課后組件(模塊)對外暴露的接口
class BigClassHomeViewControllerProtocol: NSObject, BHServiceProtocol {
// 接口:展示大課后首頁
static func showHomeView() {
}
}
2.創(chuàng)建impClass
//2. 創(chuàng)建 implementClass
class BigClassHomeViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
BHContext.shareInstance()?.serviceConfigName = "BeeHive.bundle/BHService"
showHomeView()
}
func showHomeView() {
print("大課后首頁该酗!")
}
}
3.設(shè)置protocol-impClass映射關(guān)系
三種方式:
1)使用BeeHive類的-[registerService:service:]
2)使用宏BeeHiveService
3)使用plist文件
該示例中是通過plist文件實(shí)現(xiàn)的:
//3. 設(shè)置protocol-impClass映射關(guān)系逸爵。使用plist文件注冊具滴,在初始化BeeHive時(shí)指定plist文件的路徑
BHContext.shareInstance()?.serviceConfigName = "BeeHive.bundle/BHService"
調(diào)用側(cè)(BeeHiveExample):
func bigClassBeeHive() {
// 調(diào)用服務(wù)
let BigClassHomeVC = BeeHive.shareInstance()?.createService(BigClassHomeViewControllerProtocol.self)
BigClassHomeVC.showHomeView()
}
4.CTMediator 原理及實(shí)踐
github鏈接: CTMediator
4.1 用法及代碼示例
組件側(cè)(CTMediatorAIClassExample)
**1.創(chuàng)建target-action****
//1. 創(chuàng)建target-action。類名必須以Target_開頭
class Target_AIClassViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
Action_ShowAIClassHome()
}
//2. action的方法名必須以Action_開頭
func Action_ShowAIClassHome() {
print("AI在線課师倔!")
}
}
2. 創(chuàng)建CTMediator的分類,為了外部調(diào)用
import Foundation
let kTarget_Module = "Target_AIClassViewController"
let kTarget_Action = "Action_ShowAIClassHome"
extension CTMediator {
func showHome() {
let viewController = self.performTarget(kTarget_Module, action: kTarget_Action, params: [:], shouldCacheTarget: false)
return viewController
}
}
調(diào)用側(cè)(CTMediatorExample)
let vc = CTMediator.sharedInstance()?.Action_ShowAIClassHome()