RN分包
react-native 的热更新是很多开发者特别需要的功能,也是不少人选择 RN 的原因之一。有些分包方案已经不在维护或者被更好的方案给替代了,目前首推的是 RN 官方推荐的分包方案:metro。
metro
目前,最好的 RN 分包方案还是 facebook 官方提供的metro,此方案是 fb 在 0.50 版本引入的,并随着 RN 版本的迭代不断完善。也即是说,只要你使用的是 0.50 以上的 RN 版本,就可以使用 metro 进行差分包进行热更新。
官方配置内容比较多,我们分包需要用的选项主要是两个:
createModuleIdFactory
:这个函数传入要打包的 module 文件的绝对路径,返回这个 module 在打包的时候生成的 id。processModuleFilter
:这个函数传入 module 信息,返回一个 boolean 值,false 则表示这个文件不打入当前的包。
基于 react native 的 metro bundler 的配置化开发来处理分包,支持 iOS 和 Android,支持远程加载,metro bundler 为官方打包的工具,使用官方分包方法更灵活稳定,比网上的一些方法更实用可靠。
支持 debug、可选模块路径或者递增 id 作为模块 id
metro 官方:https://facebook.github.io/metro/
由于采用的是官方 metro 拆包,理论上日后的 rn 版本无需修改就能兼容。iOS 和 Android 都有加载多 bundle 实例,经测试稳定可靠。
react-native-multibundler
github 地址:https://github.com/smallnew/react-native-multibundler
demo 使用说明
- 进入项目文件夹:npm install
- android:使用android studio打开android项目 iOS:使用xcode打开iOS项目
- 直接运行android或iOS项目,jsbundle包已经事先打好
如何接入原有项目
android
- 拷贝除了demo文件夹下的所有代码文件到项目
- 根据自己的需要自定义platformDep.js和platform57.config.js,这里确定基础包包含的js module
- 根据自己的需要确定你的业务入口js和buz57.config.js,这里确定业务包包含的js代码
- 打包:根据底下给出的打包命令打包
- 业务的UI入口使用继承自AsyncReactActivity的activity,重写getScriptPath和getScriptPathType确定业务bundle路径,重写getMainComponentName确定加载的业务module
- 根据需要事先加载基础包,如果没有事先加载基础包,AsyncReactActivity会自动加载,加载基础包代码如下
ReactInstanceManager reactInstanceManager = ((ReactApplication)getApplication()).getReactNativeHost().getReactInstanceManager();
reactInstanceManager.createReactContextInBackground();//这里会先加载基础包platform.android.bundle,也可以不加载
- 重写ReactApplication返回基础包的位置
iOS
- 暴露RCTBridge的executeSourceCode方法,做法为将本项目中的RCTBridge添加到自己的工程 2~4. 与android的做法一样,见上方