把RN集成到现有原生项目中

上一篇文章《ReactNative初探》我们初步讲解了RN的环境搭建和helloWorld的demo,还有整个过程中所碰到的一些坑点,也提到了把RN集成到现有的原生Android项目中去,其中这块我们是按照官方文档来实现的,但是有一个问题:假如我们native开发人员本地没有搭建RN环境,那么就需要每个协作开发的native人员都去从git上下载这些node_modules这个文件夹,里面的东西非常多,如果每个native开发人员都去搭建RN环境,那么成本又是极高的,因为他们不开发RN,而且官方建议不要上传node_modules这个文件夹到git服务器:
把RN集成到现有原生项目中

感觉这个建议很显然是不可行的,因为除非native开发人员也需要去开发RN,否则装这个RN开发环境完全没必要,那么有没有什么简便的方式呢,既可以不安装RN开发环境,又可以不用拷贝整个node_modules目录,那么,今天就来教大家一个简单的方法。

首先,我们知道native开发人员不需要开发RN,那么我们只需要引用RN的离线bundle包不就可以了吗,而RN所必须的几个类都在node_modules/react-native/android这个目录下,所以我们只需要拷贝这一个目录到我们的工程下,然后在gradle里面去引用这个目录就可以了:

RN所需的部分类如下图:
把RN集成到现有原生项目中
从图中可以看到,基本上都是在com.facebook.react这个包下面的。
把RN集成到现有原生项目中

上面的assets里面就是我们的RN离线包,可以用来访问其中的资源。工程的gradle里面的配置改为如下:

maven {
            // All of React Native (JS, Android binaries) is installed from npm
            url "./node_modules/react-native/android"
        }

其实跟之前的区别不大,无非就是目录层级改变了一下,之前是父目录,现在把node_modules放到当前目录了,接下来我们直接在Android Studio中运行项目,完美~

关于打离线bundle包的一些操作,可以参考官方给出的命令:

react-native bundle --platform android --dev false --entry-file index.js --bundle-output android/app/src/main/assets/index.android.bundle --assets-dest android/app/src/main/res

参数含义如下:
-h, --help
–entry-file RN入口文件的路径, 绝对路径或相对路径
–platform [string] ios 或 andorid
–dev [boolean] 是否开发者模式,如果为false, 警告会不显示并且打出的包的大小会变小
–prepack 当通过时, 打包输出将使用Prepack格式化
–bridge-config [string] 使用Prepack的一个json格式的文件__fbBatchedBridgeConfig 例如: ./bridgeconfig.json
–bundle-output 打包后的文件输出目录
–sourcemap-output [string] 生成Source Map,但0.14之后不再自动生成source map,需要手动指定这个参数
–assets-dest [string] 打包时图片资源的存储路径
–verbose 显示打包过程
–reset-cache 移除缓存文件
–config [string] 命令行的配置文件路径

把打好的离线bundle包放到assets文件夹,然后就可以完美运行了。
这里我碰到了一个坑:Module HMRClient is not a registered callable module
把RN集成到现有原生项目中

这个错误可以参考我下面给出的参考文章,其实就是因为我们开启了Hot Reloading功能,猜测也是由于我们本地没有部署服务器,引用的只是离线包的缘故吧,这个功能其实是在开发阶段用来实时看代码效果的,相当于Android里面的布局实时预览,而不用重启应用,所以说应该是需要nodejs服务启动的,而我们用的是离线包,所以就出现了上面的错误。

参考文章: