React Native未使用指定entryFile,自定义入口文件被忽略求助
问题描述
在Nx monorepo环境下使用React Native 0.71.11,尝试在build.gradle中指定自定义入口文件../../src/main.tsx,但打包时始终提示找不到默认路径下的index.js,两种配置写法均未生效:
第一种配置:
project.ext.react = [ bundleAssetName: "index.android.bundle", bundleInDebug: true, bundleInRelease: true, jsBundleDirDebug: "$buildDir/intermediates/assets/debug", jsBundleDirRelease: "$buildDir/intermediates/assets/release", resourcesDirDebug: "$buildDir/intermediates/res/merged/debug", resourcesDirRelease: "$buildDir/intermediates/res/merged/release", root: "../../", entryFile: file("../../src/main.tsx"), enableHermes: true, // clean and rebuild if changing ]
第二种简化配置:
react { entryFile = file("../../src/main.tsx") }
打包时抛出错误:
Task :app:bundleReleaseJsAndAssets FAILED warning: the transform cache was reset. error The resource
/Users/usr/projects/m/m-nx-monorepo/apps/myapp/index.jswas not
found. Error: The resource/Users/usr/projects/m/m-nx-monorepo/apps/myapp/index.jswas not
found.
at /Users/usr/projects/m/m-nx-monorepo/node_modules/react-native/node_modules/metro/src/IncrementalBundler.js:274:24
at gotStat (node:fs:2637:21)
at FSReqCallback.oncomplete (node:fs:198:21) info Run CLI with --verbose flag for more details.
the transform cache was reset.
The resource/Users/usr/projects/m/m-nx-monorepo/apps/myapp/index.js
was not found.
使用版本信息:
- Gradle: 7.5.1
- react-native: ^0.71.11
解决方案
1. 配置Metro指定入口文件
Metro可能未读取Gradle的entryFile配置,在项目根目录的metro.config.js中明确指定入口:
const { getDefaultConfig, mergeConfig } = require('@react-native/metro-config'); module.exports = mergeConfig(getDefaultConfig(__dirname), { resolver: { entryFile: 'src/main.tsx', // 路径相对于metro.config.js所在目录 }, });
2. 清理缓存后重新构建
缓存可能导致配置未生效,执行以下命令清理后再打包:
# 重置React Native缓存 npx react-native start --reset-cache # 清理Gradle缓存 cd android && ./gradlew clean # 重新打包 cd android && ./gradlew bundleRelease
3. 修正Gradle中entryFile的路径写法
改用字符串相对路径替代file()方法,避免monorepo环境下的路径解析问题:
project.ext.react = [ // 其他配置保持不变 root: "../../", entryFile: "src/main.tsx", // 路径相对于root配置的目录 enableHermes: true, ]
或简化配置写法:
react { entryFile = "src/main.tsx" }
4. 调整Nx monorepo的项目配置
在项目的project.json中,确保打包命令传递正确的入口文件参数:
{ "targets": { "bundle": { "executor": "@nrwl/react-native:bundle", "options": { "entryFile": "src/main.tsx", "platform": "android", "bundleOutput": "dist/apps/myapp/index.android.bundle" } } } }
5. 校验Hermes配置(若启用)
确认android/app/build.gradle中Hermes相关编译脚本的路径,与自定义entryFile保持一致。
内容的提问来源于stack exchange,提问作者somerandomusername

