Expo (React Native) 随机出现Failed to load all assets错误如何解决?
问题诱因
- monorepo场景下的资产路径解析缓存异常:
expo start -ci --no-dev模式下会跳过部分开发模式的缓存校验逻辑,monorepo的软链接、跨包资产引用容易触发Metro bundler的路径哈希计算冲突,导致部分资产的预加载标记丢失。你遇到的注释文件后恢复、取消注释后不再复现的情况,本质是修改文件触发了Metro的局部缓存刷新,临时修正了路径哈希冲突,全量编译时问题会再次触发。 - 非确定性资产加载顺序:当项目中存在动态导入的图片、字体等静态资源,且资源总数量超过Metro默认的批量加载阈值时,偶发会出现部分资源加载超时未被计入已加载列表,触发报错。
- 隐藏的资产引用错误:部分被Tree Shaking标记为待移除的代码中如果存在无效资产引用,在
--no-dev模式下Tree Shaking的执行时机和开发模式不同,偶发会把无效引用纳入资产加载队列,加载失败后触发全局报错。
排查解决步骤
- 首先配置Metro开启资产加载日志,在项目
metro.config.js中添加如下配置,复现问题时可定位到具体加载失败的资产:
module.exports = { resolver: { // 适配monorepo软链接路径解析,同时打印资产加载日志 resolveRequest: (context, moduleName, platform) => { if (moduleName.startsWith('asset://')) { console.log('Attempting to load asset:', moduleName) } return context.resolveRequest(context, moduleName, platform) } }, serializer: { // 禁用资产批量加载,降低超时概率 experimentalSerializerHook: (data) => { if (data.type === 'asset') { data.async = false } return data } } }
- 调整启动命令参数,规避多进程编译冲突:将原启动命令替换为
expo start -ci --no-dev --max-workers 1,单进程编译可避免多进程并行统计资产时的计数偏差。 - 显式配置资产扫描路径:针对monorepo场景,在
app.json中添加所有跨包资产的扫描规则,避免Metro漏扫资源:
{ "expo": { "assetBundlePatterns": [ "**/*", "../packages/*/assets/**/*" ] } }
- 验证压缩阶段问题:添加
--minify false参数启动测试,如果报错不再出现,说明是压缩阶段丢失了资产引用,直接升级expo和metro-minify-terser到最新稳定版即可修复。
内容的提问来源于stack exchange,提问作者Ben
相关产品推荐
相关产品推荐

