Expoのこの1年間の動きと自分の動き(2019年)

この記事は[React Nativeアドベントカレンダー](https://qiita.com/advent-calendar/2019/react-native)の2日目の記事です。

どうも！ハムカツおじさんという名前でtwitterやってます([@hmktsu](https://twitter.com/hmktsu))🤘
自分でだったり弊社でだったりなどReact Nativeでの開発を行う上でExpoを使っています。
なので今日は[去年に引き続き](https://qiita.com/watanabe_yu/items/f489f08c630108a7ab7e)Expoの2019年の動きについてまとめたいと思います。

ちなみにExpoについてというのは大体の人が知っている前提で話をしてしまいます。
知らない人は「react native expo」でググると色々と記事が出てきますのでそちらをご覧ください。

## 2019/01
### v32リリース
[Expo SDK v32.0.0 is now available](https://blog.expo.io/expo-sdk-v32-0-0-is-now-available-6b78f92a6c52)
v31のリリースから約二ヶ月後の2019/01/08にv32がリリースされました。

* バックグラウンドロケーションやジオフェンシングに対応
* プッシュ通知がカテゴリやアクションに対応
    * 通知画面でボタンを押させるなどができるように
* Expo SnackがTypeScriptやESLintの独自ルールに対応
* iOSでバックグラウンドフェッチに対応
* Androidでも連絡先読み込みに対応

### プルリクを送ったら確認用QRをプルリクのコメントやSlackに貼り付けるパッケージを作成
[watanabeyu/expo-qr-notify](https://github.com/watanabeyu/expo-qr-notify)

開発者だけでなく他のメンバーにも色々と確認をしてもらいたい、そういう場合にスタンドアローンビルドをするのも面倒ではあるなぁと。
そういったときにExpoを使っているとExpoクライアントアプリ上で動かすことができるので確認がとても簡単にできます。
ただ確認用のURLなりをいちいちSlackだったりで通知するのは正直手間であったりします。

そこでGitHubでプルリクを送信したらプルリクのコメント欄にQRを発行したり、SlackにQRコードを自動で貼り付けてくれるようなものを作りました。
ちなみに設定する項目は`app.json`の一部のみ。

```app.json
"hooks": {
  "postPublish": [
    {
      "file": "expo-qr-notify",
      "config": {
        "slack_webhook": "enter_your_slack_incoming_webhook_url",
        "slack_channel": "#general",
        "git_service_token": "enter_your_github_token"
      }
    }
  ]
}
```

割と便利なのでぜひとも使ってください。

## 2019/03
### react-native-store-versionをTypeScript化
[watanabeyu/react-native-store-version](https://github.com/watanabeyu/react-native-store-version)

これはパッケージを作ったというよりもパッケージをTypeScript化しました。
というのも2019年になってからTypeScript関連の情報がちらほらと。
特に@typescript-eslintが出始めたぐらいから情報が活発に出てきたようなイメージがあります。
もしパッケージを作っていてそれをTypeScript対応したいなぁという場合は、以下の記事で自分が手順を載せておいたので参考にしてください。

[JavaScriptで書いてたreact-nativeのnpm packageをTypeScriptで書き直したのでその手順的なお話](https://watanabeyu.blogspot.com/2019/03/javascriptreact-nativenpm.html)

## 2019/04
### 技術書典6にてExpoの環境構築本を出す
[#1人チーム本](https://hmktsu.booth.pm/items/1315573)

技術書の祭典としての技術書典6に技術書典5から引き続き参加をしました。
ちなみに今回出した本は「#1人チーム本」というExpoの環境構築をしつつ、GoでバックエンドおよびAWSをインフラに！みたいな話となっています。
Expoのバージョンが今と比べるとちょっと古いですが、根本的なところは一緒なので今でも役に立つのではないかと思います。

買ってくだされ〜🤲

## 2019/06
### v33リリース
[Expo SDK v33.0.0 is now available](https://blog.expo.io/expo-sdk-v33-0-0-is-now-available-52d1c99dfe4c)
v32のリリースから約五ヶ月後の2019/06/06にv33がリリースされました。
割とアップデートまでが長かったイメージがあります。

* React Native 0.59.8対応
* react-native-webを標準対応してExpoでもwebを吐き出せるように
* Expoクライアント自体を`expo:client ios`コマンドでビルドできるように
* Teamプランについてアナウンス
* Bare workflow(react-native-unimodules)の登場
* モジュールの分割化
* TypeScript対応
* React hooks対応
* 新しいAPI追加などなど

v33はかなり大きいリリースだったなぁと思います。
React Native 0.59.8に対応したことによりReact hooksに対応。
またTypeScriptにも標準対応をしたりなどもそうですし、web吐き出しができるようになったのはすごいなぁと。

特に個人的に大きいなと思ったのがBare workflowの登場です。
react-native-unimodulesは要はExpoのAPIをreact-nativeでも使えるようにしましょうというものです。
ちょうど開発を始めようと思ったアプリがどうしてもカスタムをした動画プレイヤーを作らないといけなく、そうするとExpoをやめてreact-nativeで作らないといけない、そうするとパッケージ系が色々と面倒だなぁと。
でもこのreact-native-unimodulesを使えばベースをExpoでネイティブ部分を一部書けばいいだけだなぁと。
むしろreact-nativeを普通に使っていた人がExpoのAPIを使えるようになるのは大きいなぁと。

ということで自分は個人的にここからreact-native-unimodulesを普及していきたいなぁと思い始めました。

## 2019/07
### v34リリース
[Expo SDK v34.0.0 is now available](https://blog.expo.io/expo-sdk-34-is-now-available-4f7825239319)
v33のリリースから約二ヶ月後の2019/07/30にv34がリリースされました。

* Androidの64bitサポート
* iOS13（当時はベータ版)対応
* `from 'expo'`をなくしてモジュールimportを必須に
* Expo Webの改善
* Bare workflowでもExpoクライアントで確認することができるように
    * ネイティブ部分は走らせることはできないけども
* ExpoKitを将来的には無くすようにするよ宣言

大きいのはAndroidの64bitサポートだったなぁと思います。
2019/09頃にある64bit必須に対応するためにという感じでした。

## 2019/09
### v35リリース
[Expo SDK v35.0.0 is now available](https://blog.expo.io/expo-sdk-35-is-now-available-beee0dfafbf4)
v34のリリースから約二ヶ月後の2019/09/21にv35がリリースされました。

* Dark Mode対応
* Apple ID認証対応
* Expo Webの改善
* デバイスやネットワーク系の新しいモジュール

FacebookログインなどSNSを使ってアカウントを作成するようなアプリには、Apple ID認証が必須になるということがAppleから発表されていました。
それに対応するためにのモジュールをリリースしました。
また地味に便利なのがデバイス情報だったり、バッテリーやネットワークの状況などを確認できるようになったということ。

ただReact Nativeのバージョンは依然として0.59.8。
0.60以降にアップデートするには地味に色々と大変だからしょうがないなぁと思います。
まだv36は出ていませんが多分v36では対応するのではないかと。

## 2019/12(追記)
### v36リリース
[Expo SDK 36 is now available](https://blog.expo.io/expo-sdk-36-is-now-available-b91897b437fe)
v35のリリースから約三ヶ月後の2019/12/10にv35がリリースされました。

* React Native 0.61対応
* ダークモードをAndroidでもWebでも対応
* Permissionの確認を各モジュールでできるように

大きいアップデートはあまりありませんでした。
けどもひたすら色んなバグとりや改善やらを行っていたみたいです。
それとreact-native-unimodulesは2020年中に全部のExpo APIを使えるようにする予定とのこと。

## 1年間を通して
去年と比べてある意味React NativeないしExpoが安定した年だったんじゃないかなと思います。
特に大きいのはTypeScriptが主流になったということではないでしょうか。
僕はreact-native-unimodulesの今後に期待したいと思っています。

個人的に今年も去年に続きかなり活動した一年だったなぁと思っています。
技術書典に引き続き参加してみたり、いくつかパッケージを作り改善したりなど。
LTなどもちょいちょい発表してましたが、数も多かったので割愛させていただきます。
[@kangyoosam](https://twitter.com/kangyoosam)さんと[@takahi5](https://twitter.com/takahi5)さんが運用している[ReactNative勉強会](https://r-n.connpass.com/)には大変お世話になりました。
そこから縁があって[KitchHike](https://kitchhike.jp/)の[@shoken0x](https://twitter.com/shoken0x)さんにお呼ばれしてExpoについて話をしたりなどなど。

[React Native + Expoで1年以上運用したCTOが集まってみた 前編 - KitchHike Tech Blog](https://tech.kitchhike.com/entry/react-native-expo-session-01)
[React Native + Expoで1年以上運用したCTOが集まってみた 後編 - KitchHike Tech Blog](https://tech.kitchhike.com/entry/react-native-expo-session-02)

Expoはかなり浸透してreact-nativeを使っていた人もExpoに傾き始めてきているので、今後はreact-native-unimodulesをどう普及していくかということをがんばっていきたいなぁと思っています。

## 最後に
かなりつらつらと書いてしまいましたが、こんな感じでExpoは年間アップデートされています。
色々な機能がバージョンアップのたびに追加されています。
ある程度のアプリだったらejectなどせずともExpoのみでできますし、ネイティブを触るようなちょっと凝ったものを作りたいのであればreact-native-unimodulesを使うという感じがよいと思います。

3日目はReactNative勉強会でも交流がある、アメリカ人であるJesseさん(@Naturalclar)です。