2022-04-08 社内勉強会 in airCloset
Satoshi Nitawaki
React Native に詳しくない人をターゲットに、React Native のノウハウを話してみようの会!
少しでも学ぶことがあったら幸いだよ!
対象読者
情報粒度:
2022-04-08 社内勉強会 in airCloset
Satoshi Nitawaki
React Native に詳しくない人をターゲットに、React Native のノウハウを話してみようの会!
少しでも学ぶことがあったら幸いだよ!
対象読者
情報粒度:
👉「React Native 触ったことアル」から「React Native チョットデキル」に
これらは別途、「業務上でキャッチアップしてもらう」 「また別の人から教わる事ができる」 ので話さないよ!
約45分予定
15 分 | React Native の基礎知識 |
5 分 | Q&A タイム |
10 分 | ライブラリの話 |
5 分 | Q&A タイム / トイレ休憩 |
5 分 | かゆいところに手が届く知識 |
5 分 | Q&A タイム / トイレ休憩 |
終了 |
今の React Native の公式ドキュメントは豊富な内容で、これを読んでおくだけでOK!
まだ読んだことのない方は、読んでみることをオススメします!💫
React Native を使うには、JavaScript(JS)の知識が必要になります!
JS のチュートリアルサイトはいくつもありますが、ここでは「現代の JavaScript チュートリアル」を紹介します!
JavaScript の基礎 までは抑えると、基本的に困ることはないはず!
あと、estaが上げてた jsprimer もおすすめ(これが見つからなくて👆を挙げた感じある)
a ?? b
の結果は: a
が null
あるいは undefined
でなければ a
,b
.let height = 0; alert(height || 100); // 100 alert(height ?? 100); // 0
let height = 0; alert(height || 100); // 100 alert(height ?? 100); // 0
「Learn Once, Write Anywhere」
これは「ワンソースでクロスプラットフォーム対応ができるもの」ではないので注意してください。
作り込んでいくと必ずワンソースでは済まなくなります。体感8割〜9割程度。
残りの1〜2割は、OS 専用のコードや考慮が発生します。これは OS によって設計思想や挙動が異なることが原因で発生することが多いです。(いくつか後述します)
腐らず丁寧に対応してあげてください。🙇
React Native が提供するコンポーネント
に接続されています。
これにより、React Native を1度構築するだけで、iOS アプリと Android アプリをビルドすることができます。
React Native が提供するコアコンポーネントについてはこちらをみるとよいでしょう 👇
react-native-web では、RN をビルドすることで dom を生成することができます。つまり web も開発できちゃうのです。ただ、WEB サイト全体を RN で構築することはおすすめしません。なぜならナビゲーションの問題や逆に考慮が増えることでコスト増につながることがあります。
stand.fm や twitter lite 、旧 wantedy(現在は RN をやめている)のパーツとして react-native-web を使用するケースが多いようです。
air-closet では Production コードでは使用していませんが、 ac-native-components という atomic design の共通パーツライブラリでの storybook を簡単に確認する方法として react-native-web を使用しています。
emulator 上で storybook を確認したい場合は、expo を利用することで簡単に確認できるようにしています。
https://reactnative.dev/docs/libraries
app/build.gradle
で管理されているReact Native Directory という便利なサイトができていたので、RN のライブラリはここで探すとよいかもしれない。
React Native Directoryは、ReactNative 専用に構築されたライブラリの検索可能なデータベースです。これは、ReactNative アプリのライブラリを探す最初の場所です。
ディレクトリにあるライブラリの多くは、ReactNativeCommunityまたはExpoからのものです。
https://reactnative.dev/docs/linking
Linkingとは、node_modules
に存在する native code をRNプロジェクトに接続すること。
npm install
するだけで、接続完了(0.6Xで追加された)通常のアプリデプロイフロー
出典: https://vijayt.com/post/integrate-codepush-to-a-react-native-android-app/
code-pushデプロイフロー
出典: https://vijayt.com/post/integrate-codepush-to-a-react-native-android-app/
react-native-firebaseはドキュメントが 💩💩💩
firebase自体のドキュメントは優秀
各ライブラリに触れたかったが、時間がないので割愛。
最もポピュラーなライブラリから、公式ドキュメントに記載されるライブラリへ (react-navigation, 公式Doc)
dark-modeだったり、safe-area だったりをこのライブラリ単体でも仕組みとして持っている。ややこしい。
pickss
air-closet
react native upgradeのタイミングで一緒に引き上げるのがタイミング的に良いと思われる。
https://github.com/software-mansion/react-native-screens
元々JSオンリーだった react-navigation にネイティブライブラリが登場した。
個人的に、ナビゲーションを実装する上で、 スクリーン制御をJSのみで完結するのはパフォーマンスの限界があったのだと思う。
なんとなく紹介
React Nativeは数々のライブラリに支えられているフレームワーク。
そのため、ライブラリでバグが発生することが多い。
そのバグ修正がリリースされる前にこちらでライブラリに対するパッチを当てることができる
それがこちら。
https://reactnative.dev/docs/upgrading
「ゴールの見えない暗闇を2週間走り続けるようなものだ」
2022 年 4 月 現在もネイティブコードの修正が必要なライブラリは存在する:e.g. KARTE
KARTE は RN アプリの上にポップアップを被せるといった、Native 層に依存度の高い動作があるためと推測する。
長所は一旦割愛。
アプリで使用するライブラリととコンポーネント数を減らす 画像を圧縮してリソースを最適化する
SectionList、FlatList、VirtualList を使用してメモリリークを解消する ListView はガーベジコレクションが働かないことがあるとのこと。メモリリークされないので基本的に使わない。公式ドキュメント上からも、0.60 以降のリニューアル後では紹介すらされなくなったことからも非推奨に近いことがわかる。
公式ドキュメント:ListView での FlatList 紹介
const FlatListBasics = () => { return ( <View style={styles.container}> <FlatList data={[ { key: "Devin" }, { key: "Dan" }, { key: "Dominic" }, { key: "Jackson" }, { key: "James" }, { key: "Joel" }, { key: "John" }, { key: "Jillian" }, { key: "Jimmy" }, { key: "Julie" }, ]} renderItem={({ item }) => <Text style={styles.item}>{item.key}</Text>} /> </View> ); };
const FlatListBasics = () => { return ( <View style={styles.container}> <FlatList data={[ { key: "Devin" }, { key: "Dan" }, { key: "Dominic" }, { key: "Jackson" }, { key: "James" }, { key: "Joel" }, { key: "John" }, { key: "Jillian" }, { key: "Jimmy" }, { key: "Julie" }, ]} renderItem={({ item }) => <Text style={styles.item}>{item.key}</Text>} /> </View> ); };
class MyComponent extends Component { constructor() { super(); const ds = new ListView.DataSource({ rowHasChanged: (r1, r2) => r1 !== r2, }); this.state = { dataSource: ds.cloneWithRows(["row 1", "row 2"]), }; } render() { return ( <ListView dataSource={this.state.dataSource} renderRow={(rowData) => <Text>{rowData}</Text>} /> ); } }
class MyComponent extends Component { constructor() { super(); const ds = new ListView.DataSource({ rowHasChanged: (r1, r2) => r1 !== r2, }); this.state = { dataSource: ds.cloneWithRows(["row 1", "row 2"]), }; } render() { return ( <ListView dataSource={this.state.dataSource} renderRow={(rowData) => <Text>{rowData}</Text>} /> ); } }
<Text>
を使用するconst { label = "" } = props; return <View>{label}</View>;
const { label = "" } = props; return <View>{label}</View>;
👇過去経験談記事
console.warn
: Yellowconsole.error
: Red<Image>
に border を当ててしまい YellowBox が表示され、リリースビルドでクラッシュ<ScrollView>
のスクロールが効かないとき - Qiita