⛏️

Expo CLIで作成したReact Nativeプロジェクトをexpo prebuildしたやつのディレクトリ構成を変える

2022/06/13に公開

以下の続き。
https://zenn.dev/ksyunnnn/articles/9f832e7e74e195

上記で動かしたディレクトリ構成のままで expo prebuildするとエラー祭りやったのでメモ

前提

以下に沿って、Managed WorkflowのExpoアプリをBare Workflow(Nativeコートが使える)に変えた。
https://docs.expo.dev/bare/exploring-bare-workflow/#existing-expo-managed-workflow-apps

問題

expo initしたままの構成で expo prebuildした場合、以下のメッセージとともに package.jsonからmain項目が削除され、index.jsが作成される。先に挙げた記事で構成変えてたのでここがうまくいってなかったようなので直す。

Removed "main": "node_modules/expo/AppEntry.js" from package.json because we recommend using index.js as main instead

mainを手動で消す

/package.json
{
  "main": "src/App.tsx",
}

👇

package.json
{
  // 削除
}

index.jsを作成してregisterRootComponentする

App.tsxでやらせてたregisterRootComponentをここで行う

/index.js
import { registerRootComponent } from 'expo';

import App from './src/App';

// registerRootComponent calls AppRegistry.registerComponent('main', () => App);
// It also ensures that whether you load the app in Expo Go or in a native build,
// the environment is set up appropriately
registerRootComponent(App);

App.tsxも修正

修正前

/src/App.tsx
import { registerRootComponent } from 'expo';
import { StatusBar } from 'expo-status-bar';
import { SafeAreaProvider } from 'react-native-safe-area-context';

import useCachedResources from './hooks/useCachedResources';
import useColorScheme from './hooks/useColorScheme';
import Navigation from './navigation';

const App = () => {
  const isLoadingComplete = useCachedResources();
  const colorScheme = useColorScheme();

  if (!isLoadingComplete) {
    return null;
  } else {
    return (
      <SafeAreaProvider>
        <Navigation colorScheme={colorScheme} />
        <StatusBar />
      </SafeAreaProvider>
    );
  }
};

registerRootComponent(App);

修正後

/src/App.tsx
import { StatusBar } from 'expo-status-bar';
import { SafeAreaProvider } from 'react-native-safe-area-context';

import useCachedResources from './hooks/useCachedResources';
import useColorScheme from './hooks/useColorScheme';
import Navigation from './navigation';

const App = () => {
  const isLoadingComplete = useCachedResources();
  const colorScheme = useColorScheme();

  if (!isLoadingComplete) {
    return null;
  } else {
    return (
      <SafeAreaProvider>
        <Navigation colorScheme={colorScheme} />
        <StatusBar />
      </SafeAreaProvider>
    );
  }
};

export default App;

たぶんこれで動くはず

Discussion