ãã©ãŠã¶ãã¬ã³ããªã³ã°ã§çŽ æŽãããä»äºãããå ŽåãReact Nativeã®ãããªããŒã«ã¯ç»å Žããªãã£ãã§ãããã å éšã§ã¯ãReact Nativeã¯åãJavaScriptã䜿çšããViewã¯ãã€ãã£ãã§ããããã€ãã£ãã¢ããªã±ãŒã·ã§ã³ãšReact Nativeã¢ããªã±ãŒã·ã§ã³ã®ããã©ãŒãã³ã¹ã®éãã¯å¹³åçãªãŠãŒã¶ãŒã«ã¯æ°ä»ãããŸããã ã€ãŸããåé¡ã¯JavaScriptã§ã¯ãããŸããã
äœããæé©åããå Žåã¯ãã¬ã³ããªã³ã°ããã ãã§ãã JavaScriptãšãã©ãŠã¶APIãæäŸããããŒã«ã§ã¯äžååã§ãã 2幎éãç§ã¯èªåã®è£œåã®ä»äºãã¹ã ãŒãºãã€é«éã«ããããšããŠããŸããããç¡é§ã§ããã ç§ã¯ããŠã§ããæ°žé ã«æ®ããšããäºå®ã«ã»ãšãã©åæããŸããã ãã®èšäºã§ã¯ãã¬ã³ããªã³ã°ã®æé©åã«ã€ããŠåŠç¿ããåãçµãã ãããžã§ã¯ãã«é©çšããããã«ç®¡çãããã¹ãŠãåéããè¿ãå°æ¥ãžã®åžæã«ã€ããŠè©±ããŸããã ããã¯ãããã©ãŒãã³ã¹ãæé©åããããã«CSSããã¯ããµãŒãããŒãã£ã®ãªããžããªã§ã¯ãªããæšæºãšãã©ãŠã¶APIã®åŒ·åºãªåºç€ã«äŸåãããæªæ¥ã§ãã
ãã€ããªããã¢ããªã±ãŒã·ã§ã³ãšããã©ãŒãã³ã¹
ã³ã¡ã³ããã«ããŽãªãã¿ã°ä»ãã®ãã¥ãŒã¹ãã£ãŒããšããéåžžã«ç°¡åãªæ©èœãåããã¢ããªã±ãŒã·ã§ã³ãäœæããŸããã ãããªãèŠããããã¥ãŒã¹ãæ€çŽ¢ãããã§ããŸãã ããŠãããå€ãã®ããã·ã¥éç¥ã è€éãªããšã¯äœããããŸããã NDAã®ããããããã®ãããžã§ã¯ãã玹ä»ããããšã¯ã§ããŸããããåœç€Ÿã®ããã°ã§ã¢ãã€ã«éçºãžã®ã¢ãããŒããéžæããååã«ã€ããŠã話ããŸãã
ãã€ããªããã¢ããªã±ãŒã·ã§ã³ã®éçºã¯åªããŠããŸãã JavaScriptã¯ç§ã«ã¯ãŸã£ããåé¡ãããŸããã§ããããFramework7ããã³Ionicãã¬ãŒã ã¯ãŒã¯ãgeneãã¿ãªãæäŸããŠãããã€ã³ã¿ãŒãã§ã€ã¹èŠçŽ ã¯ç§ã«ã¯ãŸã£ããåé¡ãããŸããã§ããã ãã€ãã£ãæ©èœã䜿çšã§ãããã©ã°ã€ã³ããããã°ååã§ããã äœæããã°ããã®ãã¹ãŠã®ãã©ãããã©ãŒã ã«å¯ŸããŠã1ã€ã®ã¢ããªã±ãŒã·ã§ã³ãäœæããäžåºŠã«10ãååŸããŸãã 倢ãšã ãã ããããä»ã§ã¯å€§èã§ããã¹ãŠã«çµæ¢ç¬Šãæã€ãããããããããŸãã
ã¢ããªã±ãŒã·ã§ã³ããHelloãworldïŒããããèããè€éã«ãªããšããã«ãããã©ãŒãã³ã¹ã®åé¡ãå§ãŸããŸãã ãã®ã¢ããªã±ãŒã·ã§ã³ã¯ãã¢ãã€ã«ããŒãžã§ã³ã®ãµã€ããããåªããæ©èœãçºæ®ããŸãããåæ§ã®ãã€ãã£ãã¢ããªã±ãŒã·ã§ã³ã»ã©ã§ã¯ãããŸããã
誰ãããããææ ¢ããæºåãã§ããŠãããªããããã¯ç§ã«ãšã£ãŠææŠã§ããã ãã€ãã£ãã¢ããªã±ãŒã·ã§ã³ãšåºå¥ã§ããªãããã«ããã€ããªããã¢ããªã±ãŒã·ã§ã³ãäœæããå¿ èŠããããŸããã ããããç§ã¯å°ãäžæè°ã«æã£ãŠã1ã€ã®ç°¡åãªçµè«ã«éããŸãããjsã§ã¯ããã¹ãŠãåé¡ãªããã¬ã³ããªã³ã°ã«åé¡ããããŸãã ãtransformïŒtranslate3dïŒ0,0,0ïŒãïŒããã«æ©èœããªããªã£ãïŒãããPNGã°ã©ããŒã·ã§ã³ãã¢ã«ãã¡ãã£ãã«ã«çœ®ãæããåã«ããã¹ãŠã®CSSããã¯ãè©ŠããŸããã ãã¡ãããããã¯åé¡ã解決ããŸããã§ããããã»ãã®å°ãã ããã¹ã¯ããŸããã ãããã®ãããã³ã°ã®äžéšã次ã«ç€ºããŸãã
» translate3dã䜿çšããWebKitã§ã®ããŒããŠã§ã¢ã¢ã¯ã»ã©ã¬ãŒã·ã§ã³ã®åŒ·å¶
» ãã€ã³ã¿ãŒã€ãã³ãã䜿çšãã60fpsã¹ã¯ããŒã«ïŒãªã
» CSS box-shadowã¯ã¹ã¯ããŒã«ãé ãããããšããããŸã
ã¢ãã€ã«ãã©ãŠã¶ãããã€ã¹ã«é¢é£ããªãä»ã®ãããžã§ã¯ãã«åãçµãã åŸã ãããŠãããã§ã¯ãã¹ãŠãæªãããã§ã¯ãããŸãããããã©ãŒãã³ã¹ã«åé¡ã¯ãããŸããããªããªãããããã¯è¯ãéã®ãã·ã³ã®ã©ãããæ¥ãã®ã§ããã ããããããã©ãŒãã³ã¹ã®åé¡ãç®ã«èŠããªãå Žåãããã¯ãã¹ãŠãæé©åãããŠããããšãæå³ããŸããã
äžãåé¡ããããŸã
ãŠã§ããµã€ããã¢ããªã±ãŒã·ã§ã³ã§ã¯ãInstagramãFacebookãTwitterãMediumã®ãããªç¡éã®ãã£ãŒãããããŸãããããã®äŸãããããããã¢ããããŒãã§ç¬èªã®ãã£ãŒããäœæã§ããŸãã ãããŠãããã¯äœãæªãããšã§ã¯ãããŸããã ã¹ã¯ããŒã«ã䜿çšãããšãåãæçš¿å ã§ç§»åããããæçš¿éã移åãããã§ããŸãã ãã°ããã¹ã¯ããŒã«ã§ãããã£ããã¹ã¯ããŒã«ã§ããŸãã 奜ããªã ããªã¹ãã«æ°ããã¢ã€ãã ãè¿œå ããŸãã ç§èªèº«ãããããŸããã
å®éšããŠã¿ãŸãããã ããããã¯ãŒã©ãŒã¯ãããŸããïŒ Medium.comãéããäžã«ã¹ã€ã³ã°ããŸãã ã¯ãŒã©ãŒãæ倧é床ã«éãããŸã§ã«ã©ããããããããŸããïŒ ç§ã®çµæã¯çŽ45ç§ã§ãã ãããŠãããã¯Chromeã®ããã§ã¯ãããŸããã ãããŠãç§ã®ã©ããããããäœå¹Žãåã§ããããšãããããŸããã åé¡ã¯ããã¥ãŒããŒãã«è¡šç€ºããããã®ãæé©åããŠããªããšããããšã§ãã
ããŒããå·»ããšã©ããªããŸããïŒ ããŒãžã®äžçªäžã«æ¥ããšããµãŒããŒããããã«ããã€ãã®æçš¿ãååŸãããªã¹ãã®æåŸã«è¿œå ããŸãã ãªã¹ãã¯ç¡éã«å¢ããŠããŸãã ãã©ãŠã¶ã¯äœãããŸããïŒ ãªãã ãã£ãŒãã®å é ã«ããæçš¿ã¯åŒãç¶ãååšãããã©ãŠã¶ã¯åŒãç¶ãããããã¬ã³ããªã³ã°ããŸãã ãããŠããã®ããããã£ããã¥ãŒããŒãå€ã®ãã¹ãŠã®æçš¿ã«ãã³ã°ãããŠãããå¯èŠæ§ïŒé衚瀺ãã¯ããã§ã¯åœ¹ã«ç«ã¡ãŸããã ã¡ãªã¿ã«ããã®ãããªç¡é§ãªæé©åã¯Ionicã§æ°ã¥ãããŸããã çå£ã«ã ãããã圌ãã¯ãããä¿®æ£ããŸããã èå³ã®ããæ¹ã¯ããã®åé¡ãè°è«ããããã«äœæããIonicãã©ãŒã©ã ã®ãããã¯ãã芧ãã ãã ã
æé©åã®ç¥ç§çãªäžç
æé©åãããé©åãªã³ãŒãã®äœæã劚ãããã®ã¯äœã§ããïŒ ãã®ããã»ã¹ã«ã€ããŠç§ãã¡ãããŸãç¥ããªãã®ã¯äžå®ã§ãã ç¥èã®ã»ãšãã©ã¯è©Šè¡é¯èª€ã«ãã£ãŠããããããããã©ãŠã¶ãããŒãžãã¬ã³ããªã³ã°ããæ¹æ³ããªã©ã®èŠåºãã®èšäºã¯ãHTMLãCSSã«ã©ã®ããã«é©åããããŒãžãã©ã®ããã«éå±€åããããã瀺ããŠããŸãã æ°ããèŠçŽ ãDOMã«è¿œå ããããæ°ããã¯ã©ã¹ãèŠçŽ ã«è¿œå ãããšã©ããªããããããŸããã ã©ã®èŠçŽ ãåã«ãŠã³ãããã³ã¬ã³ããªã³ã°ãããŸããïŒ
ããã§ããªã¹ãã«æ°ããã¢ã€ãã ãè¿œå ããŸãã 次ã¯ïŒ
- æ°ããèŠçŽ ãã¬ã³ããªã³ã°ããŠé 眮ããå¿ èŠããããŸãã
- ä»ã®ãªã¹ãã¢ã€ãã ãåã·ããããå¿ èŠããããŸãã
- ãªã¹ãã®ä»ã®èŠçŽ ãåã¬ã³ããªã³ã°ããå¿ èŠããããŸãã
- ã芪ãã®é«ããæŽæ°ããå¿ èŠããããŸãã
- ã芪ããæŽæ°ãããçŸåšãé£æ¥ããèŠçŽ ãå€æŽããããã©ããã¯äžæã§ãã
DOMã®ã«ãŒãã«ç¶ããŸãã ãã®çµæãããŒãžå šäœãã¬ã³ããªã³ã°ããŸãã
ãã©ãŠã¶ã§ã®ã¬ã³ããªã³ã°ã®åäœã¯ç°ãªããŸãã ããã§ã¯ ããã®ãããã¯ã«é¢ããå€æ°ã®èšäºã®1ã€ã玹ä»ããŸããèè ã¯ãDOMããªãŒãšCSSããªãŒãçµåããããã»ã¹ãšããã©ãŠã¶ãçµæã®æ§é ãã©ã®ããã«æç»ãããã«ã€ããŠè©±ããŸãã ãã¹ãŠãéåžžã«ã¯ãŒã«ã§ãããéçºè ããã©ãŠã¶ãæ¯æŽããããã«ã§ããããšã¯æ確ã§ã¯ãããŸããã éå ¬åŒã®CSSããªã¬ãŒãªãœãŒã¹ã«ã¯ããŒãã«ã衚瀺ããããã©ãŠã¶ãŒã§ã©ã®CSSããããã£ãã¬ã€ã¢ãŠã/ãã€ã³ã/è€åããã»ã¹ãããªã¬ãŒãããã決å®ã§ããŸãããéåžžãããŒãžã«ã¯å€æ°ã®ã¹ã¿ã€ã«ãšèŠçŽ ãå«ãŸããŠããããããã¹ãŠãé€å€ããã®ã劥åœãªå¯äžã®æ¹æ³ã§ããããã©ãŒãã³ã¹ã«åœ±é¿ããå¯èœæ§ããããŸãã
äžè¬ã«ãæé©åã¯ããã€ãã®ãã€ã³ãã§æ§æãããŠããŸãã
- CSSãæããã ãã¹ã¿ã€ã«ããã©ãŠã¶ãŒã§èªã¿åãå¯èœã«ããŸãã
- éãã¬ã³ããªã³ã°ã¹ã¿ã€ã«ãåãé€ããŸãïŒã·ã£ããŠãšéæ床ããŸã£ããé¿ããæ¹ãè¯ãã§ãïŒã
- DOMèŠçŽ ã®æ°ãæžãããå¯èœãªéãå°ãªãå€æŽãå ããŸãã
- GPUã§æ£ããåäœããŸãã
ããã¯ãã¹ãŠãããŒãžã®ã¬ã³ããªã³ã°ãå°ãé«éåããã®ã«åœ¹ç«ã¡ãŸãããããã«å¿ èŠãªå Žåã¯ã©ãã§ããããïŒ
ã¯ãªããã³ã°
æ¬åœã«æ©èœããå¯äžã®æ¹æ³ã¯ããŠãŒã¶ãŒãæ¬åœã«å¿ èŠãšããèŠçŽ ã®ã¿ãããŒãžã«å«ãŸããããã«ããããšã ãšæããŸãã ãã®åäœã®å®è£ ã«ã¯åé¡ããããŸãã
å€ãã®äººãä»®æ³ãªã¹ã/ä»®æ³ã¹ã¯ããŒã«/ã°ãªãããã¥ãŒ/ããŒãã«ãã¥ãŒã«ã€ããŠç¥ã£ãŠããŸãã ååã¯ç°ãªããŸãããæ¬è³ªã¯åãã§ããããŒãžã«éåžžã«é·ããªã¹ããå¹ççã«è¡šç€ºããããã®ã³ã³ããŒãã³ãã§ãã åºæ¬çã«ããããã®ã€ã³ã¿ãŒãã§ãŒã¹ã³ã³ããŒãã³ãã¯ã¢ãã€ã«éçºã§äœ¿çšãããŸãã
GitHubã¯ãä»®æ³ãªã¹ããä»®æ³ã°ãªãããªã©ã®jsãªããžããªã§ãã£ã±ãã§ãã æé©åã¯éåžžã«æ©èœããŠãããäºå®ã§ãã 1äžåã®èŠçŽ ã®ãªã¹ãã§ãé·ã10,000 pxã«1ã€ã®èŠçŽ ã®é«ããæããã³ã³ãããäœæããã¹ã¯ããŒã«ãç£èŠããŠããŠãŒã¶ãŒã«èŠããèŠçŽ ã ãã§ãªãããã以äžã衚瀺ã§ããŸãã èŠçŽ èªäœã¯ããtranslateïŒtransformYïŒ<element index> * <element height> pxïŒãã䜿çšããŠé 眮ãããŸãã ç§ã¯æè¿Vue.js 2.0ãç 究ãããã®ãããªã³ã³ããŒãã³ããæ°æéã§æžããŸããã
ããã€ãã®å®è£ ãªãã·ã§ã³ãããããããã®éãã¯ãèŠçŽ ã®é 眮æ¹æ³ãšãããããã°ã«ãŒãã«åå²ãããã©ããã ãã§ãããããã¯ããã»ã©éèŠã§ã¯ãããŸããã åé¡ã¯ãçæ³çãªæ¡ä»¶äžã§ã¯ãã¹ã¯ããŒã«ã€ãã³ãããã¹ã¯ããŒã«ããããã¯ã»ã«æ°ãšåãåæ°ã ãçºçããããšã§ãã ããã¯ããããã§ãã ããã«å ããŠãã€ãã³ããçºçãããã³ã«èšç®ãè¡ãå¿ èŠããããŸãã ã¢ãã€ã«ããã€ã¹ã§ã¯ãã¹ã¯ããŒã«ã€ãã³ããšã¹ã¯ããŒã«ã¡ã«ããºã èªäœã®åäœãç°ãªããŸãã ãã®çµè«ã¯éåžžã«ç°¡åã§ããã¹ã¯ããŒã«ã€ãã³ãã¯ããã®ãããªã¿ã¹ã¯ã«ã¯é©ããŠããŸããã
ããã§èšåãã䟡å€ã®ããå¥ã®åé¡ã ç§ãèŠããã¹ãŠã®ã³ã³ããŒãã³ãã§ã¯ããªã¹ãã¢ã€ãã ã®ãµã€ãºãåãã§ããããããããåã¢ã€ãã ã«ã€ããŠäºåã«ããã£ãŠããå¿ èŠããããŸãã ããã¯å®è£ ãè€éã«ããŸãã
IntersectionObserver
çŸåšãIntersectionObserverãç»å ŽããŠããŸããããã¯ãåé ã§èª¬æããæªæ¥ã«éãããã£ãæåã®åžæã®å ã§ãã ãã®æ©èœã¯æ°ãããããããã«caniuse.comã®ãã©ãŠã¶ãŒãµããŒãã«é¢ããæ å ±ã瀺ããŸãã ãããŠãããã«é¢ããããã€ãã®è³æããããŸãïŒ
- ãã©ããä»æ§
- ãã©ããä»æ§ãäŸããã³ããªãã£ã«ãå«ã説æä»ãã®ãªããžããª
- Googleããã°ã±ãŒã¹ã¹ã¿ãã£
IntersectionObeserverã¯ãé¢å¿ã®ããèŠçŽ ããã¥ãŒããŒãã«è¡šç€ºããããšããããã³é¢ãããšãã«ã¬ããŒãããŸãã ã¹ã¯ããŒã«ããå¿ èŠã¯ãªããèŠçŽ ã®é«ããæ°ããå¿ èŠã¯ãããŸãããã©ã®èŠçŽ ãã¬ã³ããªã³ã°ããå¿ èŠãããããã©ã®èŠçŽ ãã¬ã³ããªã³ã°ããªãããç解ããããã§ãã
ä»å°ãç·Žç¿ã IntersectionObserverã䜿çšããŠèŠçŽ ãããŒãããä»®æ³ã¹ã¯ããŒã«ãäœæãããã£ãã ã¿ã¹ã¯ã¯æ¬¡ã®ãããªãã®ã§ãã
- ã¿ã€ãã«ãåçãããã¹ããå«ãæçš¿ãå«ãç¡éã®ãã£ãŒãã
- æçš¿ã®å 容ãšãã®é«ãã¯äºåã«ããããŸããã
- ã³ã³ãã³ãã®ããŠã³ããŒãã®åæ¢ãªãã
- 60 fpsã
ãããŠããã®ã³ã³ããŒãã³ããæžããŠããéã«ç§ãç解ããããšã¯æ¬¡ã®ãšããã§ãã
- èŠçŽ ãåå©çšããŠãDOMã§æå°éã®æäœãè¡ãå¿ èŠããããŸãã
- ãªã¹ãå ã®ã¢ã€ãã ããšã«IntersectionObserverãäœæããå¿ èŠã¯ãªãã2ã€ã ãã§ãã
åäœåç
ã³ã³ãã³ãã¯ããããã12ã®æçš¿ã®éšåã«åå²ãããŸãã ã³ã³ããŒãã³ããåæåããããšããDOMã«ã¯ãã®ãããªéšåã1ã€ãããããŸããã§ããã æåãšæåŸã®éšåã«ã¯ãããããäžéšãšäžéšã«é衚瀺ã®èŠçŽ ããããŸãã ãããã®èŠçŽ ã®å¯èŠæ§ãç£èŠããŸãã ãããã®èŠçŽ ã®ãããããç»é¢ã«è¡šç€ºãããããæ°ããããŒããè¿œå ããäžèŠãªããŒããåé€ããŸãã ãããã£ãŠãDOMã«ã¯äžåºŠã«12ã®æçš¿ã®ãã¡2ã€ã®éšåããããŸãã
ã¹ã¯ããŒã«è¿œè·¡ããã䟿å©ãªãã®ã¯äœã§ããïŒ æçš¿ã®é«ããäžæãªå Žåã¯ãDOMã§èŠçŽ ãæ¢ããŠèªèããå¿ èŠããããŸãã ããŸã䟿å©ã§ã¯ãªããçç£çã§ããããŸããã
åºåã§ã¯ãäºåã«æªç¥ã®é«ãã®ç¡éã³ã³ãã³ãããã°ããã¬ã³ããªã³ã°ã§ããã³ã³ããŒãã³ããååŸããŸãã ãã¥ãŒã¹ãã£ãŒãã ãã§ãªãããããã¯ã§æ§æãããã³ã³ãã³ãã«ãåæ§ã®ãã®ã䜿çšã§ããŸãã
èšèãæžããã°ãã£ãšã¢ã¯ã·ã§ã³ïŒããã«ãã¢ããããŸãã ãããŠãããã§ã®ç®æšã¯ãå®éã®äŸã䜿çšããŠIntersectionObserverã®åäœã確èªããããšã§ãããšããäºå®ã«æ³šæããŠãã ããã
ããŒããæµfluentã«èŠãé床ã§ã¹ã¯ããŒã«ãããšãFPSãèŠãããšãã§ããŸãïŒç»åãã¯ãªãã¯ã§ããŸãïŒã
ã§ããã ãæ©ãïŒç»åãã¯ãªãã¯å¯èœïŒïŒ
FPSã60æªæºã«ãªãããšã¯ãã£ãã«ãããŸããããæ°ãã¬ãŒã ã§45以äžã«ãªããŸãããã©ãŠã¶ãäºåã«ç»åãšããã¹ãã®ãµã€ãºãèªèããŠããªãå Žåãè¯ãçµæãåŸãããŸãã
ãããã«
ããã¯ãIntersectionObserverã䜿çšããæãå°è±¡çã§æçšãªäŸã§ã¯ãããŸããã React / Vue / Polimerã³ã³ããŒãã³ããšçµã¿åãããŠäœ¿çšââããŠã¿ããšãããã«èå³æ·±ããã®ã«ãªããŸãã 次ã«ãã³ã³ããŒãã³ãã®åæåäžã«ãIntersectionObserverããã³ã°ããããã¥ãŒããŒãã«è¡šç€ºããããšãã«ã®ã¿åæåãç¶è¡ã§ããŸãã ããã¯å€§ããªãã£ã³ã¹ãéããŸãã æã亀差ãããã ãã§ãIntersectionObserverããããªãçºå±ãéãããšä¿¡ããŠããŸãã