ã ãããããã«ãããã¯ã«é£ã³èŸŒãæã§ãã å¹æãé«ããããã«ãæ
å ±ãç¥èã«å€æããããŸããŸãªææ³ã䜿çšããŸãã ç¹ã«ã Alexei Androsov ïŒã€ã³ã¿ãŒãã§ã€ã¹ã®ã·ãã¢éçºè
ãYandexïŒ ã«ããã¬ããŒãã®æŠèŠã玹ä»ããŸãã
- 2015幎åé ã«ç»å Ž
- Reactã«åºã¥ããŠæ§ç¯
- WebViewããã³HTMLãã¯ãããžãŒã䜿çšããªã
- ãã€ãã£ãã³ã³ããŒãã³ãã«ã¯JSã«ãã€ã³ããŒããããReactã«ã©ãããããŠããŸã
- iOSã®ãµããŒãã¯AndroidãããåªããŠããŸããããã€ããã¯ã¹ã¯ææã§ã
圌ãæåã§ããïŒ ããïŒ
- PhoneGap-WebViewã§èµ·åãããWebãã¯ãããžãŒã§ã®ãã€ãã£ãã³ã³ããŒãã³ãã®å®è£
- Xamarin-Linuxã®Monoéçºè
ã«ãããã¢ããªã±ãŒã·ã§ã³ã¯CïŒã§èšè¿°ãããŠããŸãïŒãããžã§ã¯ãã¯Microsoftã«ãã£ãŠè³Œå
¥ãããŸããïŒ
- NativeScript-React Nativeãšåæ§ã®ã¢ã€ãã¢ïŒXML + JS + CSS
éçºè
ããŒã«
- ãæ°ã«å
¥ãã®jsãšãã£ã¿ãŒ
- Xcodeããã³éçºè
ã¢ã«ãŠã³ãã§å¹Žé100ãã«ãã¢ããªã±ãŒã·ã§ã³ã®åéãšå
Ž
- å¿è+ Android Studio + SDK +ãšãã¥ã¬ãŒã¿ãŒ
React NativeïŒããããã¥ãŒ
- 2é±éã«1åçšåºŠãªãªãŒã¹
- ã¢ãŒãªãŒã¢ããã¿ãŒã®ãã¹ãŠã®é
åïŒäºææ§ã®ãªãå€æŽãã¹ã¿ãã¯ãªãŒããŒãããŒé§åã®éçº
- ãã¹ãŠåãéåžžã®React
React NativeïŒã€ã³ãµã€ãã«ãã¯
- HTMLã¯ãããŸããããJSXã«ã¯ãã©ãããã©ãŒã ã³ã³ããŒãã³ãããããŸã
- CSSã¯ãããŸããããCSSã®ãããªããªãã¡ã€ã«ããããŸã
- DOM APIã¯ãããŸããã äžè¬çã«ã 絶察ã«ã
- ES6 / ES7ããã³babelã§ã§ããããšã¯ãã¹ãŠå®è¡ã§ããŸãããJITã¯å®è¡ã§ããŸããïŒiOSäžïŒ
äžåºŠæžããŠãã©ãã§ãå®è¡ããŸããïŒ ããïŒ ç°ãªããã©ãããã©ãŒã ã§åãã³ãŒããç¹°ãè¿ã䜿çšãããšããäºæ³ãããä»®å®ã®ä»£ããã«ã äžåºŠåŠãã§ãã©ãã«ã§ãæžããŠãã ããã åãã¢ããªã±ãŒã·ã§ã³ã¢ãŒããã¯ãã£ïŒã€ã³ã¿ãŒãã§ã€ã¹ãæ§ç¯ããããã®åå¿ãããŒã¿ãµã€ã¯ã«ã®ããã®ReduxïŒã
å°ãã®å²åŠ
ãã¹ãŠããã€ãã£ããªã®ã§ãå®å
šãªã¯ãã¹ãã©ãããã©ãŒã ãå¿ããŠãã ããã ãã©ãããã©ãŒã ãç°ãªããããã³ã³ããŒãã³ããç°ãªããŸãã 圌ãã¯ç°ãªãè«çãšçžäºäœçšã®ã¡ã«ããºã ãæã£ãŠããŸãã ãã¹ãŠãJSã§èšè¿°ãããã€ãã£ãã®æŠå¿µãæšãŠãããšãã§ããŸãããããã¯æãŸãããããŸããã ãã€ãã£ãã¯ããªãã®å©ç¹ã§ãïŒ
iOSã®Vineã¢ããªã±ãŒã·ã§ã³ã®äŸã iOSã§ã®æ
£ç¿ã¯äœã§ããïŒ TabBarã®äžéšã§ã¯ãã¡ã€ã³ããããã¡ã€ã«ãæ€çŽ¢ãªã©ã®ç»é¢ãåãæ¿ããã®ãäžè¬çã§ãã NavigationBarã®äžéšã«ãååãšãã¿ã³ãå·Šããå³ã«èšè¿°ããã®ãäžè¬çã§ãïŒéåžžãæ»ãã¯å·ŠåŽã«ãããã¢ã¯ã·ã§ã³ã¯å³åŽã«ãããŸãïŒã ããããAndroidã§ã¯ããã§ã¯ãããŸããã NavigationBarããããŸãããç°ãªããŸãããã¿ã³ãå®è¡ããããšã¯ã§ããŸããã ããã«ã¯ãToolBarãšåŒã°ããå¥ã®ã³ã³ããŒãã³ãããããŸãã Androidã§ã¯ãSegmentedActivityãå®è¡ããã®ãäžè¬çã§ããæäžéšã«ãããiOS TabBarã«éåžžã«äŒŒãŠããŸããããã®ä»çµã¿ã¯å®å
šã«ç°ãªããŸãã TabBarã§ç»é¢ãã¹ã¯ã€ãã§ããªãå Žåã¯ãAndroid eã§ãããè¡ãããšãã§ããŸããããã¯æ
£ç¿çã§ããããã®æ¹æ³ã§ãã
- ã€ã³ã¿ã©ã¯ãã£ããªã³ã³ããŒãã³ãïŒããã²ãŒã·ã§ã³ãã¡ãã¥ãŒãªã©ïŒã¯ç°ãªããŸã
- ãã®ãããã¢ããªã±ãŒã·ã§ã³ã®ã¬ã€ã¢ãŠããç°ãªãå ŽåããããŸã
- ã¢ããªã±ãŒã·ã§ã³ã®è«çã³ã³ããŒãã³ãã¯åãã«ãªãããããäž»ãªé
åã§ã
ã¢ããªã±ãŒã·ã§ã³ã®æ§æã¯äœã§ããïŒ
- 䜿ãæ
£ããdivãspanãbuttonãinputãªã©ã¯ãããŸããã
- ãªãã¿ã®ãªãCSS
- DOMãªã
ã³ã³ããŒãã³ã
ã¢ããªã±ãŒã·ã§ã³ã¯ãã©ãããã©ãŒã ã³ã³ããŒãã³ãããæ§ç¯ãããŸã-ãããã¯Reactã³ã³ããŒãã³ãã«ã©ããããããã€ãã£ãã¢ãžã¥ãŒã«ã§ã
- ã¯ãã¹ãã©ãããã©ãŒã ããããŸãïŒãã¥ãŒãããã¹ããç»åãããã«ãŒã...
- iOSåºæã®ãã®ããããŸãïŒTabBarIOSãActionSheetIOSã...
- Androidã«åºæã®ãã®ããããŸãïŒBackAndroidãToolbarAndroidã...

[ããã¯å®éã®ã³ãŒãã®å€èŠ³ã§ã]
èå³æ·±ãããšã«ããã¿ã³ã¯ãããŸããïŒ ããªãã«ãšã£ãŠãã©ã®ãã¿ã³ãã¯ãªãã¯ãã³ãã©ãŒãããå®ååãããé åã§ãã ãã¿ã³ã®ä»çµã¿ã¯ãããŸããã ãããã£ãŠãReactã«ã¯ãããã®ã¿ããå¯èœãªèŠçŽ ããããäœã§ãã©ããã§ããæ¬è³ªçã«ãã¿ã³ã«ãªããã®ããããŸãïŒonPressãã³ãã©ãŒããããŸãïŒã å·»ç©ã¯å¥ã®ã³ã³ããŒãã³ãã§ãã ããã¯ã»ã°ã¡ã³ãåããããã¥ãŒã§ãã ç»é¢äžã«ãããã®ã®ã¿ãã¬ã³ããªã³ã°ããå°ãç°ãªãæ¹æ³ã§äœæ¥ããå¿
èŠããããŸãã ScrollViewãããã§ã¯åé¢ãããŠããããã§ãã ããŒããŒãã䜿çšããå Žåã¯ãå¥ã®æ©æ§ã ãããã£ãŠãå¥ã®ããããã£ããããŸã-ãããã©ããããã ãããšã¯å¥ã«ãrefreshControlããããã£ã 誰ããiOSã§ã®éçºæ¹æ³ãç¥ã£ãŠããå Žåãããã¯éåžžã«ãã䌌ãŠããŸãã

[ããã¯ããã¹ãããã¯ã¹ã®å€èŠ³ã§ã]
äžéšã®ããããã£ã¯éåžžã®HTMLå
¥åãšäžèŽããŸãããããã§ãªããã®ããããŸãã
CSSã¯æ¬ç©ã§ã¯ãããŸãã-ããã¯èŠªåã§ã
- çžå¯Ÿå€ãªãã®çµ¶å¯Ÿå€ã«ããã¬ã€ã¢ãŠã
- ã¬ã€ã¢ãŠãã«ã¯ãflexboxããããã£ã®å®è£
ãå¶éãããŠããŸã
- CSSxã®å®å
šãªãµããŒãã¯æ±ºããŠãããŸãããå¿
èŠãããŸãã
- åèšã§çŽ70ã®ããããã£ãå®è£
ãããŠããŸãããå®éã«ã¯ååã§ãã 念ã®ãããåžžã«SVGããããŸãã

[CSSã®äŸïŒ1]
PixelRatioã³ã³ããŒãã³ãã¯ãããŸããŸãªç»é¢ïŒRetinaãªã©ïŒã®å¯åºŠãã€ã³ãã®å€ãå®éã®ãã¯ã»ã«ã«å€æããŸãã

[CSSã®äŸïŒ2]
flexã®äŸã次ã«ç€ºããŸãã ã¿ã€ãã»ããããã®ã«ååãªæå°éã®ã»ããã
ã€ã³ã¯å¡åž
- reduxãæ¥ç¶ããŸãããããªãã§ã¯æ¬åœã«æªãã§ããã
- ç»é¢ãšç§»è¡ããžãã¯ãçèãã
- iOSãšAndroidã«ã¯éãããããŸã
- ã¡ã€ã³ã³ã³ããŒãã³ãã¯ããã²ãŒã¿ãŒã«ãªããŸã

[ãµã³ãã«ã¢ããªã±ãŒã·ã§ã³ã³ãŒã]
ããã²ãŒã¿ãŒ
å€ãã®åé¡ããããŸãã
- 管ççšã®åœä»€åAPIïŒã¡ãœããïŒ
- Navigatorãšã®çžäºäœçšãããã«æ€èšããå¿
èŠããããŸã
- ã¢ãã¡ãŒã·ã§ã³ãšãžã§ã¹ãã£ãŒã®å¶åŸ¡ãé£ãã
- NavigatorBarã¯äžè¬çãªç掻ããå®å
šã«åãé¢ãããŠããŸã
- è€æ°ã®ã¹ã¯ãªãŒã³ãéçºããåŸãçã¿ãæãå§ããŸã
å€ãã®ç¹ã§ãåé¡ã¯reduxã§è§£æ±ºãããŸãã

[ãªãæªãã®ïŒ]
ã«ãŒããéå§ããããŸãã¯æ»ãïŒå¥ã®ç»é¢ã«å·»ãæ»ãïŒã«ã¯ãNavigatorãžã®ãªã³ã¯ãäœæããŠããããã®ãªã³ã¯ãååŸããå¿
èŠããããŸãã ãããŠæåã¯ããã§ã¯ãããŸããããªããªã ããã²ãŒã¿ãŒã¯ãŸã ãããŸããã

[ã€ã³ã¿ãŒãã§ãŒã¹ã¯é¢é£ã³ã³ããŒãã³ãã®ããã«èŠããŸã]

[ãããå®éã«ã¯ãã®ããã«èŠãã]
NavigationBarãŸãã¯reduxãå¿
èŠãªçç±
- MyComponentãšNavigationBarããã€ã³ãããããšããªãã§ãã ãã
- ã°ããŒãã«ç¶æ
ãšãã£ã¹ãããã¢ã¯ã·ã§ã³ïŒflux / reduxïŒã䜿çšããæ¹ãè¯ã

2015幎12æãEric Vicentiã¯ãNavigatorã®åé¡ã解決ããããšããŠãã³ãã¥ããã£ã®å©ããåããŠnavigation-rfcãããžã§ã¯ããçµç¹ããŸããã 2016幎2æããããžã§ã¯ãã¯NavigationExperimentalãšããååã§React Nativeãã¹ã¿ãŒã«ç§»è¡ããçŸåšFacebookã§éçºäžã§ãã ãŸããå€ãããã²ãŒã·ã§ã³ã¯ãµããŒããããªããªããŸãã
NavigationExperimental-äœãè¡ãããã
- ã¬ãã¥ãŒãµãŒãä»ããŠå¶åŸ¡ãããç¶æ
- åœä»€åAPIã®ä»£ããã«-ã¢ã¯ã·ã§ã³ãã£ã¹ãããã£ãŒ
- ããã²ãŒã·ã§ã³ããžãã¯ã¯ãã¥ãŒããåé¢ãããŠããŸã
- NavigationBarãã¢ãã¡ãŒã·ã§ã³ãããã³å¶åŸ¡ãžã§ã¹ãã£ãããŸããŸãªã³ã³ããŒãã³ãã«åé¢

[ãµã³ãã«ããã²ãŒã·ã§ã³ã³ãŒã]
ã¢ãã¡ãŒã·ã§ã³
- ç¹å¥ãªã³ã³ããŒãã³ãã«ãã£ãŠå®è£
ãããŸã
- <Animated.View>ã<Animated.Image>ã<Animated.Text>ããããŸã
- Reactã®å€éšã§åäœãããã€ãã£ãã³ã³ããŒãã³ããçŽæ¥æŽæ°ãã

[ãµã³ãã«ã¢ãã¡ãŒã·ã§ã³ã³ãŒã]
ããã¯éåžžã«ã¹ã ãŒãºã«åäœããé£ç¶ããŠ/䞊è¡ããŠçµã¿åãããŠãããªãããããªããšãããããšãã§ããŸãã
ãã€ãã£ãã¢ãžã¥ãŒã«
React Nativeã¯ã³ã¢ãå®è£
ããŠããŸããããã¹ãŠã§ã¯ãããŸããã ã¢ãžã¥ãŒã«ããªãå ŽåïŒ
- UIExplorerã®æ€çŽ¢ã³ã³ããŒãã³ãïŒReact Nativeãã¢ã¢ããªã±ãŒã·ã§ã³ïŒ
- OSçšèªã§æ£ããã¢ãžã¥ãŒã«åãèŠã€ãã
- ãœãŒã¹ã§æ€çŽ¢ãããšãææžåãããŠããªãå¯èœæ§ããããŸãïŒåçã®äœææ¹æ³ãSVGïŒ
- js.coach/react-native-React Nativeã®ãã©ã°ã€ã³
- JSããããã€ãã£ãå®è£
ã奜ã
ãã€ãã£ãã¢ãžã¥ãŒã«ã®æ¥ç¶æ¹æ³
rnpmã䜿çš-React Nativeããã±ãŒãžãããŒãžã£ãŒïŒ
$ rnpm link react-native react-native-google-analytics-bridge
ééã£ãæ¹æ³ã¯ããã¹ãŠããã©ã«ããŒã«å
¥ããããšã§ãã
- å
±é/ã³ã³ããŒãã³ã
- Android /ã³ã³ããŒãã³ã
- iOS /ã³ã³ããŒãã³ã
ãã©ãããã©ãŒã ã«å¿ããŠæ¥ç¶ããŸã
æ£ããæ¹æ³ã¯ããã¹ãŠããã©ã«ããŒã«å
¥ããããšã§ãã
- MyComponent / Component.ios.jsãMyComponent / Component.android.js
- ComponentIOSãComponentAndroid
ãã©ãããã©ãŒã äŸåã®ã³ã³ããŒãã³ãïŒComponentIOSãComponentAndroidïŒã®å ŽåããããŒãè¿ãã«çœ®ããŠãããšäŸ¿å©ã§ãããã©ãããã©ãŒã äžã§äžéšã®ã³ã³ããŒãã³ããèŠã€ãããªããšããåé¡ã¯çºçããŸããã
ãã€ãã£ãã³ã³ããŒãã³ãã®èšè¿°æ¹æ³
- ãã¹ãŠãjsã§æžãå¿
èŠã¯ãããŸãã
- ã³ã³ããŒãã³ãã«ã¯UIKitãŸãã¯Android APIã®å®è£
ãå¿
èŠã§ã
- ããã§ãªãå Žåãããªãã¯å¥åŠãªããããã
æçµå ±åã ãã®å Žæããã®ãã㪠ã
PS
ååãWeexãžã®ãªã³ã¯ãç Žæ£-2é±éåãAlibabaã¯Apacheãããžã§ã¯ããè²æž¡ããŸããã
ãããŠåã³Vueå
ã ããã¯ãã€ãç§ã®è¶³ã®äžã§æ··ä¹±ããŸãã
React + Reduxã®ã¢ã€ãã¢ãå¹ã蟌ãã ã ãã§ãç§ã¯åœŒããšäžç·ã«èµ°ããŸãããã§ãŒã³ãœãŒã§çã£ãããã«ãããããå Žæã«é©çšããããšããŸãã ãããŠãäœãèµ·ãã-çéžã¹ããŒãžãå±éããŸããïŒïŒ
æ¯èŒãèªãããšã¯éåžžã«èå³æ·±ãã§ãããã誰ã§ããããåãããšãã§ããŸã-Habréã®ãããã¯ã¯æ°ããã§ãã