RN拆包解決方案(二) bundle加載

前言

本文跟隨上一篇RN拆包解決方案(一) bundle拆分,已打出common.bundle和patch.bundle文件為前提,引入工程項(xiàng)目中

iOS原生加載流程

RCTBridge開(kāi)放私有方法

@interface RCTBridge (ReactExecuteScript)

- (void)executeSourceCode:(NSData *)sourceCode sync:(BOOL)sync;

@end

預(yù)先加載common包

在App項(xiàng)目完全啟動(dòng)完成后,可預(yù)先加載通用包仆邓,緩存到內(nèi)存中

jsCodeLocation = [[NSBundle mainBundle] URLForResource:@"common" withExtension:@"jsbundle"];
bridge = [[RCTBridge alloc] initWithBundleURL:jsCodeLocation
                             moduleProvider:nil
                              launchOptions:launchOptions];

加載業(yè)務(wù)包

當(dāng)用戶跳轉(zhuǎn)路由到某個(gè)RN頁(yè)面時(shí)加載patch部分

NSURL *jsCodeLocationBiz = [[NSBundle mainBundle] URLForResource:@"patch" withExtension:@"jsbundle"];
NSError *error = nil;
NSData *sourceBuz = [NSData dataWithContentsOfFile:jsCodeLocationBiz.path
                                         options:NSDataReadingMappedIfSafe
                                           error:&error];
[bridge.batchedBridge executeSourceCode:sourceBuz sync:NO];

需要注意的是,加載業(yè)務(wù)包的流程必須在common完全加載完畢后執(zhí)行佳魔,否則會(huì)出現(xiàn)加載異常;由于沒(méi)有提供加載完成的回調(diào)凭迹,只能通過(guò)偵聽(tīng)isLoading狀態(tài)變化來(lái)處理

dispatch_async(dispatch_get_global_queue(0, 0), ^{
  //加載common
  
  while (bridge.isLoading) {//偵聽(tīng)common加載完成
  }
  
  //...
  //加載業(yè)務(wù)包
});

綁定到視圖RCTRootView

RCTRootView *view = [[RCTRootView alloc] initWithBridge:bridge moduleName:moduleName initialProperties:nil];

由此可見(jiàn)罚屋,加載common和patch都在同一個(gè)RCTBridge容器中執(zhí)行,最終綁定到RCTRootView展示

Android原生加載流程

使用ReactInstanceManager加載基礎(chǔ)包

首先需要初始化RN的運(yùn)行環(huán)境嗅绸。加載common使公共的模塊代碼優(yōu)先執(zhí)行脾猛,不會(huì)涉及視圖的綁定渲染

jsbundleFile = "assets://common.bundle";
final ReactInstanceManagerBuilder builder = ReactInstanceManager.builder()
                .setApplication(application)
                .addPackage(new MainReactPackage())
                .setJSBundleFile(jsbundleFile);
ReactInstanceManager manager = builder.build();

按需加載業(yè)務(wù)包

通過(guò)ReactInstanceManager獲取CatalystInstance實(shí)例,此實(shí)例負(fù)責(zé)繼續(xù)加載業(yè)務(wù)包

ReactContext context = manager.getCurrentReactContext();
CatalystInstance instance = context.getCatalystInstance();

String source = "assets://patch.bundle";
((CatalystInstanceImpl)instance).loadScriptFromAssets(context.getAssets(), source,loadSynchronously);

同理鱼鸠,加載業(yè)務(wù)包需要在common加載完成后執(zhí)行

//加載common包
//...
if (!manager.hasStartedCreatingInitialContext()) {
    manager.addReactInstanceEventListener(new ReactInstanceManager.ReactInstanceEventListener() {
        @Override
        public void onReactContextInitialized(ReactContext context) {
            manager.removeReactInstanceEventListener(this);
            //...
            //加載業(yè)務(wù)包
        }
    });
    manager.createReactContextInBackground();
}

綁定到視圖

當(dāng)用戶進(jìn)入RN頁(yè)面時(shí)在activity層創(chuàng)建并顯示

reactRootView = new ReactRootView(this);
reactRootView.startReactApplication(manager, moduleName, null);
setContentView(reactRootView);

總結(jié)

RN拆包流程猛拴,最終還是要?dú)w功于 RN 基于 javascript 設(shè)計(jì)的靈活性。分步的執(zhí)行方式能夠讓我們輕松的將 Bundle 的加載蚀狰、視圖的渲染分步進(jìn)行愉昆,互不影響;

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末麻蹋,一起剝皮案震驚了整個(gè)濱河市跛溉,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌扮授,老刑警劉巖芳室,帶你破解...
    沈念sama閱讀 222,464評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異刹勃,居然都是意外死亡堪侯,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,033評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門荔仁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)伍宦,“玉大人,你說(shuō)我怎么就攤上這事乏梁〈瓮荩” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 169,078評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵掌呜,是天一觀的道長(zhǎng)滓玖。 經(jīng)常有香客問(wèn)我,道長(zhǎng)质蕉,這世上最難降的妖魔是什么势篡? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,979評(píng)論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮模暗,結(jié)果婚禮上禁悠,老公的妹妹穿的比我還像新娘。我一直安慰自己兑宇,他們只是感情好碍侦,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,001評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著,像睡著了一般瓷产。 火紅的嫁衣襯著肌膚如雪站玄。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 52,584評(píng)論 1 312
  • 那天濒旦,我揣著相機(jī)與錄音株旷,去河邊找鬼。 笑死尔邓,一個(gè)胖子當(dāng)著我的面吹牛晾剖,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播梯嗽,決...
    沈念sama閱讀 41,085評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼齿尽,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了灯节?” 一聲冷哼從身側(cè)響起循头,我...
    開(kāi)封第一講書(shū)人閱讀 40,023評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎显晶,沒(méi)想到半個(gè)月后贷岸,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,555評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡磷雇,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,626評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了躏救。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片唯笙。...
    茶點(diǎn)故事閱讀 40,769評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖盒使,靈堂內(nèi)的尸體忽然破棺而出崩掘,到底是詐尸還是另有隱情,我是刑警寧澤少办,帶...
    沈念sama閱讀 36,439評(píng)論 5 351
  • 正文 年R本政府宣布苞慢,位于F島的核電站,受9級(jí)特大地震影響英妓,放射性物質(zhì)發(fā)生泄漏挽放。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,115評(píng)論 3 335
  • 文/蒙蒙 一蔓纠、第九天 我趴在偏房一處隱蔽的房頂上張望辑畦。 院中可真熱鬧,春花似錦腿倚、人聲如沸纯出。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,601評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)暂筝。三九已至箩言,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間焕襟,已是汗流浹背陨收。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,702評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留胧洒,地道東北人畏吓。 一個(gè)月前我還...
    沈念sama閱讀 49,191評(píng)論 3 378
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像卫漫,于是被迫代替她去往敵國(guó)和親菲饼。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,781評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容