Expo构建RN应用TestFlight资源丢失 metro.config.js配置报错排查
问题根源
你当前的metro.config.js写法有逻辑错误:虽然引入了Expo默认的metro配置,但最终导出的对象只保留了自定义修改的resolver字段,把Expo内置的静态资源打包规则、转换器配置、生产环境构建逻辑全部覆盖丢失了,构建环节自然会报「未继承@expo/metro-config」的警告,最终导致生产构建出的安装包静态资源缺失。
附带的app.json配置没有问题,assetBundlePatterns已经配置了全量资源匹配规则,不需要调整。
修复方案
- 直接替换
metro.config.js的全部内容,使用官方提供的配置合并方法做增量修改,不要手动解构只返回部分配置项,也不要用异步导出的写法(Expo构建时不会等待异步Promise解析完成再读取配置,这也是你之前明明引入了默认配置还是触发警告的核心原因):
const { getDefaultConfig, mergeConfig } = require('@expo/metro-config'); const defaultConfig = getDefaultConfig(__dirname); const customConfig = { resolver: { assetExts: [ ...defaultConfig.resolver.assetExts, // 注:png/jpg/jpeg/gif是Expo默认已支持的资源后缀,不需要重复添加 'svg', 'ttf', 'otf', 'woff', 'woff2' ], sourceExts: [ ...defaultConfig.resolver.sourceExts, // 注:jsx/ts/tsx是Expo默认已支持的源码后缀,不需要重复添加 'cjs', 'mjs', 'md', 'mdx' ] } }; module.exports = mergeConfig(defaultConfig, customConfig);
- 清除缓存后重新构建,避免旧配置缓存导致问题复现:
- 本地开发调试先执行
expo start -c清缓存重启服务 - 提交云构建时增加
--no-cache参数强制全量重新打包,比如EAS构建iOS包执行eas build --platform ios --no-cache
- 本地开发调试先执行
- 新构建出的包上传TestFlight后,静态资源丢失问题会直接修复,构建环节的metro配置警告也不会再出现。
避坑提示
后续修改metro配置时,一律使用mergeConfig方法合并自定义配置和默认配置,不要手动解构默认配置的部分字段返回,很容易遗漏Expo内置的核心构建规则,触发各种难排查的生产环境问题。
内容的提问来源于stack exchange,提问作者Logan Dallalio
相关产品推荐
相关产品推荐

