React Native とは ?
一発目なので簡単な紹介から。 React.js と同様、仮想 DOM で UI を記述できるモバイルアプリ作成用の JavaScript フレームワーク。特徴としては次のようなものがある。
- EcmaScript 2015
- 宣言的
- コンポーネント指向
- CSS ライクなスタイル指定
- flow による型チェックサポート
公式で取り上げられている使用例は次にまとめられている。
思想は次のページで説明されている。これは去年の記事。
重要だと思う点をとりあげる。
keep development velocity: 開発速度を落とさない
One of the most painful things about our transition to mobile, though, is how much it's slowed down our development velocity.
When building on the web, we can simply save our files and reload the browser to see the result of our changes. On native, however, we need to recompile after every change, even if we just want to shift text a few pixels over on the screen. As a result, engineers end up working a lot more slowly, especially in a large codebase where compilation is especially burdensome.
モバイル開発への移行にあたって一番苦痛だったのは開発速度がどの程度落ちたのかということだった。
Web 開発では、単純にファイルを保存しブラウザーでリロードすれば結果が見えた。しかしネイティブではテキストの表示位置を数ピクセル変えるだけの変更であっても、そのたびに再コンパイルが必要になった。結果として、エンジニアの仕事速度は大幅に落ちた。特に大きなコードベースではその影響が大きかった。
learn once, write anywhere: 一度学んだらどこでも書ける
It's worth noting that we're not chasing “write once, run anywhere.” Different platforms have different looks, feels, and capabilities, and as such, we should still be developing discrete apps for each platform, but the same set of engineers should be able to build applications for whatever platform they choose, without needing to learn a fundamentally different set of technologies for each. We call this approach “learn once, write anywhere.”
我々は「一度書いたらどこでも動く」ということに価値があると思っていない。異なるプラットフォームは異なる外見、手触り、能力を持つ。そのため、まだプラットフォームごとに個々のアプリを開発すべきだと考えている。が、同じチームが、選んだプラットフォームすべてで、基礎的な技術の違いを学ぶことなしにアプリケーションを作成できなければならない。我々はこのアプローチを「一度学んだらどこでも書ける」と呼んでいる。
ニュース
4 月の Facebook の開発者向けイベント F8 で Microsoft の協力を得て Windows を、 Samsung の協力を得て Tizen をサポートすることを発表した。
が、現時点の状況が何も発表されていないので、来年に持ち越しかも。同じく F8 で発表するということもありうる。
今年の変更点
主に semver でいうマイナーバージョンが上がるが、まだメジャーバージョンが 0 なので breaking change 上等のアップデートが多い。
2 週間を目処にアップデートされている。たまに数日ずれる。
プラットフォームに依存しない各バージョンの変更点を大雑把に見ていく。 Android / iOS におけるエンハンスは着実に進んでいる。
プラットフォームごとの変更は他プラットフォームではサポートされていたコンポーネント、 props 、 API をサポートした、ブリッジを書きやすくした、パフォーマンスが向上した、などが多い。
0.18.0
2016/01/19 リリース。
-
reactnpm package に直接依存するようになった- これまでは
react-hasteというものへの依存で一段かましていた
- これまでは
0.19.0
2016/01/30 リリース。
-
scrollToメソッドがListViewに追加された - iOS9.2 / Xcode 7.2 へ環境移行された
- テキストノードを除いて背景色の継承がなくなった
0.20.0
2016/02/16 リリース。
- WebSocket の Origin その他のリクエストヘッダーを変更可能になった
- カメラロール関連を
Promiseを使って処理できるようになった - テキストフィールドのオートリサイジングが追加された
- Babel preset が定義された
- 画像以外のアセットをバンドルできるようになった
0.21.0
2016/03/02 リリース。
-
NavigationExperimentalが追加された- 既存の Navigator は状態を持ってしまっていたので、状態を持たずに redux などで一元管理可能なナビゲーション用のコンポーネント
- https://facebook.github.io/react-native/docs/navigation.html#navigationexperimental
-
dataSourceが更新されたときに自動的に表示が更新されないよう変更された - 色に数値を指定できるようになった
-
0x1a2b3cなど
-
-
NavigatorコンポーネントのonWillFocus/onDidFocusを使っても警告が出ないようになった -
NetInfoにリスナーを登録した際、解除する関数を返すよう変更された -
requireではなくimportを使うようドキュメントに明示された
0.22.0
2016/03/21 リリース。
- hot reloading 対応
-
ListViewにカスタムしたScrollViewを渡せるようになった- 横スクロールする
ListViewなどはこれで実現する
- 横スクロールする
- Touchable 系コンポーネントに
disabledprop が追加された
0.23.0
2016/04/07 リリース。
- bundle 時にログを出力しないためのオプション
silentが追加された - 何らかの
Promiseがrejectされた場合console.errorもしくは赤い背景でエラー表示するようになった -
NavigationExperimentalを用いてNavigatorが実装された
0.24.0
2016/04/19 リリース。
- いくつか iOS のタッチ / スクロールイベントが拾えていなかった点を修正
-
NavigationExperimentalが改良された- ページャーにアニメーションとジェスチャーがついた
0.25.1
2016/05/05 リリース。
-
react-nativeからではなく、reactから React API をimportするよう変更になった-
Viewなどコンポーネントは引き続きreact-nativeからimportする - 本家 React.js の API が使えるため Learn once, write anywhere が徹底された
- 引き続き
react-nativeからもimport可能
-
- Chrome Developer Tools 以外の JavaScript デバッガーを使えるようになった
-
REACT_DEBUGGERという環境変数に使いたいデバッガーの起動コマンドをセットしておくと使えるようになる
-
-
Imageコンポーネントにprefetchメソッドが追加された- あらかじめ画像をキャッシュしておくためのもの
- https://facebook.github.io/react-native/docs/image.html#prefetch
-
XMLHttpRequestのontimeoutとonerrorをサポートした- が、
fetchを使うのが推奨されている - https://facebook.github.io/react-native/releases/next/docs/network.html
- が、
0.26.0
2016/05/19 リリース。
-
react-nativeから React API をimportできなくなった-
reactからでないとimportできない 0.25.1 での変更が強制された
-
- React 15.0.2 へアップグレードした
- WebSocket でバイナリーデータを送受信できるようになった
-
react-nativeコマンドに--versionオプションが追加された -
react-native bundleサブコマンドに--reset-cacheオプションが追加された- 通常バンドルされたソースはキャッシュされるが、そのキャッシュを削除するオプション
0.27.0
2016/06/06 リリース。
- ソフトウェアキーボード関連のイベントハンドラーの登録に
DeviceEventEmitterを使っていたのをKeyboardを使うようになった - インスペクターから対応コンポーネントのソースファイルが開けるようになった
- rnpm を取り込んだ
0.28.0
2016/06/22 リリース。
-
PullToRefreshViewが廃止になり、onRefreshStart/endRefreshingを使うよう変更になった- 現在は
ListViewのonRefreshイベントを使う - https://facebook.github.io/react-native/docs/refreshcontrol.html
- 現在は
- パフォーマンスの問題から
flexWrap: 'wrap'とalignItems: 'stretch'を同時に指定できなくなった-
alignItemsは'stretch'がデフォルトなのでflexWrap: 'wrap'を使いたい場合他のものに設定する必要がある
-
0.29.0
2016/07/06 リリース。
- Android ソースが変更
-
MainApplication.javaが追加になった - 手動でのアップグレード方法は↑に書いてある
-
- Android で
passwordprop ではなくsecureTextEntryprop のみを使えるように変更された - Android で
Profiler Optionが開発用メニューから削除された -
StatusBarIOSが削除、StatusBarに統一された -
react-nativeコマンドにログを表示するためのサブコマンドlog-ios/log-androidが追加された - 警告の黄色い表示にスタックトレースを表示するようになった
-
reactnpm package の依存が^から~に変更された -
KeyboardAvoidingViewが追加された - カメラロールから動画を選択できるようになった
- ソースをリロードするときにデバッグコンソールを消去するようになった
-
InteractionManagerのタスクをキャンセル可能になった - flexbox で
flexDirectionに'row-reverse'/'column-reverse'を指定できるようになった -
TextにlineBreakModeを指定可能になった
0.30.0
2016/07/21 リリース。
- VSCode をエディターとして使えるようになった
-
react-nativeコマンドから iOS シミュレーターのバージョンを指定できるようなった -
zIndexが使えるようになった
0.31.0
2016/08/08 リリース。
- rnpm の取り込みが完了した
-
react-native linkでrnpm相当のことができる
-
-
enqueueJSCallに呼び出し完了時のコールバックを指定できるようになった -
TextInputに onContentSizeChange が追加された -
fetchで空ボディが返ってきたときのエラーメッセージがマシなものに変更された - Navigator が RTL をサポートするようになった
- 警告の黄色い表示のファイル名と行数をタップするとそのファイルを開くようになった
0.32.0
2016/08/21 リリース。
- 別ユーザーへの送信や SNS への投稿をするための
ShareAPI が追加された -
ActivityIndicatorコンポーネントにsizeprop が追加された - インスペクターにネットワーク通信の中身を表示する UI が追加された
- XMLHttpRequest や WebSocket の情報も表示可能となった
-
NavigatorコンポーネントにpopNメソッドが追加された -
TextInputコンポーネントにdataDetectorTypesメソッドが追加された- 入力内容のうち、電話番号やリンクなどを検出してジャンプできるようにする
- React Native Packager のシンボリックリンクサポートが部分的に追加された
- React Native Packager が動いていないときのメッセージがわかりやすく変更された
0.33.0
2016/09/09 リリース。
-
react-nativeコマンドにrn-cli.config.jsのパスを渡す--configオプションが追加された -
flex-grow,flex-shrink,flex-basisがスタイルに指定可能なプロパティとして追加された - 単純なファイル変更の際のリロード時間が短縮された
- スタイル指定時の flow による型チェックが厳密化された
- 複数のデバイスに対して run-android する際、すべてのデバイスに対して
adb reverseするように変更された - アニメーション設定に
onCompleteが追加された
0.34.0
2016/09/23 リリース。パフォーマンス向上のための変更が多数なされている
-
RCT_NO_LAUNCH_PACKAGER環境変数が設定されていると React Native Packager を立ち上げないよう変更された - タイマーがより精度の高いものに変更された
- Jest メジャーバージョンが 15 に変更された
- ポート番号がすでに塞がっているときにエラーコード 11 で終了するよう変更された
0.35.0
2016/10/11 リリース。
-
PushFromLeftアニメーションがNavigatorに追加された -
react-native init時に Jest がインストールされるようになった-
skip-jestオプションでインストールさせないことも可能
-
- package.json の
browserにfalseを指定すると何もしないよう変更された
0.36.0
2016/10/25 リリース。
-
ScrollViewにflexShrink: 1がデフォルトで指定されるよう変更された -
KeyboardAPI にdismissメソッドが追加された
0.37.0
2016/11/08 リリース。
- 非推奨コンポーネントがいくつか削除された
| 削除 | 代替 |
|---|---|
| AppStateIOS | AppState |
| ActivityIndicatorIOS | ActivityIndicator |
| IntentAndroid, LinkingIOS | Linking |
| SliderIOS | Slider |
| SwitchAndroid, SwitchIOS | Switch |
- Clipboard, NetInfo のコールバックインターフェイスが削除、 Promise で代替するように変更された
-
Buttonコンポーネントが追加された- えっ、いまさら… ?
-
HorizontalSwipeJumpFromLeftアニメーションがNavigatorに追加された
0.38.0
2016/11/23 リリース。ドキュメントのアップデートなどが同時になされている。
-
MapViewを非推奨にし、 https://github.com/airbnb/react-native-maps を使うよう変更された - yarn 0.16.0 以上がインストールされている場合、
react-native init時に yarn を使うように変更された