React Native + EXPO 触ってみた

アプリについて何も知らないですが、以下の記事を参考に React Native + EXPO を触ってみました。補足(2024/1/22)など記載しています。
https://zenn.dev/izuchy/articles/6d6f7970a77aa203396c

## React Nativeとは
Facebook社が開発しているオープンソースのアプリケーションフレームワーク(2015年オープン)。クロスプラットフォームに対応しており、ワンソースで複数のプラットフォーム(iOS, Android, Web)に対応したアプリケーションを開発することができます。

Reactベースに開発されており、JS,JSX,CSSを使用して開発します。

## 特徴
1. クロスプラットフォーム : 1つのコードベースでiOSとAndroidの両方に対応したアプリケーションを開発することができます。
2. ネイティブコンポーネント：ネイティブコンポーネントを使用してUIをレンダリングするため、フルネイティブアプリケーションと同様のパフォーマンスと外観を提供します。
3. ホットリローディング：ホットリロードをサポートしているため、ソースコードの変更を即時にプレビューすることができます。

## EXPO とは
React Native アプリを開発するための便利機能を集めたプラットフォーム。素の React Native プロジェクトより少し制約がありますが、 Expo SDK が提供する機能を使えたり開発環境の整備が簡単というメリットがあります。

:::note info
Expo SDKは、React Nativeをベースにしたモバイルアプリケーション開発のためのフレームワークで、Expoプロジェクトで使うソフトウェア開発キット（SDK）のことです。いろんなモジュールやコンポーネントが事前に組み込まれており、アプリを容易に構築できます。例えば、Expo SDKにはカメラ、地図、通知、センサーなどの機能をサポートするAPIが含まれています。
:::

## 動作環境
Mac OS X 14.0
Xcode 15.2
EXPO 6.3.10

## 事前準備
### 1. EXPO アカウントを登録
[公式サイト](https://expo.dev/)でアカウント登録します。

### 2. Expo Go をインストール
Expo Goを使うと実機で簡単に確認することができます。
手元の実機からインストールします。

iOS
https://apps.apple.com/jp/app/expo-go/id982107779

Android
https://play.google.com/store/apps/details?id=host.exp.exponent&pli=1

### 3. Expo CLI をインストールする
```
$ bun i -g expo-cli
$ expo --version
6.3.10
```
速いという理由でbunを使っています。npmへ置き換えください。

### 4. `expo init` コマンドでプロジェクトの雛形を作成する
```
$ expo init ExpoExample
```
![expo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/668222/98180dec-9d48-737e-c3f9-a7fee93565e8.png)
参考を元に `Managed workflow + TypeScript` を選択します。

※マネージドワークフローは、React Nativeでの "Create React App" のようなものです。Expo CLI とモバイル デバイス上の開発クライアントを使用して、マネージド ワークフロー アプリを構築します。プッシュ通知、ビルド、更新など、1 つ以上の Expo サービスを使用します。アプリ構築の複雑さをできる限り管理するように努めており、これがマネージド ワークフローと呼ばれる理由だそうです。

workflowについて[公式ドキュメント](https://docs.expo.dev/archive/managed-vs-bare/)。

## 動かす
```
$ cd ExpoExample
$ yarn start
```

`yarn start` で  `package.json` に記述されている `expo start` コマンドが実行されます。
![yarnstart.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/668222/7105fdf0-3143-da63-252a-d9f337419dbd.png)

### ポイント
・Expo CLIの新しいバージョン（v6以降：2022/7/25~）ではweb UIが削除されており[起動しません](https://zenn.dev/akashi92511017/articles/2761ab1aba73a2)。
・QRコードを読み込むか、アプリの "Recently opend" から開発途中のアプリケーションの動作確認ができます。
・実機の Expo Go で Expo のアカウントにログインしておくと、 QR コード読み込まさなくても開発中のアプリケーションが一覧に同期されます。

![go.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/668222/6a74d9e9-b02c-e0f1-28e9-b79b3fb5630a.png)

## App.tsxを触ってみる
`container` のスタイルの背景を白を灰色にして文字を変更してみます。
![IMG_2029.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/668222/6c7f7426-8a08-a40f-4193-95f4f428eb2c.png)

保存するとわかると思いますが、ホットリロードのおかげで実機への結果が即時反映されます。ネイティブコードで開発する場合は、都度コードをビルドしてアプリをインストールし直さないといけないようです。 React Native , Expo の場合はこのホットリロードがあるおかげで、 web アプリのように高速に開発できます。

## ディレクトリ
`expo init` で作られた初期ディレクトリやファイルを上から確認していきます。

`.expo` : expo start 実行時に生成されるコミット対象にならないフォルダ。基本触らない。
`App.tsx` : アプリケーション本体。
`babel.config.js` : Babelの設定ファイル。アプリのソースコードを変更する時に使うプリセットを指定。`abel-preset-expo` は、React Nativeの `metro react native babel preset` というプリセットをExpo用に拡張したもの。
![babel.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/668222/9839fce1-efc8-6e4e-b418-625b941e984e.png)

[metro react native babel preset](https://www.npmjs.com/package/metro-react-native-babel-preset) について、React Native自体は、アプリのソースコードを変換する際にデフォルトでこのBabelプリセットを使用します。


## Expo を使った開発の流れ
基本的には `CLI` で開発サーバーを起動し、 `SDK` の機能を使ってアプリを書き、 `Expo Go` で動作確認するようです。

## 感想
「モバイルアプリってどう作るんだろう」とふと興味が湧いたため、実際に立ち上げまでやってみました。自身はwebアプリを作成するためにReactやTypescriptを少し触ったことがある程度です。記事を読んだだけでわかったつもりになるのも勿体ないのでこうして書いています。「とにかく立ち上げてみたい」のなら簡単にできると思いますので参考になりましたら幸いです。