"应用尚未注册" 错误
编辑页面
了解 “应用尚未注册” 错误的含义,以及如何在 Expo 或 React Native 应用中解决它。
For the complete documentation index, see llms.txt. Use this Use this file to discover all available pages.
在开发 Expo 或 React Native 应用时,你经常会遇到如下错误:
Application "main" has not been registered.# 或Invariant Violation: "main" has not been registered.在这个特定的错误中,"main" 可以是任意字符串。
这个错误的含义
某个异常可能阻止了你的应用完成注册
这个错误最常见的原因是:你的应用在能够完成自注册之前,就抛出了一个异常。React Native 应用加载时,会经历两个步骤:
- 加载 JavaScript 代码,如果一切成功,那么你的应用就会被注册。如果在加载 bundle 时出现任何异常,执行就会中止,并且永远不会走到应用注册的那部分。
- 运行已注册的应用。如果代码加载失败,那么应用就不会被注册,你就会看到本页所讨论的这个错误。
如果你正处于这种情况,那么你看到的这个错误信息其实是一个红鲱鱼,它让你分心,忽略了导致应用未能注册的真正错误。
查看这个错误信息之前的日志,看看是什么导致了它。一个常见原因是:某个会自注册为视图的原生模块依赖存在多个版本——例如 这个 Stack Overflow 讨论 中,发帖者的依赖里有多个版本的 react-native-safe-area-context。
你的应用根组件可能没有被注册
另一种可能是,传递给 AppRegistry.registerComponent 的 AppKey,与原生 iOS 或 Android 端注册的 AppKey 不匹配。
在托管项目中,默认行为是使用 "main" 作为 AppKey。这会自动为你处理,只要你没有把 package.json 中的 "main" 字段从默认值改掉,就一切正常。如果你想自定义应用入口点,请查看 registerRootComponent API 参考。
在带有原生代码的项目中,你默认会在 index.js 里看到类似这样的内容:
import { registerRootComponent } from 'expo'; import App from './App'; registerRootComponent(App);
其中 registerRootComponent 的实现如下:
function registerRootComponent(component) { AppRegistry.registerComponent('main', () => component); }
而在原生端,在 AppDelegate.m 中你应该会看到:
RCTRootView *rootView = [[RCTRootView alloc] initWithBridge:bridge moduleName:@"main" initialProperties:nil];
以及在 MainActivity.java 中:
@Override protected String getMainComponentName() { return "main"; }
默认情况下,整个项目中都会一致地使用 "main"。如果你遇到了这个错误,很可能是某些地方发生了变化,导致这些值不再一致。请确保你在 JavaScript 端注册的名称,正是原生端所期望的名称(如果你使用的是 Expo 的 registerRootComponent 函数,那就应该是 "main")。
其他注意事项
这个错误在另外一些场景下也可能出现,不过这些情况更难预测,而且修复方式会更依赖于你的项目。例如,还有以下几种情况:
- 你连接到了错误项目的本地开发服务器。尝试关闭其他 Expo CLI 或 React Native 社区 CLI 进程(可使用
ps -A | grep "expo\|react-native"查找它们)。 - 如果这个错误只在生产应用中出现,那么尝试在本地以生产模式运行应用:
npx expo start --no-dev --minify,以查找错误来源。