æ¬ã¨ã³ããªã¯3é¨ä½ã®Part3ã¨ãªã£ã¦ããã¾ãã
ã¢ãã¤ã«ã¨ã³ã¸ãã¢ã®@hotchemiã§ãã
Part1ã2ã§ã¯å®éã«ã¤ã³ãã°ã¬ã¼ã·ã§ã³ãé²ãã¦ããä¸ã§å¾ãããç¥è¦ãå ¬éãã¦ãã¾ããããä»åã¯åå¹´ç¨ã®éç¨ãçµã¦æã ã¯å½åã®ç®çãéæã§ãã¦ããã®ããã¨ããäºã«é¢ãã¦ã®æ¯ãè¿ãã¨ä»å¾ã«ã¤ãã¦å ±æã§ããã°ã¨æãã¾ãã
æ¯ãè¿ã
ç¾ç¶ã軽ã復ç¿ãã¦ããã¨ç§éã¯ä»å¹´ã®åé ãããã¤ããªããã¹ã¿ã¤ã«ã®éçºãåããç¾å¨ã®ã³ã¼ãæ¯çã¯Native75%, React Native 25%ç¨ã¨ãªã£ã¦ãã¾ãã
Good
ã¾ããPart1ã§å®£è¨ãã3ã¤ã®ç®æ¨ã«é¢ãã¦æ¯ãè¿ã£ã¦ã¿ã¾ãã
- ã¢ãã¤ã«ã¨ã³ã¸ãã¢ä¸è¶³ã®è§£æ¶(â)
- éæããäºãã§ãã¾ãããä¸ä¾ãç´¹ä»ããã¨ç¾å¨Quipperã«ã¯3åã®iOSã¨ã³ã¸ãã¢ããã¾ããããã®ãã¡1å+2åã®Reactã¨ã³ã¸ãã¢ã§ã¹ã¿ãã£ãµããªæ¬ä½ã¢ããªã®éçºãæ®ã2åã¯æ°è¦äºæ¥ãæè¡çè² åµè§£æ¶ã®ããã¸ã§ã¯ãããªã¼ããã¦ãã¾ããçµç¹å ¨ä½ã¨ãã¦ã¢ãã¤ã«éçºãã¹ã±ã¼ã«ãããäºãã§ãã¾ããã
- éçºã¨ãªãªã¼ã¹ã®é«éå(â³)
- ãã¡ãã¯éæã§ããã¨ãã§ããªãã£ãã¨ãè¨ãã¾ããLive/Hot reloadæ©è½ãç¨ãã¦UIéçºã®çç£æ§ãä¸ããäºãã§ãã¾ããããPart2ã§ç´¹ä»ãããããªBridgeã®å®è£ ãããéã«ã¯Nativeã¢ã¸ã¥ã¼ã«ã®ã³ã³ãã¤ã«ãå¿ è¦ãªçºã100%React Nativeã§éçºãã¦ããæããã¯è¥å¹²ã®å¾ ã¡æéãçºçãã¦ãã¾ã£ã¦ãã¾ãã
- ã¾ãã以åãç´¹ä»ããCodePushã«é¢ãã¦ã¯ãã¤ããªããã¢ããªã§ã¯ä½¿ç¨ãã¦ãã¾ãããå°å ¥èªä½ã¯å®äºãã¦ãã¾ããéç¨ããã¼ãç ©éã«ãªãçºä¸æ¦pendingã®ç¶æ ã¨ãªã£ã¦ãã¾ãã
- Webããã³ãã¨ã³ãã¨ã®è¨è¨ã®çµ±ä¸ãã³ã¼ãã®å
±ç¨(â)
- ã»ã¼éæããäºãã§ãã¾ãããåºæ¬çã«Webããã³ãã¨ã³ããã¼ã ã®Reactããã¸ã§ã¯ãã¨è¨è¨ææ³ãå©ç¨ãã¦ããã©ã¤ãã©ãªãåããã¦ããçºãããã³ãã¨ã³ãã¨ã³ã¸ãã¢ãéçºã«åç»ããããåå£ãæ´ã£ãã¨æãã¾ããã¾ããActionCreatorããã¸ãã¯å±¤ã«é¢ãã¦ã¯å ±éã®ã³ã¼ããããªãåå¨ãã¦ããç¾å¨ã©ãå ±æãã¦ããã®ãè¯ããæ¤è¨ãã¦ãã¾ãã
ã¾ããä¸è¨ã«æããç¹ä»¥å¤ã«ã以ä¸ã®ã¡ãªããã享åããäºãã§ãã¦ãã¾ãã
- ãã¹ãã®æ¸ãããã
- JavaScriptã¨ããè¨èªèªä½ã®mockã®ããããããReduxã®è¨è¨ãççµåã«ãªã£ã¦ããã®ã§ActionCreatorãReducerã®ãã¹ããæ¸ããããäºãReact+Enzyme+Jestã§UIãã¸ãã¯ã®ãã¹ããViewã®snapshotãç¶²ç¾ ã§ããããNode.jsä¸ã§é«éã«å®è¡ã§ããäºã¯é常ã«å¿«é©ã ã¨æãã¦ãã¾ããiOS/Androidã®Nativeå®è£ ã§ãé å¼µãã°åãäºã¯å¿è«ã§ãã¾ããæè»½ã«é«éã«å®è¡ã§ããã¨ããç¹ã§ãã¹ã¿ããªãã£ã«ã¯ä¸æ¥ã®é·ãããã¨æãã¦ãã¾ãã
- ããã©ã¼ãã³ã¹(主ã«UIæç»ã®FPS)
- æå¤ã«æãããããããã¾ãããReact Nativeã¯ããã©ã«ãã§å ¨ã¦ã®åä½ãJSå°ç¨ã®ããã¯ã°ã©ã¦ã³ãã¹ã¬ããã§å®è¡ãUIæ´æ°ã®å½ä»¤ã ããenqueueãã¡ã¤ã³ã¹ã¬ããã«éãã¤ããã¨ããã¢ã¼ããã¯ãã£ã«ãªã£ã¦ããçºã¡ã¤ã³ã¹ã¬ããã§intensiveãªå¦çãå®è¡ããã¨ããäºã¯ååã§ããªãããã«ãªã£ã¦ãã¾ããç§éã®ã¢ããªã«ã¯ä¸é¨ã¡ã¤ã³ã¹ã¬ããã§éãå¦çãå®è¡ãã¦ãã¾ã£ã¦ããã¬ã¬ã·ã¼ã³ã¼ããããããã¨æ¯ã¹ãã¨ããã©ã¼ãã³ã¹ããããè¯ãã¨ããäºãããã¾ãã
- ããåé¡ã«ãªãã®ã¯bundleãããJSãèªã¿è¾¼ãéã®åæåæéã§ããããã¡ãã¯ç§éã®ã±ã¼ã¹ã§ã¯æªã åé¡ã«ãªã£ã¦ãã¾ããã
Bad
ç§éã¯æ°å¤ãã®ã¡ãªãããReact Nativeãã享åãã¦ãã¾ããããå½ç¶ãã¾ããããªãã£ãäºãããã¾ãã
ä¸ä¾ãç´¹ä»ãã¾ãã
- Androidã§ã®ã¿çºçããä¸å
·åãåé¡ã«è¦ããããã
- ãã¡ãã«ã¤ãã¦ã¯å¾è¿°ãã¾ãã
- ã¯ãã¹ãã©ãããã©ã¼ã éçºèªä½ãé£ãã
- React Nativeããèªä½ã¨ã¯é¢ä¿ãªããã¯ãã¹ãã©ãããã©ã¼ã éçºãã®ãã®ãé£ããã¨ããäºã«æ°ä»ãã¾ãããå ·ä½çã«ã¯UIã®å¤æ´ãæ¤è¨¼ããçºã«å¸¸ã«è¤æ°ã®ãã©ãããã©ã¼ã ã§ãã¹ããããªããã°ãªããªãäºãåOSã«ã¨ã£ã¦æé©ãªã³ã³ãã¼ãã³ãã¯ä½ããéçºè ãç¥ã£ã¦ããªããã°ãªããªãäºãªã©ãçºçããã³ã¹ãã¯ç¡è¦ã§ããªãç¨ã«åå¨ãã¦ãããã¨ããçµè«ã«è³ãã¾ããã
- 両OSç¨ã®Bridgeãæ¸ããã¨ã³ã¸ãã¢ã¯æ®ã©ããªãã®ã§Bridgeã¨ã³ã¸ãã¢ã®ä½æ¥ãããã«ããã¯åããã¨ããäºæ ãçºçãã¾ããã
- Reactãç¥ããªãNativeã¨ã³ã¸ãã¢ã«ã¨ã£ã¦ã¯å¦ç¿ã³ã¹ãããã
- ãã¡ãã¯ç¾å¨ã©ãããããã¨èãã¦ãã課é¡ã§ãReactã¯è§¦ã£ãäºã¯ãªããiOS/Androidã¯æ¸ããã¨ããã¨ã³ã¸ãã¢ãããçºãã¼ã ã¨ãã¦ã©ãfollow upãã¦ããããã¨ããäºãèãã¦ãã¾ããç§è¦ã§ãããã¯ã©ã¤ã¢ã³ããµã¤ãéçºããã¦ããã«è¾ºãReactã®æ¦å¿µãå¦ãã§ããäºã¯ä¾ãWebããã³ãå°æ¥ã¨ã³ã¸ãã¢ã§ãªãã¦ã価å¤ãããã¨èãã¦ããçºãã¼ã å ã§å¾æåéãæããã£ã¦ãããã°ã¨æã£ã¦ãã¾ãã
Androidã§çºçããåé¡
å ç¨Androidã§ã®ã¿çºçããä¸å ·åãåé¡ã«è¦ããããããã¨æ¸ãã¾ãããæã ãå®éã«ç´é¢ããåé¡ã«é¢ãã¦å ±æã§ããã°ã¨æãã¾ãã
- ã¢ã¼ããã¯ãã£ãæ±ããæ ¹æ¬çãªåé¡
- Androidç¨ã®React Nativeã«ã¯WebKitã¨Flexboxã®å®è£ ã§ããYogaãNDKã¨ãã¦å«ã¾ããããããã«ãæã®ç ©éæ§ã®å¢å ããã¤ããªãµã¤ãºå¢å ã0ã«ããäºãã§ãã¾ãããã¾ãããã¡ãã®issueã«ããéãç¾æç¹ã§ã¯64bitåãã®APKã使ããäºãã§ãã¾ããã
- Fragmentä¸ã§çºçããåé¡
- Part2ã§èª¬æããéããç§éã¯é¨åçã«å°å
¥ãé²ãã¦ãã£ãçºiOSã§ã¯
UITabbarController
ã®1UIViewControllerãAndroidã§ã¯BottomNavigation
ä¸ã«ä¹ã£ã¦ãã1Fragmentã¨ããåä½ã§å°å ¥ãã¦ããã¾ããããã®éã«çºçããåé¡ã¯(å®è£ ã®ä»æ¹ã«å¿è«ä¾åãã¾ãã)Navigationã®åãæ¿ãæã«Fragmentãåçæããã度ã«React ComponentãåçæãããcomponentDidMount
ãæ¯åå¼ã°ãç¡é§ãªAPIå¼ã³åºããçºçãããComponentãåçæãããçºReactViewèªä½ã®æç»ã³ã¹ãããããã¨ãããã®ã§ããã - ã¾ãBottomNavigationä¸ã«ä¹ã£ã¦ããFragmentã®ä¸ã§Viewãæç»ããå ´åã
FlatList
ãæå¾ã¾ã§ã¹ã¯ãã¼ã«ããªããã¨ããåé¡ãããã¾ããããã¡ãã¯æããReact Nativeæ¬ä½ã®ãã°ã ã¨æãã¾ãããæ ¹æ¬åå è§£æã¾ã§è³ããä¸è¨ã®æ§ã«ã¹ã¯ãã¼ã«é åãèªåã§è¨ç®ããwrapperãå©ç¨ãã¦ãã¾ããã
- Part2ã§èª¬æããéããç§éã¯é¨åçã«å°å
¥ãé²ãã¦ãã£ãçºiOSã§ã¯
import React, { PureComponent } from 'react'; import { Dimensions, View } from 'react-native'; interface Props { children: React.ReactNode; } interface State { height?: number; diff?: number; } // There're some cases cannot scroll down to bottom "0" only on Android. // It might be a bug of RN but we can deal with the problem by surrounding a view that has a tangible height. // this view leverages nativeEvent height and calculates diff and store it for device orientation. // // Got a hint from https://github.com/wix/react-native-navigation/issues/2214#issuecomment-347325418 // ref: https://github.com/facebook/react-native/issues/15707 // ref: https://facebook.github.io/react-native/docs/view.html#onlayout // onLayout: http://matthewsessions.com/2017/06/27/react-native-on-layout.html export default class AndroidScrollableWrapper extends PureComponent<Props, State> { private deviceOrientationChangeHandler = this.adjustHeight(); constructor(props) { super(props); this.state = { height: undefined, diff: undefined, }; } adjustHeight() { return () => { if (!this.state.diff) { return; } this.setState({ height: Dimensions.get('window').height - this.state.diff, }); }; } componentDidMount() { Dimensions.addEventListener('change', this.deviceOrientationChangeHandler); } componentWillUnmount() { Dimensions.removeEventListener( 'change', this.deviceOrientationChangeHandler, ); } render() { return ( <View onLayout={event => { const { height } = event.nativeEvent.layout; this.setState({ height, diff: Dimensions.get('window').height - height, }); }} style={{ width: Dimensions.get('window').width, height: this.state.height, }} > {this.props.children} </View> ); } }
ä»å¾
ä¸è¨ã®åé¡ãè¸ã¾ãã¦ãæã ã¯iOSã®ã¿React Nativeã使ãç¶ãã¦ããã¨ããæ±ºå®ããã¾ãããæ¢ã«Androidããã¯dependencyãrevertãã¦ãã¾ãã
iOSã®ã¿React Nativeã使ã£ã¦ããã¨ããææ³ã¯Discordã§ãæ¡ç¨ããã¦ãããæã ã®ã±ã¼ã¹ã§ããã¾ãworkãã¦ãã¾ãã
React Nativeã«éããããããæè¡ã¯éã®å¼¾ä¸¸ã§ã¯ãªãã®ã§ããã¼ã ã®ã¹ãã«ã»ãããç¶æ³ã«å¿ãã¦é©åã«ä½¿ãåãã¦ããäºãéè¦ã ã¨èãã¦ãã¾ããä»åã®ã±ã¼ã¹ã§ããã¨ãé¨åçã«å°å ¥âæ¯ãè¿ãâæææ±ºå®ã¨ãããµã¤ã¯ã«ãåãäºã§ãã¼ã ã«ã¨ã£ã¦æé©ãªãã¼ã«ã®ä½¿ãæ¹ãæå°éã®ã³ã¹ãã§è¦ã¤ãåºãäºãã§ãã¾ãããã¾ãä»åã¯React Nativeã®è©±ã§ãããKotlinãSwiftã§ã®éçºããã£ãããã£ã¦ãã¾ããFlutterçæ°ããªãã¬ã¼ã ã¯ã¼ã¯ã«é¢ãã¦ãç©æ¥µçã«èª¿æ»ãæ¤è¨ããã¦ããããã¨èãã¦ãã¾ãã
ãReact Nativeãã¤ããªããã¢ããªã¸ã®ææ¦ãã¯ä»¥ä¸ã§çµäºã¨ãªãã¾ããé·ã ã¨ãä»ãåãé ããããã¨ããããã¾ããã