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

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

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

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

## はじめに
Expoはコミュニティがかなり活発です。

* ドキュメント：https://docs.expo.io
* フォーラム：https://forums.expo.io
* リクエスト：https://expo.canny.io
* github：https://github.com/expo/expo

という感じで大きく4つの場所があります。
ドキュメントは言わずもがな、フォーラムは主に質問とかそういうの、リクエストで機能要望を出したりどういう機能を今作っているよっていう感じです。
ちなみにgithubでも活発に質問などが行われています。
自分もよくフォーラムで質問したり答えたり、リクエスト出したり、githubでもうんちゃらとやっています。

さらにバージョンアップもかなり頻繁に行われます。
ということでこの1年間の動きについてをつらつらと書いていきたいと思います。
細かいところまで書くと面倒なので大きなところだけですが。

ちなみに自分の活動についても記述していきたいと思います。

## 2018/01
### v25リリース
[Expo SDK v25.0.0 is now available](https://blog.expo.io/expo-sdk-v25-0-0-is-now-available-714d10a8c3f7)
v25が2018/01/23にリリースされました。

* `app.json`にて`assetBundlePatterns`をサポート
    * バイナリに画像などのアセットをセットするための機能
* v23にて追加された`release-channel`をアップデート
    * 履歴見れたり、あるリリースチャンネルから違うリリースチャンネルにプロモートできたり
* [AWS Amplify](https://github.com/aws-amplify/amplify-js)をejectせずに使えるように
* [Calendar](https://docs.expo.io/versions/latest/sdk/calendar.html)が使えるように
* [MailComposer](https://docs.expo.io/versions/latest/sdk/mail-composer.html)が使えるように
* GLViewのアップデート
* Audio/Videoのアップデート

## 2018/03
### v26リリース
[Expo SDK v26.0.0 is now available](https://blog.expo.io/expo-sdk-v26-0-0-is-now-available-2be6d9805b31)
v25から約二ヶ月後の2018/03/30にリリース。

* Expoのクライアントアプリにて、同じアカウントでなければExpoプロジェクトを共有できなくなる
* iOSのスタンドアローンのビルド時間を短縮
* OTAアップデートに色々とオプションをつけて制御できるように
* Blobサポート
* GestureHandlerがDangerZoneから単独APIに
* PrintをDangerZoneに追加
* LocalizationをDangerZoneに追加
* GLViewのアップデート
* Calendarのアップデート
* Audio/Videoとカメラのアップデート
* Notificationsのアップデート

ちなみにこのアップデートからReact 16.3.0サポートなので、`componentWillMount`や`componentWillReceiveProps`や`componentWillUpdate`などが非推奨になりました。
あと`react-navigation`がbetaが外れて安定板として`v1.5.8`となっています。
v25からv26の間に急激に`react-navigation`がアップデートかかったタイミングでもありました。

## 2018/04
### v27リリース
[Expo SDK v27.0.0 is now available](https://blog.expo.io/expo-sdk-v27-0-0-is-now-available-898bf1e5b0e4)
v26から約一ヶ月後の2018/04/26にリリース。

* ExpoKitで作成したアプリ内にバンドルをアセットできるように
* [MediaLibrary](https://docs.expo.io/versions/latest/sdk/media-library)が使えるように
* [Haptic](https://docs.expo.io/versions/latest/sdk/haptic)が使えるように
* AndroidのFCM通知のサポート
* Linkingのアップデート
* Updatesのアップデート
* ExpoKitのアップデート
* Audio/VideoとImageManipulatorのアップデート
* GLViewのアップデート
* snack.expo.ioのアップデート

## 2018/06
### v28リリース
[Expo SDK v28.0.0 is now available](https://blog.expo.io/expo-sdk-v28-0-0-is-now-available-f30e8253b530)
v27から約二ヶ月後の2018/06/13にリリース。

* AndroidのtargetSdkVersionを26に変更し、ビルドツールを最新バージョンにアップデート
* Androidのnotification channelsのサポート
* Androidのadaptive launcher iconsのサポート
* AndroidのGCM通知をそろそろ廃止したい旨
* iOSの[SKStoreReviewController](https://docs.expo.io/versions/latest/sdk/storereview)が使えるように
* `react-native-gesture-handler`と`react-native-reanimated`を追加
* [AR](https://staging.docs.expo.io/versions/latest/sdk/AR) APIが使えるように
* Audio/Videoとカメラのアップデート
* v26で追加されたPrintをDangerZoneから単独APIに
* v27で追加されたMediaLibraryに`addEventListener`を追加
* snack.expo.ioのアップデート

ちなみに`react-navigation`が`v2.3.1`となっています。
この二ヶ月間も怒涛のアップデート期間でした。

## 2018/07
### ReactNative LT会 #1 byFACTBASEにてLT
「[事例で見るExpoプロダクションアプリ](https://speakerdeck.com/watanabeyu/shi-li-dejian-ruexpopurodakusiyonapuri)」という題名で[ReactNative LT会 #1 byFACTBASE](https://factbase.connpass.com/event/90561/)にて初LTをしました。
ドラム式洗濯機の配達が遅すぎたせいで大遅刻をしてしまいましたが。

### v29リリース
[Expo SDK v29.0.0 is now available](https://blog.expo.io/expo-sdk-v29-0-0-is-now-available-f001d77fadf)
v28から約一ヶ月後の2018/07/27にリリース。
ちなみに自分が以前ブログにこのリリースについてを雑にまとめてあります。
[Expo29.0.0の主な変更点的なお話](https://watanabeyu.blogspot.com/2018/07/expo2900.html)

* ExpoKitの分離を始める
* `expo-cli`をリリース、XDEを非推奨に
* ビルドのアップデート
* snack.expo.ioのアップデート
    * エディタを[Monaco](https://github.com/Microsoft/monaco-editor)に変更
    * ブラウザ内でプレビューできる人数を増やした
* Expoのプッシュ通知配信APIサーバのアップデート
* [SMS](https://docs.expo.io/versions/latest/sdk/sms) APIが使えるように
* [SplashScreen](https://docs.expo.io/versions/latest/sdk/splash-screen) APIが使えるように
* Contacts APIの改善

このアップデート前ぐらいに`react-native`がちょうど`v0.56.0`になったタイミングでした。
ただこの`v0.56.0`はbabelが`7.0.0-beta.47`となっており、バグだったりもそうですけど破壊的変更が多すぎたのと、`react-native`を`v0.56.0`にしてもExpo的にはあまり恩恵がなかったので、内部的には`react-native`は`v0.55.4`としておく感じでした。

## 2018/08
### ReactNative LT会 #2 byFACTBASEにてLT
「[WebViewを使って面倒なことから逃げよう](https://speakerdeck.com/watanabeyu/webviewwoshi-tutemian-dao-nakotokaratao-geyou)」という題名で[ReactNative LT会 #2 byFACTBASE](https://factbase.connpass.com/event/97404/)にてLTをしました。
今回は遅刻しませんでした。

## 2018/09
### v30リリース
[Expo SDK 30.0.0 is now available](https://blog.expo.io/expo-sdk-30-0-0-is-now-available-e64d8b1db2a7)
v29から約一ヶ月半後の2018/09/13にリリース。
こちらも自分が以前ブログにこのリリースについてを雑にまとめてあります。
[Expo30.0.0の主な変更点的なお話](https://watanabeyu.blogspot.com/2018/09/expo3000.html)

* iOS9とAndroid4.4を切り捨てていく予定
* JSのbundleを自分のサーバでホストできるように
* ExpoKit分離がんばっているよ
* `expo-cli`が`v2.0`として正式にリリース
    * `exp`(XDE)の廃止日決定
    * 今後は`expo`コマンドを使うように
* snack.expo.ioのアップデート
    * オープンソース化
    * Vimサポート
* `react-native-screens`を追加
* AndroidのExpoKitでExpo Analyticsを無効にできるように
* `BarCodeScanner`でQRコードの画像を読み込めるように
* FingerprintをLocalAuthenticationという名前に変更
* Androidのintentフィルターが設定できるように

ちなみにv30も同じく`react-native`をアップデートしないで`v0.55.4`としておく感じでした。
ただチェリーピックとして色々と本家で問題になっているものは吸収したとのことでした。
その中で特に大きかったものとしては[TextInputで日本語が打てない問題](https://github.com/facebook/react-native/pull/18456)です。
こちらは自分が[謎のハック方法](https://github.com/facebook/react-native/pull/18456#issuecomment-386873848)を導き出しておいたんですが、これを使う必要がなくなったっていうだけですごく助かりました。

またExpoで使えるQRコード画像をデコードする方法って[今までなかったから自分でライブラリを作っていた](https://github.com/watanabeyu/react-native-qrimage-decoder)んですが、それがついに必要なくなったとのこと。
ちょっと悲しいような嬉しいような。

### React Native Meetup #9にてLT
「[Expoで本番運用をしてみよう](https://speakerdeck.com/watanabeyu/expodeben-fan-yun-yong-wositemiyou)」という題名で[React Native Meetup #9](https://react-native-meetup.connpass.com/event/97634/)にてLTをしました。
約百名の前で行ったのでさすがにちょっと緊張しました。

## 2018/10
### 技術書典5にて本を出す
[技術書典５](https://techbookfest.org/event/tbf05)にて本を出す側で参加しました。
「ExpoでストアリリースするReact Native「最速」アプリ開発」という本でした。
ExpoとFirebase使ってInstagram風のアプリ作っちゃいましょうという内容です。
2018/07のFACEBASE LT会にて知り合ったFACTBASE CTOの[@ggtmtmgg](https://twitter.com/ggtmtmgg)さんに誘われてという形です。

ちなみにこの日の様子などについては下記にまとめてあります。
[技術書典5にて共著でReact Native Expo + Firebase本を書いて出版したので、当日の雰囲気的なところから課題的なところまで的なお話](https://watanabeyu.blogspot.com/2018/10/5react-native-expo-firebase.html)

### Expoの将来的な話
[Expo for Professionals](https://blog.expo.io/expo-for-professionals-218b7937fafb)
v31がリリースする約一週間前の2018/10/26にこのような題名でブログが更新されました。
今後のExpoの方向性などそういったものについてを詳しく。
ちなみにこちらも同じく自分のブログで雑にまとめてあります。
[Expoがオープンソースになったり、TypeScriptになったり、よりよいAPIの提供だったり、カスタムネイティブコードだったりなどなどに対応するよ的なお話](https://watanabeyu.blogspot.com/2018/10/expotypescriptapi.html)

かいつまんでいくと下記のような感じです。

* 開発にあたって：オープンソースだったり、MITにしたり、JSのセルフホストだったり、自分でスタンドアローンをビルドできるようになったり、カスタムでネイティブモジュールを作れたり。
* 技術品質厳しさ：ハイクオリティなAPIや、安定性や、堅実なテストだったり、React Navigation v3だったり、AndroidやiOS以外にも。
* よりよい開発体験：expo-cli v2だったり、TypeScriptだったり、シングルSDKでビルドだったり、チーム対応だったり。
* 将来的に：SDK31とかモダンなJSC(JavaScript Core)だったり、バックグラウンドAPI、64bit APK対応、スピードとかクオリティとか安定さとか色々と対応するためのExpo年間プランとか。

これらはv31にも関連する内容ですが、全部が全部v31でリリースされてたりアップデートされてるわけではないです。
この記事に関してはこれからがんばっていくぞ！という意思表明みたいな感じですね。

## 2018/11
### v31のリリース
[Expo SDK v31.0.0 is now available](https://blog.expo.io/expo-sdk-v31-0-0-is-now-available-cad6d0463f49)
v30から約二ヶ月後の2018/11/03にリリース。
ちなみにいうとExpo fro Professionalsから約一週間後にリリース。
こちらも自分が以前ブログにこのリリースについてを雑にまとめてあります。
[Expo v31になったのでReact Native 0.57やAndroid JSCのアップグレードやスタンドアローンビルドのサイズダウンなど変更点的なお話](https://watanabeyu.blogspot.com/2018/11/expo-v31react-native-057android-jsc.html)

* `react-native`を`v0.57.0`に変更
* AndroidのJSC(JavaScript Core)のアップデート
* `turtle-cli`のリリース
    * Expoのビルドサーバを使わずに自分でビルドサーバを用意してビルドできるように
* スタンドアローンビルドのサイズが小さく
* iOS9とAndroid4.4のサポート終了
* snack.expo.ioのアップデート
    * オートセーブ
    * Markdownサポート
* Localizationのアップデート
* FileSystemにてBase64エンコードのサポート

実はこの約2週間後に`react-navigation`の`v3.0.0`がリリースされました。

## 2018/12
### 技術書典5にて出した本の商業版の発売
[![5143rVLh+4L._SX352_BO1,204,203,200_.jpg](https://qiita-image-store.s3.amazonaws.com/0/119260/2746c5f2-9e73-7b3f-0ed7-23b87bd94447.jpeg)](https://amzn.to/2QnPvJW)
[実践Expo　React NativeとFirebaseで、SNSアプリを最速ストアリリース！ (NextPublishing)](https://amzn.to/2QnPvJW)という本をインプレスR&Dさんから出させていただくことになりました。
唐突な宣伝となってしまいますが、内容としては同人版の改訂版となっていましてかなり詳しく情報を載せました。
ぜひぜひ買ってください。
2018/12/10予約開始の2018/12/14発売となっています。

## 1年間を通して
かなりのリリースがなされています。
v29あたりから細かいアップデートが多すぎてAudioとかVideoとかそういうアップデートについてを書いていないですが、もちろんアップデートされています。
ちなみにExpoのコアメンバーが`react-navigation`を管理しているので、`react-navigation`もかなりアップデート速度は早いです。
両方とも追うのはかなり大変。
本当はv32が2018/11末か2018/12頭に出るっぽかったんですが色々とあるのでまだ厳しいのかなぁと。

個人的にかなり活動した一年だったなぁと思っています。
LTし始めたり本を書いたりなどもそうですが、`react-native`にPR送ってcontributorになったり、`react-navigation`にPR送ってcontributorになったり、`expo`にPR送ってcontributorになったりなどなど。
ちなみに[App.js Conf](https://appjs.co/)というカンファレンスが2019/04にポーランドで行われます。
こちらのLT枠に応募して結果は2019/02/14あたりに出るということで通るかどうかワクワクドキドキです。

## 最後に
かなりつらつらと書いてしまいましたが、こんな感じでExpoは年間アップデートされています。
色々な機能がバージョンアップのたびに追加されています。
ある程度のアプリだったらejectなどせずともExpoのみでできるので、よければみなさんExpoでアプリを作ってみてください。