react-native start正常,run-android时Metro崩溃,Bare Workflow新项目复现
Windows 10下Expo Bare Workflow Android项目运行异常解决方案
故障根因
你遇到的Metro随机崩溃、createDebugExpoConfig找不到app.config、EPERM权限报错、App提示无法加载脚本等问题,本质是直接使用裸React Native CLI命令操作Expo Bare项目时,缺失了Expo CLI自带的Windows系统兼容逻辑、路径校准逻辑、Metro扫描隔离逻辑,和node_modules损坏、Gradle缓存的关系很小,所以常规的重装依赖、清理Gradle缓存操作无法稳定解决问题。之前偶尔出现“重启Metro就能用”的情况,是因为Windows下的文件占用冲突是随机触发的,并非流程完全正确。
可落地的解决步骤
1. 替换原有命令流程,避免路径和配置缺失问题
不要分开执行裸的react-native start和react-native run-android,全程使用Expo CLI的命令完成操作:
- 启动Metro服务统一用
npx expo start --dev-client,这个命令会自动加载Expo定制的Metro配置,不会无权限遍历node_modules下的expo相关模块目录,从根源减少EPERM报错 - 执行Android构建安装统一用
npx expo run:android,这个命令会自动校准项目根目录路径,不会出现Gradle脚本在错误路径下找不到app.config文件的问题
2. 配置Metro兼容Windows的文件扫描规则
Windows系统下并行运行的Metro进程和Gradle构建进程会同时访问node_modules、Expo临时目录下的文件,随机触发文件句柄占用、EPERM权限错误,导致Metro直接崩溃。打开项目根目录下的metro.config.js,补充以下配置:
const { getDefaultConfig } = require('expo/metro-config'); const config = getDefaultConfig(__dirname); // 阻止Metro扫描Gradle、Expo自动生成的临时目录,避免和Gradle进程的文件占用冲突 config.resolver.blockList = [ ...config.resolver.blockList, /\/(android\/\.gradle|expo\/node_modules\/.cache)\// ]; // 锁定Metro的监听目录为项目根目录,避免越权遍历其他路径 config.watchFolders = [__dirname]; module.exports = config;
3. 解决系统级的文件占用问题
- 将项目根目录加入Windows Defender实时扫描的排除项,关闭第三方同步工具(OneDrive、云盘客户端)对项目目录的自动同步,避免这些后台进程随机锁定项目目录下的文件
- 每次构建前如果遇到端口占用、残留进程问题,执行
npx kill-port 8081清理残留的Metro进程,不要在终端残留旧的Metro进程的情况下直接执行构建命令 - 构建安装前完全卸载模拟器/物理设备上的旧版本App,不要覆盖安装,避免旧版本App内置的Metro服务器地址和当前启动的服务不匹配,导致App打开后无法加载脚本
内容的提问来源于stack exchange,提问作者grifterXcode
相关产品推荐
相关产品推荐

