本文基于Weex?0.18.0版本源碼
一、什么是Module青抛?
Module 是完成一個(gè)操作的方法集合旗闽,在 Weex 的頁(yè)面中,允許開發(fā)者?require?引入蜜另,調(diào)用?module?中的方法适室,WeexSDK 在啟動(dòng)時(shí)候,已經(jīng)注冊(cè)了一些內(nèi)置的 module举瑰。
二捣辆、Module實(shí)現(xiàn)原理
1、所有的Module都需要實(shí)現(xiàn)WXModuleProtocol協(xié)議嘶居,通過WX_EXPORT_METHOD罪帖、WX_EXPORT_METHOD_SYNC導(dǎo)出方法給JS調(diào)用。
WX_EXPORT_METHOD和WX_EXPORT_METHOD_SYNC的區(qū)別是后者是同步調(diào)用,前者支持異步調(diào)用痊剖。
2卫旱、Native通過WXSDKEngine類方法+ (void)registerModule:(NSString*)name withClass:(Class)clazz注冊(cè)Module。以剪貼板模塊為例坐昙,Native通過代碼[self registerModule:@"clipboard" withClass:NSClassFromString(@"WXClipboardModule")]?注冊(cè); Weex頁(yè)面通過代碼const clipboard = weex.requireModule('clipboard')引入clipboard模塊芋忿,通過clipboard對(duì)象調(diào)用Native暴露給JS的方法setString和getString炸客。
3、Native如何注冊(cè)Module戈钢?
WXSDKEngine類registerModule實(shí)現(xiàn)細(xì)節(jié)
如上代碼痹仙,注冊(cè)模塊的實(shí)際工作交給了WXModuleFactory,WXModuleFactory維護(hù)了一個(gè)模塊名到WXModuleConfig的字典殉了,WXModuleConfig類通過registerMethods遍歷模塊類導(dǎo)出給JS調(diào)用的方法并保存在字典asyncMethods开仰、syncMethods中;[[WXSDKManager bridgeMgr] registerModules:dict]通過調(diào)用JS方法registerModules在JS生成跟所有模塊的導(dǎo)出方法同名的方法薪铜,以便后續(xù)JS調(diào)用众弓。
WXModuleFactory _registerMethods代碼如下:
WXBridgeContext?registerModules代碼如下:
4、JS如何調(diào)用Module導(dǎo)出的方法隔箍?
在初始化JS引擎時(shí)谓娃,WXBridgeContext通過調(diào)用registerGlobalFunctions在JSContext里面注冊(cè)了callNativeModule給JS調(diào)用,如下:
JS調(diào)用Native時(shí)會(huì)把instanceId(WXSDKInstance id)蜒滩、moduleName(模塊名)滨达、methodName(方法名)奶稠、arguments(方法)、options(額外參數(shù))傳進(jìn)來弦悉,最終通過WXModuleMethod的invoke方法從WXModuleFactory查找對(duì)應(yīng)的模塊類和方法進(jìn)行調(diào)用窒典,而invoke方法最終通過NSInvocation?invoke方法來進(jìn)行調(diào)用。