我刚刚开始使用 React Native,并使用
create-react-native-app
创建了一个基本应用程序。
我进行了一些重组,创建了一些新文件夹,并将 App.js 重命名为 Home.js。我修改了
app.json
以包含引用新 Home.js
文件的入口点。当我加载应用程序时,什么也没有发生。没有错误,它只是停留在博览会屏幕上。
.
-components
-screens
-Home
Home.js
-config
-node_modules
-tests
app.json
app.json 文件:
{
"expo": {
"sdkVersion" : "23.0.0",
"entryPoint" : "./screens/Home/Home.js"
}
}
如何定义应用程序的入口点?
如果您正在使用 Expo,则必须在
app.json
文件中指定入口点,如下所示:
{
"expo": {
"entryPoint": "./src/app/index.js"
}
}
然后,在该文件中,您需要使用
Expo.registerRootComponent(YOUR_MAIN_APP_COMPONENT)
注册应用程序
import Expo from 'expo'
...
class App extends Component {
...
}
export default Expo.registerRootComponent(App);
这样您就可以将您的条目文件添加到任何您想要的地方。
您需要更新
app.json
,以便 entryPoint
成为 App.js
的新路径。
{
"expo": {
"entryPoint": "./src/App.js",
...
}
}
但是,在 SDK 32 中使用
Expo.registerRootComponent(App)
会导致以下错误:
undefined is not an object (evaluating '_expo.default.registerRootComponent')
可以通过显式导入 registerRootComponent
来
修复,而不是尝试通过
Expo.registerRootComponent
访问它。
这是一个示例
App.js
。
import { registerRootComponent } from 'expo';
class App extends React.Component {
...
}
export default registerRootComponent(App);
根据当前的 Expo 文档,如果您想要与
App.js
文件不同的入口点,您可以更新 package.json
- 添加一个 main
字段,其中包含所需入口点的路径。然后在入口点文件中,您还必须注册应用程序的 root 组件。当未指定入口点并且是 App.js
文件 时,Expo 会自动执行此操作
package.json
{
"main": "my/customEntry.js"
}
entryPointFile.js
import { registerRootComponent } from 'expo';
import MyRootComponent from './MyRoot';
registerRootComponent(MyRootComponent);
如果我想将我的主应用程序文件命名为 App.js 以外的名称怎么办? - https://docs.expo.io/versions/latest/sdk/register-root-component/#what-if-i-want-to-name-my
如果您的项目处于托管工作流程设置(默认设置)中,如doc中所述,您必须导入 registerRootComponent 并使用您的根组件作为参数调用它,在您希望成为主要组件的文件中:
import { registerRootComponent } from 'expo';
const AnyName() { ... } // Your root component
registerRootComponent(AnyName)
然后,在您的 package.json 文件中,将“main”更改为该文件相对路径,例如
{
"main": "src/main.js"
}
入口点可以在node_modules/expo/AppEntry.js中找到。 这是在 Expo Typescript 中...
import registerRootComponent from 'expo/build/launch/registerRootComponent';
import App from '../../src/App';
registerRootComponent(App);
在此您可以更改您的入口点。 最初它设置为 App,查看该组件来自的导入语句。
我通过react-native-script创建了项目。在应用程序(App.js)的默认入口点中,您导出从您的入口导入的应用程序。
- node_modules
- App.js
- build
- main.js
文件App.js:
import App from './build/main'
export default App
解决方案:
在
package.json
中添加
"main": "src/App.tsx",
然后在您的
App.tsx
中您需要注册
registerRootComponent(App);
Idea 位于包中,您指向应用程序正在注册的位置,而不是实际的应用程序组件,而是您正在注册的位置。
就我而言,我在同一个文件中同时有 App.tsx 和注册,并且工作正常。
更多信息:https://docs.expo.dev/versions/latest/sdk/register-root-component/
我也喜欢将所有源放在一个单独的文件夹中,例如src/,并且我找到了不同的解决方案:
import App from './App';
所以它指向我的 *src/App.tsx`请参阅此处的工作示例https://github.com/fibo/tris3d-app/blob/master/src/expoAppEntry.js
对于那些将 Expo 与 typescript 一起使用的人,您不必在 app.json 中的入口点末尾添加 .tsx。例如,您的入口点可以是:
{
"expo": {
"entryPoint": "./app/components/AppEntryPoint/App.component",
"name": "Sample App",
...
}
...
}
在此示例中,入口点组件的名称是 App.Component.tsx。但是不提扩展也可以工作。除此之外,在根组件中,写入
export default registerRootComponent(AppComponent)
或 registerRootComponent(AppComponent)
都应该起作用,因为从文件导出组件仅意味着其他文件也可以使用它。不写它在这里应该不是问题,因为我们在 app.json 中提到这是根组件。 App.json 将查找并开始从那里构建应用程序的结构。
使用 expo 时,我希望主入口点位于项目根目录的 App.tsx 中,而不是 app/index.js 中。我只是将这一行添加到我的 package.json 中(通过比较空白博览会项目的模板代码找到):
"main": "node_modules/expo/AppEntry.js",
我按照文档的步骤操作:https://docs.expo.dev/versions/latest/sdk/safe-area-context/
它有效,但是当我执行时,出现此错误:
ERROR Error: Couldn't find a navigation object. Is your component inside NavigationContainer?
This error is located at:
in Redirect (created by MainScreen)
in MainScreen (created by ErrorOverlay)
in ErrorToastContainer (created by ErrorOverlay)
in ErrorOverlay (created by withDevTools(ErrorOverlay))
in withDevTools(ErrorOverlay)
in RCTView (created by View)
in View (created by AppContainer)
in RCTView (created by View)
in View (created by AppContainer)
in AppContainer
in main(RootComponent), js engine: hermes