React-Native:模块AppRegistry未注册为可调用模块

160
我目前正在尝试在Android模拟器上运行ES6 react-native-webpack-server。不同之处在于,我已经升级了我的package.jsonbuild.grade以使用react 0.18.0,并且在启动时遇到了此错误。据我所知,AppRegistry已正确导入。即使我注释掉代码,此错误仍会出现。这在iOS上没有问题。

我错在哪里?

编辑:尝试其他支持0.18.0的样板文件后,我仍然遇到相同的问题。

进入图像描述


我在0.19和0.20版本中遇到了同样的问题,尝试了所有方法但都没有成功。@Dustin有任何更新吗? - Shprink
@Shprink 我也遇到了0.20的这个问题。同时收到了这个错误信息 One of the sources for assign has an enumerable key on the prototype chain. - Josh Ferrara
30个回答

83

我刚刚升级到了 react-native 的版本 0.18.1,但是使用预发行版 0.19.0-rc 时遇到了一些依赖问题。

回答你的问题,我所做的是:

  1. cd android
  2. sudo ./gradlew clean(关于如何清除更多信息请看这里

然后返回工作目录并运行 react-native run-android

在升级之后也应该重新启动 npm。

希望这对你有用。


4
我试图运行gradlew命令,但它一直告诉我找不到Android SDK,尽管我在路径中有ANDROID_HOME。我还添加了 local.properties文件,并带有sdk.dir=。有任何想法吗? - steezeburger
77
当给出建议执行类似于sudo ./gradlew clean的操作时,最好提到这是一个巨大的操作,它会重新下载和安装整个Gradle分发包。 - Szczepan Hołyszewski
1
出现错误:模块HMRClient不是已注册的可调用模块(调用enable)。 我无法看到我所做的js文件中的更改:( - Dinesh R Rajput
要查找您的Android SDK位置,请打开Android Studio并点击configure,您会看到顶部的一个路径,该路径可能类似于:/Users/karim/Library/Android/sdk - Karim Mortabit
1
在我尝试更新到RN 0.44之后,这对我没有任何作用。 - SleepsOnNewspapers
显示剩余7条评论

17

我在iOS上也遇到了同样的问题,原因是我的 index.ios.js 文件不正确(因为我复制粘贴了其中一个示例而没有查看其内容),它以模块导出声明结束。

exports.title = ...
exports.description = ...
module.exports = MyRootComponent;

与预期不同

AppRegistry.registerComponent('MyAppName', () => MyRootComponent);

我猜你在安卓上使用 index.android.js 也可能会遇到类似的问题。


16

这个问题的一个主要原因可能是您安装了插件但忘记链接它。

尝试这个:

react-native link

重新运行您的应用程序。

希望这可以帮助。请在评论中让我知道。谢谢。


2
在下一个版本中,运行 react-native link 而不带包名将被弃用并移除。 - Harshad Madaye
有可靠的信息来源吗? - cmcodes
错误:未知命令'link'。 - IMPixel

11
我解决了这个问题,只需添加即可。
import { AppRegistry } from "react-native";
import App from "./App";
import { name as appName } from "./app.json";  
AppRegistry.registerComponent(appName, () => App);

请确保在您的index.js文件中存在此内容。


1
你的意思是添加 app.json 部分吗? - Narendra Singh

11

1
这实际上是正确的答案。 - Rohan Choudhary

6
我在Mac上开发iOS和Android应用程序时遇到了这个问题 - 在我调整一个依赖项的代码之后,跨平台出现了问题。我通过以下方法解决了它:node_modules目录中执行以下命令:
rm -rf node_modules
npm i
npx pod-install ios

这基本上只是重新安装你的依赖项。

5

对我来说,我的问题是在打包时放入了错误的入口文件

我使用了App.js作为我的入口文件,因此App找不到AppRegistry。

正确:

react-native bundle --platform android --dev false --entry-file index.js --bundle-output android/app/src/main/assets/index.android.bundle --assets-dest android/app/src/main/res/

错误:

react-native bundle --platform android --dev false --entry-file App.js --bundle-output android/app/src/main/assets/index.android.bundle --assets-dest android/app/src/main/res/

你救了我的大脑...我已经试了好几天,想弄明白为什么如果我运行以下命令:react-native bundle --platform android --dev false --entry-file index.js --bundle-output android/app/src/main/assets/index.android.bundle --assets-dest android/app/src/main/res一切正常,但是如果我使用 fastlane 发布应用程序,则会崩溃并显示以下错误:Module AppRegistry is not a registered callable module (calling runApplication)在 build.gradle 中,我可能有一个错误的 entryFile!再次感谢! - Nobady

3

希望这可以解决某人的问题。在升级我的React Native版本后,我遇到了这个错误。令人困惑的是,它只出现在Android端。

我的文件结构包括一个index.ios.js和一个index.android.js。两者都包含以下代码:

AppRegistry.registerComponent('App', () => App);

我需要做的是,在android/app/src/main/java/com/{projectName}/MainApplication.java中,将index更改为index.android
@Override
protected String getJSMainModuleName() {
    return "index.android"; // was "index"
}

然后在app/build/build.gradle中,将entryFileindex.js更改为index.android.js

project.ext.react = [
    entryFile: "index.android.js" // was index.js"
]

3
如果在Windows上使用Android时遇到此错误,请打开根目录的应用文件夹并进入Android文件夹。
cd android 
gradlew clean         

重新启动您的应用程序

react-native run-android 

2

检查一下是否直接在SafeAreaView中渲染某些内容。

确保你按照以下格式进行操作。

<SafeAreaView>
    <View>
       {children}
    </View>
</SafeAreaView>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接