【入門】はじめての React Native

この記事は、アプリケーションフレームワーク「[React Native](https://facebook.github.io/react-native/)」の入門チュートリアルです。

開発環境の構築方法、および Hello World アプリケーションを iOS/Android エミュレータで起動する方法を解説します。

## React Native とは
**React Native** は Facebook 社が開発しているオープンソースのアプリケーションフレームワークです。

クロスプラットフォームに対応しており、ワンソースで複数のプラットフォーム（iOS、Android、UWP、Web）に対応したアプリケーションを開発することができます。

Web フロントエンドのフレームワークである [React](https://ja.reactjs.org/) をベースに開発されており、Javascript、[JSX](https://ja.reactjs.org/docs/introducing-jsx.html)、CSS を使って開発します。

## 動作環境
- Mac OS X 10.14.6
- React Native 0.6.1
- Xcode 11.2
- Android Studio 3.5.1

## はじめに
React Native には、次の２つの開発ツールが用意されています。

- **React Native CLI**（通常の開発ツール）
- **Expo CLI**（React Native の開発支援サービスである「[Expo](https://expo.io/)」を使用するための開発ツール）

Expo を利用すると、アプリストアの審査を通すことなくアプリを配信することができ、Web アプリのようにスムーズに開発することができます。

ただし、Expo は少し分かりづらい部分がありますので、最初は「**React Native CLI**」を使って開発することをおすすめします。

## 環境構築（React Native CLI）
「**React Native CLI**」を使った開発環境の構築します。

[Homebrew](https://brew.sh/) を使って、[Node](https://nodejs.org/ja/) と [Watchman](https://facebook.github.io/watchman/) をインストールします。

```console
$ brew install node
$ brew install watchman
```

Xcode を [Mac App Store](https://apps.apple.com/us/app/xcode/id497799835) からインストールします。
Xcode を開くと、利用許諾（ライセンス同意契約）が表示されますので、「Agree（同意）」ボタンを押してください。

[CocoaPods](https://cocoapods.org/) をインストールします。

```console
$ sudo gem install cocoapods
```

## Hello World アプリケーションの作成
iOS シミュレータを起動します。

```console
$ open -a Simulator
```

React Native アプリケーションを作成し、iOS で起動します。
※「AwesomeProject」は任意のプロジェクト名を指定してください。

```console
$ npx react-native init AwesomeProject
$ cd AwesomeProject
$ npx react-native run-ios
```

次のような React Native アプリケーションが起動します。

<img width="270" alt="reactnative_ios.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/127532/97d2efd8-f99d-6d5e-0c47-e1bc3c2e789e.png">

それでは、App.js をテキストエディタで開いて、次のコードを入力して保存します。

```jsx:App.js
import React, { Component } from 'react';
import { Text, View } from 'react-native';

export default class HelloWorldApp extends Component {
  render() {
    return (
      <View style={{ flex: 1, justifyContent: "center", alignItems: "center" }}>
        <Text>Hello, world!</Text>
      </View>
    );
  }
}
```

うまくいけば、iOS シミュレータ上で次のような画面が表示されます。

<img width="292" alt="reactnative_ios_helloworld.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/127532/5e629af0-f105-debd-4c8c-a54a0b0085ff.png">

## Android エミュレータで実行
次の URL から Android Studio をダウンロード後、インストールします。

Android Studio
[https://developer.android.com/studio](https://developer.android.com/studio)

React Native アプリケーションを Android エミュレータで動作させるには、ADV（Android Virtual Device）をインストールする必要があります。
メニューの「Tools」 > 「AVD Manager」を開いて、任意の Android デバイス（ここでは「Pixel 2 API 29」）を追加してください。

<img width="1312"<img width="1312" alt="androidstudio_avd_manager.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/127532/cb34ecd0-50e3-8213-dd4c-552bef6d7cef.png">

「Actions」の「▶️（起動ボタン）」を押して、Android エミュレータを起動します。


![android.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/127532/14226823-8bab-5a61-fb5c-1210c2fa4db8.png)

Android SDK を PATH に追加するために、~/.bash_profile を開いて、次の記述を追加してください。

```
export ANDROID_HOME=$HOME/Library/Android/sdk
export PATH=$PATH:$ANDROID_HOME/tools
export PATH=$PATH:$ANDROID_HOME/tools/bin
export PATH=$PATH:$ANDROID_HOME/platform-tools
```

~/.bash_profile の設定を反映します。

```console
$ source ~/.bash_profile
```

React Native アプリケーションを Android で起動します。

```console
$ npx react-native run-android
```

うまくいけば、Android エミュレータ上で次のような画面が表示されます。

![reactnative_android_helloworld.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/127532/2612b285-8820-f19c-fadf-c4583ef9bf72.png)


## 環境構築（Expo CLI）
「**Expo CLI**」を使った開発環境の構築します。

Expo CLI をインストールします。

```console
$ npm install -g expo-cli
```

React Native アプリケーションを作成します。
※「ExpoAwesomeProject」は任意のプロジェクト名を指定してください。

「expo init」コマンドを実行すると、いくつか質問されます。

・使用するテンプレートを選択します。
ここでは一番シンプルな「blank」を選択します。

```console
$ expo init ExpoAwesomeProject
? Choose a template: (Use arrow keys)
  ----- Managed workflow -----
❯ blank                 a minimal app as clean as an empty canvas 
  blank (TypeScript)    same as blank but with TypeScript configuration 
  tabs                  several example screens and tabs using react-navigation 
  ----- Bare workflow -----
  minimal               bare and minimal, just the essentials to get you started 
  minimal (TypeScript)  same as minimal but with TypeScript configuration 
```

・アプリケーション名を入力します。
ここでは「ExpoAwsome」と入力します。

```console
$ expo init ExpoAwesomeProject
? Choose a template: expo-template-blank
? Please enter a few initial configuration values.
  Read more: https://docs.expo.io/versions/latest/workflow/configuration/ › 100% completed
 {
   "expo": {
     "name": "ExpoAwsome",
     "slug": "ExpoAwesomeProject"
   }
 }
```

・パッケージ管理に [Yarn](https://yarnpkg.com/lang/ja/) を使用するかどうかを指定します。
ここでは「n」を入力して、既存の [npm](https://www.npmjs.com/) を使用します。

```console
$ expo init ExpoAwesomeProject
? Choose a template: expo-template-blank
✔ Please enter a few initial configuration values.
  Read more: https://docs.expo.io/versions/latest/workflow/configuration/ · 100% completed
? Yarn v1.19.1 found. Use Yarn to install dependencies? (Y/n) n
```

プロジェクトフォルダに移動して、React Native アプリケーションを起動します。

```sh
cd ExpoAwesomeProject
npm start
```

コマンドプロンプトに以下が表示されたら、「i」を入力し、iOS シミュレータを起動します。
※Android エミュレータを起動する場合は、「a」を入力します。

```
  To run the app with live reloading, choose one of:
  • Scan the QR code above with the Expo app (Android) or the Camera app (iOS).
  • Press a for Android emulator, or i for iOS simulator.
  • Press e to send a link to your phone with email.
  • Press s to sign in and enable more options.

 Expo  Press ? to show a list of all available commands.
```

<img width="292" alt="expo_ios_01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/127532/fa15032a-bfd1-e139-9d0b-f8c1c5861a96.png">

「Got it」ボタンを押すと、React Native アプリケーションが起動します。

<img width="292" alt="expo_ios_02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/127532/3f3f250d-ea25-020d-aaae-5f738d19619e.png">

## さいごに
React Native は、Google 社の開発した [Flutter](https://flutter.dev/) と並んで、今もっとも人気にあるクロスプラットフォームフレームワークです。

※Flutter については、別記事「[【入門】はじめての Flutter](https://qiita.com/nskydiving/items/4fcf0dbad923d50601f9)」を参照してください。

React Native は Web 技術をベースとしているため、Web 開発者が今までの経験を活かしてネイティブアプリを開発することができます。

もっと React Native を学びたいという方は、以下のサイトを参照してください。

- [React Native 公式サイト](https://facebook.github.io/react-native/)
- [React Native チュートリアル（Learn the Basics）](https://facebook.github.io/react-native/docs/tutorial)