react native 基本资源发布方案 orz

460 阅读4分钟

啊,这是开头

为什么要写这个。。。首先是因为官网的文档实在不适合大多数的场景,正常情况下,不太会有一个项目是从零开始进行开发的,所以在配置完开发环境之后 使用 npx react-native init 创建的项目很难满足正常需求。。。一般来说都是混合开发不是么。。。 所以,幸运的你看到了文档里还有这个 但是!!!没看两句就会发现有这么一段话: 对于正常的项目开发来说,这个无论如何都是无法接受的事情。。。所以,有可能你会看到这个 好吧,还是存在同样的问题,对于正常的项目开发来说,很难接受自己的代码部署在别人的服务器上,而且感觉上没有必要这么麻烦吧大概 orz

所以,这种情况下只能想办法撸一个简单方案了

native 期望是个什么样子

对于 native 开发而言,在混合开发的场景下,或许更期待打开 rn 页面就像打开普通的网页链接一样,至于怎么封装肯定是原生开发的事情,感觉上使用 deep://test.xxx.rn/name?param=x 这种作为封装效果或许会好一点,如果有对应的网页链接作为降级方案的话 orz

当然这部分全是 native 的工作,热更加载缓存什么的 orz

其实 rn 是一套非常松耦合的方案,只不过由于一些问题并不能直接封装成一个类似于 webview 的组件,所以,对于 native 开发而言,其实就是要提供一套类似 webview 的 rn 的运行环境,反正能正常运行代码的话,做不做缓存优化。。。emmmmm。。最好还是做一下

在 rn 项目不考虑使用第三方组件和自定义组件的情况下,基本运行逻辑大概是这个样子

native 引入 rn 运行环境 -> rn 项目部署资源 -> 加载 rn 资源并正常展示页面

对于 rn 的开发而言,有点不太一样

下载 native 运行环境并安装(api/ipa) -> 启动 rn 项目 debug 服务 -> 通过 native 运行环境访问 debug 服务

感觉有点乱。。我也感觉有点乱。。。因为 native 的视角和 rn 的视角所需要注意的东西和需要的东西有不少的区别

比如说,对于 native 而言,rn 需要提供的只是业务级别的 jsbundle,但需要针对相关文件去做优化,对于 rn 而言,native 提供的是一个基本的运行环境,另外需要做一些打包方面的优化。。。反正就是这么个意思了。。。

所以如果采用我说的这种方案的话,react-native cli 创建的项目中 react-native run-ios/run-android 这两个脚本都是没什么用途的,需要魔改成下载打包好的 api/ipa 并且安装。。。(理论上可行)目录下的 android/ios 文件夹可以直接删了 orz

另外的话,根据自己静态服务器的特点和要求,需要和客户端协商初定打包方案,这里提供一种还没实践过的最简方案

index.json

{
    "version": "0.0.1",
    "android": {
        "jsBundle": "https://bundles.xxx.com/user/static/rn/android/jsbundle.{hash}.zip",
        "assetsBundle": "https://bundles.xxx.com/user/static/rn/android/assets.{hash}.zip",
    },
    "ios": {
   	 	"jsBundle": "https://bundles.xxx.com/user/static/rn/ios/jsbundle.{hash}.zip",
        "assetsBundle": "https://bundles.xxx.com/user/static/rn/ios/assets.{hash}.zip",
    }
}

这里需要考虑的是,如何魔改打包脚本并且生成一个类似于 mainfirst 的 json 文件(对不起这个我还在做,没有干货 orz) 剩下的就是直接当一个普通的 web 项目直接进行静态资源部署就完全 ok 了

对。。。我感觉没必要用 node 做一个服务器吧。。应该。。。

部分 android 代码

rn 本身封装的已经很好了,所以只标注一下相关函数调用时需要注意的部分

默认情况下 android dev hotload 端口为 https://10.0.2.2:8081,暂时不考虑改端口 (安卓没有提供可以方便改端口的方法)

可以通过 setJSMainModulePath 设置 hotload 的文件入口,考虑写死为 index

可以通过 setBundleAssetName 设置 rn 打底页面,或者由原生自己实现 activity 打底

可以通过 setJSBundleFile 设置下载好的文件

需要通过 startReactApplication 设置 module name,需要于 rn 项目同步设置,考虑使用如 xxxModule 区分入口

如果之后封装了 jar/arr 包。。。关键是前端封装的包 native 真的敢用吗 orz

ios 部分

本地开发的话,这部分代码就足够用了,和 android 一样注意配置权限和网络环境就行 orz

剩下的部分还在调研中 orz

结束前的分割线

所以这个文章到底说了什么?全程无干货。。。因为早期主要工作都在 native 部分。。。而 rn 的具体打包方案还在考虑 ing

就只能这个样子了,有机会的话再补充

如果有大佬可以分享下更好的方案就更好了 orz