React Native 编译打包的缓存问题

时间过得真快,转眼间就2021年了,这段时间工作比较忙,但还是抽空将工作中的经验总结分享给大家,希望大家在新的一年里都能有所收获~

一、metro 的缓存机制

1、为什么要缓存

react-native 在执行 react-native start 或者 react-native bundle 命令的时候,都会有缓存。

目的其实很简单,metro 在打包的时候需要将 TSES6/7 的代码转换为 ES5 的目标代码。
那如果一个文件没有任何变更,这个时候我们就不需要去转换它了,所以 metro 设置了一套文件缓存机制来优化编译转换速度 。

2、两种缓存机制

metro 的缓存实现在 node_modules/metro-cache 中,主要有两种缓存机制:

  • 服务端缓存:HttpStore
  • 本地缓存:FileStore

服务端主要是通过服务器来缓存相关内容,优势是不用担心缓存的大小和时间限制,可以灵活的设置缓存策略,不过这个我们目前没有使用到,后期可以考虑。

metro 默认的缓存机制是 FileStore,这也是我们目前使用的缓存机制,FileStore 实际上就是将编译转换后的文件缓存起来,以便下一次编译的时候能够避免重复转换,加快编译速度。

3、FileStore 缓存原理

FileStore 缓存的原理其实很简单:

  • 缓存的key:表名 + 文件内容映射生成的 hash 值
  • 缓存的内容:转换后的文件内容

当执行转换的时候,如果发现文件的 hash 值存在,那么就说明文件内容没有发生变化,就不会去执行转换操作, 大大节省了编译时间。FileStore 为了避免 hash 碰撞,采用了分表存储,具体可以查看 FileStore.js 的源代码来了解更多。

FileStore分表缓存策略.png

二、metro 缓存到哪里去了

知道了 metro 的缓存机制,那么这个缓存到底存储在本地系统的什么位置呢?

查看 FileStore.js 源代码发现初始化 FileStore 时会传入一个 root 参数,这个 root 其实就是缓存存储的路径。所以我们只要知道 FileStore 在哪里初始化的,就能知道缓存的地址了。

FileStore构造函数.png
创建目录.png

在 start 的时候我们没有指定 metro 的配置,所以 metro 的配置都是从 node_modules/metro-config/defaults/index.js 中读取的默认配置,在这里可以看到缓存的初始化代码,如下:

cacheStores: [
    new FileStore({
      root: path.join(os.tmpdir(), "metro-cache")
    })
]

缓存路径为 os.tmpdir() 拼接上 "/metro-cache"

那这个 os.tmpdir() 是什么呢?os 是 node.js 的一个系统库,tempdir() 获取的是系统的临时目录,其值等于在 Linux 终端下执行如下命令获取的值:

echo $TMPDIR

最终得出缓存地址为:echo $TMPDIR 拼接上 "/metro-cache",大家可以自行尝试查看。

image2021-1-21_16-55-9.png

三、缓存导致的问题及解决方案

1、问题

react-native 的缓存会导致各种问题,常见的问题为更新了依赖库,团队中有的小伙伴能正常运行,有的缺报莫名其妙的错误,这是在执行 npm start 时缓存带来的问题,实际上执行 react-native bundle 打包也会有缓存问题,所以问题从大类来讲有以下两类:

1. 修改了依赖库,团队中有的小伙伴能正常运行,有的则报出莫名其妙的错误
2. react-native bundle 打包偶现 找不到 metro-cahce/T/xxxx 文件错误

这两类问题都是由于 metro 缓存导致的。

2、解决方案

既然是缓存问题,那么清除缓存就能够解决问题,有以下几种方案来清除缓存:

  1. 重启电脑tempdir 目录是一个临时目录,在重新电脑之后实际上就会被清除,所以 tempdir 目录下的 metro-cache 目录也会被清除
  2. 手动删除缓存:终端执行 echo $TMPDIR 获取 临时目录,再拼接上 metro-cache 得到缓存目录,手动删除 metro-cache 目录即可
  3. 自动删除缓存:metro打包提供了不少参数,其中就有一个清除缓存的参数,只需在执行 startbundle 时带上 --reset-cache即可自动删除缓存
react-native start --reset-cache
react-native bundle --reset-cache

删除缓存之后再次编译或者打包时都会变慢,所以一般情况下无需删除缓存。

本篇为原创文章,希望大家多多支持,转载请注明出处,谢谢~

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,117评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,328评论 1 293
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,839评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,007评论 0 206
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,384评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,629评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,880评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,593评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,313评论 1 243
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,575评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,066评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,392评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,052评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,082评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,844评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,662评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,575评论 2 270

推荐阅读更多精彩内容

  • 前言 metro是一种支持ReactNative的打包工具,我们现在也是基于他来进行拆包的。为了对bundle进行...
    LaxusJ阅读 9,392评论 1 51
  • 记录下自己在 RN 开发中遇到的一些问题。 RN 组件相关 TextInput Android 文字对齐问题 当 ...
    aJIEw阅读 2,713评论 0 3
  • 1.对于React-Native开发,仅仅有基础前端开发的知识是不够的,你还需要了解和掌握的有: • Node.j...
    glenlg阅读 477评论 0 1
  • 用到的组件 1、通过CocoaPods安装 2、第三方类库安装 3、第三方服务 友盟社会化分享组件 友盟用户反馈 ...
    SunnyLeong阅读 14,500评论 1 180
  • 久违的晴天,家长会。 家长大会开好到教室时,离放学已经没多少时间了。班主任说已经安排了三个家长分享经验。 放学铃声...
    飘雪儿5阅读 7,401评论 16 21