安装react-native-mmkv后启动应用Metro崩溃EPERM报错问题咨询
问题原因
这个EPERM错误是Windows环境下的典型文件锁冲突:
- Metro启动时默认会递归扫描项目全目录的文件做依赖解析
- react-native-mmkv包含C++原生代码,Android端编译时会生成随机命名的
.tmp后缀临时so文件,这类文件生成阶段会被Gradle编译进程独占锁定 - Metro扫描到被锁定的临时文件时,没有权限读取就会直接抛出崩溃。重启Metro的临时方案能生效,是因为重启时Gradle已经完成编译、临时文件被释放/清理,不存在锁冲突了。
永久修复方案
按优先级从高到低选择即可:
- 方案1(最推荐,一劳永逸):配置Metro拦截规则,跳过原生构建中间目录扫描
打开项目根目录的metro.config.js,修改配置如下:
配置完成后执行const { getDefaultConfig, mergeConfig } = require('@react-native/metro-config'); const exclusionList = require('metro-config/src/defaults/exclusionList'); const config = { resolver: { blockList: exclusionList([ // 拦截react-native-mmkv的Android编译中间产物 /node_modules\/react-native-mmkv\/android\/build\/.*/, // 通用拦截规则,覆盖所有原生依赖的Android/iOS构建目录,避免其他库触发同类问题 /node_modules\/.*\/android\/build\/.*/, /node_modules\/.*\/ios\/build\/.*/ ]) } }; module.exports = mergeConfig(getDefaultConfig(__dirname), config);npx react-native start --reset-cache清缓存重启Metro,后续正常启动应用就不会复现问题。 - 方案2:升级依赖版本
直接把react-native-mmkv升级到2.10.0及以上版本,官方已经在库内默认配置了对应的Metro忽略规则,不需要手动修改项目配置。 - 方案3:调整启动顺序
先单独执行原生编译流程,等Android端C++代码编译完成、所有临时so文件处理完毕后,再启动Metro服务,也能避开文件锁冲突,缺点是每次新增/更新带原生代码的依赖都要注意启动顺序,便利性不如前两个方案。
内容的提问来源于stack exchange,提问作者JaRoMaster
相关产品推荐
相关产品推荐

