You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Expo/yarn缓存引发莫名bug 清理时机及预防方案咨询

问题根本成因

这个问题是多层缓存叠加导致的,和代码提交本身无关:

  • 分支切换时的依赖残留:你在功能分支安装新增依赖后切回master分支时,没有清理本地node_modules目录,这些不属于master分支依赖树的包会残留在本地目录中。如果切分支时还带了未提交的零散代码改动、或者Metro打包时遍历到了残留的依赖引用,就会把开发中的bug逻辑带进打包产物。
  • Expo Metro打包缓存未失效:expo start、expo publish默认会复用之前的打包缓存提升构建速度,如果你切分支后没有主动清空缓存,缓存中留存的功能分支编译片段会被混进新的打包结果里,哪怕你本地master分支没有对应提交,最终生成的bundle也会带bug代码。
  • 端侧缓存叠加:iOS模拟器会留存之前安装的App版本、本地下载的JS Bundle资源,如果你没有重置模拟器,就算本地重新打包,模拟器也可能优先加载本地存储的旧版带bug的bundle,进一步干扰排查。

你之前执行的清理操作刚好依次覆盖了node_modules依赖残留、Yarn全局缓存、Expo打包缓存、模拟器端侧缓存四层问题,所以最终恢复正常。

预防方案
  • 分支切换后先做工作区校验:每次在功能分支和发布分支间切换后,先执行git status确认没有未提交的零散代码改动,不要带着跨分支的未暂存代码直接启动项目或者发布。
  • 发布前强制走冷启动校验:执行expo publish前不要直接复用已经开着的开发服务,先停掉现有服务,执行expo r -c清空Metro缓存后本地完整跑一遍核心流程,确认无异常再发布。
  • 配置git钩子自动校验依赖:可以给项目加post-checkout钩子,切换分支时自动比对当前分支和上一个分支的yarn.lock、package.json差异,如果存在依赖变更自动提示重装node_modules,避免手动漏操作。
需要清理缓存的具体场景

不需要每次操作都全量清缓存,只有对应场景下做针对性清理即可,避免不必要的时间消耗:

  • 切换分支后发现package.json/yarn.lock存在变更:只需要删除本地node_modules后重新执行yarn install即可,不需要清理Yarn全局缓存。只有出现lock文件和实际安装版本不匹配、装包时报完整性校验错误时,才需要额外执行yarn cache clean清理全局缓存。
  • 执行发布、打包操作前,如果之前在同一目录运行过其他分支的代码:启动命令加-c参数清空Metro打包缓存即可,不需要动依赖目录。
  • 端侧出现和本地代码逻辑不符的异常:比如改了代码后刷新不生效、出现本地代码里不存在的报错,先清空Metro缓存重启项目,如果还是异常再重置模拟器/删掉真机上的开发App重装,清理端侧留存的旧bundle。
  • 出现找不到依赖、依赖版本不符合预期的诡异报错,且已经确认package.json、yarn.lock声明完全正确时,再依次清理node_modules、Yarn全局缓存后重装。

内容的提问来源于stack exchange,提问作者Arvin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 11:36:21