在之前的旧版本 RN 中的 metro 暂时还不支持使用processModuleFilter 进行模块过滤;如果你 google 一下 RN 分包, 会发现很难有一篇文章详细去介绍 RN 怎么进行分包;本文将详细讲述如何进行 RN 分包;
RN 分包,在新版的 metro 中其实大多数我们只需要关注 metro 的两个 api:
首先我们来谈一谈如何给给个模块取一个 Id 名称,按照 metro 自带的 id 取名是按照数字进行自增长的:
按照这样,moduleId 会依次从 0 开始进行递增;
我们再来谈一谈processModuleFilter,一个最简单的processModuleFilter如下:
意味着 RN 的所有模块都是需要的,无需过滤一些模块;
有了上面的基础,下面我们开始着手考虑如何进行 RN 分包了;相信大家都比较清楚一般的情况我们将整个 jsbundle 分为common包和bussiness包;common 包一般会内置到 App 内;而 bussiness 包则是动态下发的。按照这样的思路下面我们开始分包;
顾名思义 common 包是所有的 RN 页面都会公用的资源,一般抽离公共包有几个要求:
按照上面的要求,一个基础的项目我们一般会react,react-native,redux,react-redux等不常更改的通用 npm 包放在公共包中;那么我们如何进行分公共包呢?一般有两种方式:
如果你按照这样的方式,相信我,你一定会放弃的。因为其有一个巨大的缺点: 需要手动处理 react/react-native 等包的依赖;也就是说不是你写了 4 个模块打包后就是这 4 个模块,有可能这 4 个模块依赖了其他的模块,所以在运行 common 包的时候,基础包会直接报错。
由此推出了第二个方案:
在根目录下建立一个公共包的入口,导入你所需要的模块;在打包的时候使用此入口即可。
注意点: 由于给公共包一个入口文件,这样打包之后的代码运行会报错Module AppRegistry is not registered callable module (calling runApplication);需要手动删除最后一行代码;
注意点:
前面谈到了公共包的分包,在公共包分包的时候会将公共包中的模块路径和模块 id 进行记录;比如:
这样在分业务包的时候,则可以通过路径的方式判断,当前模块是否已经在基础包中,如果在公共包中则直接使用对应的 id;否则使用业务包分包的逻辑;【关注尚硅谷,轻松学IT】
打包后的效果如下:
RN 如何进行动态分包及动态加载
以 Android 为例,常见会将 Cookie 使用 android 的 CookieManager 进行管理;但是我们内部却没有使用其进行管理;在 0.55 的版本的时候在初始化 RN 的时候可以设置一个 CookieProxy:
其中 ReactCookieProxyImpl是可以自己进行实现的,也可以自己控制 Cookie 如何写入 RN;
但是在最新的 RN 里面,是使用 okhttp 进行网络请求的, 且使用的是 andrid 的 CookieManager 进行管理;代码如下:
那么在 没有使用android.CookieManager 的情况下,如何给 ReactNative 注入 Cookie 呢?
我们采用的是方案二:
使用的前提是客户端已经有对应的 native 模块了
其中相对 rn 社区的版本主要修改, android 端 cookie 不能一次性设置,需要逐个设置
背景在 RN 单例模式下,每一个页面如果有使用到 window 进行全局数据的管理,则需要对数据进行隔离;业界通用的方式是使用微前端qiankun对window进行 Proxy。这的确是一个好方法,但是在 RN 中也许较为负责;笔者采用的方式是:
使用 babel 进行全局变量替换,这样可以保证对于不同的页面,设置和使用 window 即在不同的作用于下面;比如:
转义之后的代码为:
原创作者:MrGaoGang
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/70010293/viewspace-2849881/ ,如需转载,请注明出处,否则将追究法律责任。