ãã®åé¡ã䜿çšããŠãSuspenseããªãŒãã³ãœãŒã¹ã«ãªãªãŒã¹ããããã®æ®ãã®ã¿ã¹ã¯ã远跡ããŸãããã
unstable_
æ¥é èŸããAsyncMode
ïŒå€åïŒïŒ<div hidden>
ã§åäœããããšã確èªããŸã[ïŒ13089]lazyLoadComponent
ïŒflushAll
ã yield
ãªã©ã®ãããªãã¯APIãå®æãããReact.Placeholder
é¢é£ïŒã¿ã€ã ã¹ã©ã€ã·ã³ã°åïŒhttps://github.com/facebook/react/issues/13306ïŒ
unstable_AsyncMode
å ¬éããŸãïŒå€åïŒïŒ
ããã¯ãã§ã«å ¬éãããŠããŸãããïŒ
unstable_
ãåé€ãã
ååã®ãªãã³ãŒãåå²ã©ã€ãã©ãªã®ãªãŒãã³ãœãŒã¹ã楜ãã¿ã«ã
[å]ãšã¯ã©ãããæå³ã§ããïŒð€âïž
ã€ãŸããããã¯ããã€ãã®ãããžã§ã¯ã/ããã±ãŒãž/ããŒã«ã«åœ±é¿ãäžããæ©èœã§ãã
@ghoullierãªãã»ã©ãããããšãããããŸããïŒ
ãã@acdlite ãããã«æé©ãªæºåãããæ¹æ³ã«ã€ããŠã®è³ªåã§ãã ã©ããªçš®é¡ã®ã¿ã€ã ã©ã€ã³ãæ±ããŠããªã/æåŸ ããŠããªãããçåã«æã£ãŠããïŒ
çŸåšããããã®æ©èœãReact 16ã«çµã¿èŸŒãŸãã16.3ã§ãªãªãŒã¹ãããæ°ããContext APIã®ããã«ã段éçã«ç°¡åã«æ¡çšã§ããããšãæåŸ ããŠããŸããïŒ
ãããšããReactãv17ã«ããã·ã¥ããæ¡çšããããã«ããå€ãã®äœæ¥ãå¿ èŠã«ãªããšæããŸããïŒ
ç§ã¯ããªãã®ãªã¹ãã«ããã»ãšãã©ãã¹ãŠã®ãã®ãšå€§å¹ ã«äº€å·®ããããŒããããã«åãçµãã§ãããããã«å¯ŸåŠããããã®æåã®æ¹æ³ã暡玢ããŠããã®ã§ãå°ããŸãã
ãŸããæåã®æºåæ¹æ³ã«é¢ãããã³ãã¯ãããŸããïŒä»æ¥æžãããã³ãŒãã«é¢ããŠãReactã®ãããã®æ¹åãšå°æ¥äºææ§ãæããããïŒ-ããªãã£ã«/ãã¯ããã¯ãªã©ïŒ
ïŒãããã®è³ªåãä»ã®å Žæã§åçãããç§ãããããèŠéããå Žåã¯ãè©«ã³ããŸãïŒ
@JedWatsonã®è³ªåã«å¥ã®è³ªåãè¿œå ããŸãã
16.4.0-alpha.0911da3
ã§ããïŒããããšãïŒ â€ïž
IMOã圌ãã¯ãããäžéžããåã®ããã«ä»¥åã®ããã«ããã°æçš¿ãæäŸããã§ãããã
ãããŠãé倧ãªå€æŽããªããããããŸãæºåããå¿ èŠã¯ãªããšæããŸãïŒãµã¹ãã³ã¹ã䜿çšããreduxãã§ãããªã©ãçŸåšã®ãã©ã¯ãã£ã¹ãšã¯ç°ãªã/競åããŠããããã«èŠããå€ãã®æ©èœããããŸãããcodemodãŸãã¯ç°¡åãªã«ãã»ã«åããããŸããããè¡ãã«ã¯ãfbã«3W以äžã®ã³ã³ããŒãã³ãããããŸãïŒã ãŸãã @ acdlite ïŒZEITã®ssrãµã¹ãã³ã¹ã«ã€ããŠïŒãš@gaearon ïŒã¢ã€ã¹ã©ã³ãã®ã¯ã©ã€ã¢ã³ããµã¹ãã³ã¹ã«ã€ããŠïŒã®è©±ãèŠããšãããŸãå¿é ããå¿ èŠããªãã䟵襲çã§ã¯ãªãããšãããããŸãã
ã¡ãªã¿ã«ãã¬ãã§ãåãããŒãæ€çŽ¢ããã ãã§ãïŒ8830ãïŒ12152ãªã©ã®è©³çŽ°æ å ±ãèŠã€ãããŸãã
AFAIKã®ææ°ãªãªãŒã¹ã¯2æã®16.4.0-alpha.0911da3ã§ãã
IIRCãããã¯èª€æäœã§ããïŒ
Facebookã§ãµã¹ãã³ã¹ã¢ãžã¥ãŒã«ãšæ°ããAPIã®å±éã«åãçµãã§ããŸãã @acdliteãäœãä»ã®ããšã«å¿ããå Žåã«
çŸåšããããã®æ©èœãReact 16ã«çµã¿èŸŒãŸãã16.3ã§ãªãªãŒã¹ãããæ°ããContext APIã®ããã«ã段éçã«ç°¡åã«æ¡çšã§ããããšãæåŸ ããŠããŸããïŒ
React 16ãš17ã®ã©ã¡ããä»å±ãããã¯ããããŸãããReactããŒã ã«ãããšãFacebookã§ã®åäœããé¢é£ããAPIã®æºåç¶æ³ã«ãã£ãŠãä»å¹Žæ«ãŸã§ã«ãªãªãŒã¹ãããå¯èœæ§ããããŸãããããã ããããã³ãŒãã«é¢ããŠã¯ãFacebookã§ããªãé·ãéå®éšãè¡ã£ãŠããã®ã§ãæ¡çšããã®ã¯ç°¡åã ãšèšã£ãŠå¬ããã§ãã ãµã¹ãã³ã¹æ©èœã¯ãæ¢åã®ã³ãŒãããŒã¹ã§ãåŒãç¶ãæ©èœããŸãã ãã ããè¿œå ã®å€æŽïŒéåæã¬ã³ããªã³ã°ãªã©ïŒã䜿çšãããšãæ°æ©èœã«ãã£ãŠããããããããŒãã¹ãå¢ããŸãã
æåã®æºåæ¹æ³ã«é¢ãããã³ãã¯ãããŸããïŒä»æ¥æžãããã³ãŒãã«é¢ããŠãReactã®ãããã®æ¹åãšå°æ¥äºææ§ãæããããïŒ-ããªãã£ã«/ãã¯ããã¯ãªã©ïŒ
移è¡ã¯ããªã段éçã§é²æ©çã ãšæããŸãã @ NE-SmallTownãèšã£ãããã«ãç§ãã¡ã¯é倧ãªå€æŽãå°å ¥ããããããŸããã ã³ãŒãããŒã¹ãéåžžã«å€§ãããããFacebookã«å±éããã®ãé¢åã§ãã ãããããããŸã§ã®ãšãããå±éã¯ã¹ã ãŒãºã§ãããè¿œå ã®å€æŽãè¡ãå¿ èŠã¯ãããŸããã
@JedWatson
çŸåšããããã®æ©èœãReact 16ã«çµã¿èŸŒãŸãã16.3ã§ãªãªãŒã¹ãããæ°ããContext APIã®ããã«ã段éçã«ç°¡åã«æ¡çšã§ããããšãæåŸ ããŠããŸããïŒ
åŸã ã«ã åžžã«æ®µéçã«:)ããã§ãªããã°ãFacebookã§ãããåºè·ããæ¹æ³ã¯ãããŸããã
ãããç§ãæåŸ ããŠããããšã§ãïŒ
| | ã¯ã©ã€ã¢ã³ã| ãµãŒããŒåŽã®ã¬ã³ããªã³ã°|
| ----------------- | ---------------------------- |- -------------------------------------------- |
| ãµã¹ãã³ã¹| ã©ãã§ãåäœããŸã* | æ¢åã®ãµãŒããŒã¬ã³ãã©ãŒãšåãå¶çŽ|
| éåæã¬ã³ããªã³ã°| <AsyncMode>
ã䜿çšãããªããã€ã³| æ¢åã®ãµãŒããŒã¬ã³ãã©ãŒãšåãå¶çŽ|
*åæã¢ãŒãã§ã¯ã delayMs
ã¯åžžã«0
ã§ãã ãã¬ãŒã¹ãã«ããŒã¯ããã«è¡šç€ºãããŸãã
ãµã¹ãã³ã¹ã¯ãæ¢åã®ã³ã³ããŒãã³ãã«å€æŽãå ããããšãªãæ©èœããŸãã ããæç¹ã§<StrictMode>
äºææ§ãå¿
èŠã«ãªããããããªããšæã£ãŠããŸããããå
éšãã¹ãäžã«ãå³å¯ã¢ãŒãã«ã¢ããã°ã¬ãŒãããããã®æè¯ã®æ¹æ³ã®1ã€ã¯ãµã¹ãã³ã¹ã䜿çšããããšã§ããã é¶ãå
ãåµãå
ããšãããžã¬ã³ãã ããã§ãstrictã¢ãŒãã®å€ã§ãæ©èœãããæ¹æ³ãèŠã€ããŸããã
ã€ãŸãããŠãŒã¶ãŒã¯éåæã¬ã³ããªã³ã°ã«ç§»è¡ããæºåãã§ããåã§ãã£ãŠãããµã¹ãã³ã¹ãžã®ç§»è¡ãéå§ãããšããèãæ¹ã§ãã 次ã«ããµãããªãŒã®æºåãã§ãããã <AsyncMode>
ã©ããããŠãªããã€ã³ã§ããŸãã
ãã ããæ°ããã¢ããªã®å Žåã話ã¯ç°ãªããŸããããã©ã«ãã§éåæã«ãªããŸãã éåæã®ã¿ã®æ°ããã«ãŒãAPIïŒ ReactDOM.render
代ããïŒã玹ä»ããŸãã
æåã®ãªãªãŒã¹åŸãå€ãã®ãµãŒãããŒãã£ãã¬ãŒã ã¯ãŒã¯ïŒReduxãApolloãReact Router ...ïŒãéåæã¢ãŒãã§æ£ããæ©èœããªãå¯èœæ§ãããåä»ãªæéããããŸãã ããã¯ãã°ããã®éæ¡çšãå·ã€ãããããããŸããã ãããããã®èãæ¹ã¯ãæ°æ©èœãéåžžã«é åçã§ãããããã©ã€ãã©ãªãé©å¿ããããéåæäºæã®ä»£æ¿æ段ã«åã£ãŠä»£ããããã®ã«ããã»ã©æéã¯ããããªããšããããšã§ãã
ãŸããæåã®æºåæ¹æ³ã«é¢ãããã³ãã¯ãããŸããïŒä»æ¥æžãããã³ãŒãã«é¢ããŠãReactã®ãããã®æ¹åãšå°æ¥äºææ§ãæããããïŒ-ããªãã£ã«/ãã¯ããã¯ãªã©ïŒ
ãã¹ãŠã<StrictMode>
ã©ããããèŠåããªãããšã確èªããŸãã ãªãªãŒã¹ãè¿ã¥ãã«ã€ããŠããã詳现ãªç§»è¡ã¬ã€ããæäŸãããŸãã
æåã®ãªãªãŒã¹åŸãå€ãã®ãµãŒãããŒãã£ãã¬ãŒã ã¯ãŒã¯ïŒReduxãApolloãReact Router ...ïŒãéåæã¢ãŒãã§æ£ããæ©èœããªãå¯èœæ§ãããåä»ãªæéããããŸãã
ã¢ããã¯åä»ãªããšã¯ããŸãã-ç§ãã¡ã¯æºåãã§ããŠããŸãïŒ ðºð³
çé¢ç®ãªè©±ã§ãããç§ãã¡ã¯ïŒheartïŒãã¹ãŠãReactãªã®ã§ãæåã®ãªãªãŒã¹ã§ãããã®å€æŽã«å¯Ÿå¿ããŠããããšã確èªããããšã¯ãåªå 床ãé«ãã ãã§ãªããç§ãã¡ãéåžžã«è奮ããŠããããšã§ããããŸãã ãã®@acdliteã§ã®ãã°ãããäœæ¥ã«æè¬ããŸãïŒ
ãã£ã€ã ã鳎ãããŠãReduxããŒã ãReact-Reduxã®éåæäºææ§ã«åãçµãã§ãããšèšããŸãã
https://github.com/reduxjs/react-redux/issues/950ã§æœåšçãªããŒãããããã¬ã€ã¢ãŠãããŸããã TL; DRïŒ
<StrictMode>
ã§åäœããããšãé¡ã£ãŠããŸãïŒçŸåšã®PRïŒhttpsïŒ//github.com/reduxjs/react-redux/pull/980ïŒ<Provider>
ãšconnect()
ïŒã ãããéåæã¬ã³ããªã³ã°ã§ã©ãã»ã©ããŸãæ©èœããããèŠãŠãåé²ããããã®æè¯ã®éãèŠã€ããŸãã ïŒç§ã®ä»¥åã®æŠå¿µå®èšŒPRã¯https://github.com/reactjs/react-redux/pull/898ã«ãããŸããã5.1ã®äœæ¥ããåŠãã ä»ã®æèšã«åºã¥ããŠãããããããçŽããŸããïŒãã®ãªãªãŒã¹ã§ã¯ãæ°ããã³ã³ããã¹ããšãããããããŒãžãããã°ããã®ãŸã ãªãªãŒã¹ãããŠããªããã©ã€ããµã€ã¯ã«ã¡ãœããããã®ã³ã³ããã¹ãã®èªã¿åããPRãå¿
èŠãªãããå°ãªããšãReact16.5ãå¿
èŠã«ãªããŸããWIPã«ãã£ãšæ³šç®ããŠããã ããã°å¹žãã§ãããŸããReact Suspenseãšéåæã¬ã³ããªã³ã°ã§Reduxãã©ã®ããã«äœ¿çšããŠãããã«ã€ããŠããŠãŒã¹ã±ãŒã¹ãé©åã«ã«ããŒãããããã«ããã£ãŒãããã¯ããã£ã¹ã«ãã·ã§ã³ãæäŸããŠããã ããã°å¹žãã§ãã ãŸããReactããŒã ãšãã©ã®ãããªå¶çŽãåŠçããå¿ èŠããããã«ã€ããŠããã«è©±ãåãããšãæãã§ããŸãããã¹ãŠã®åé¡ã解決ããããã«å¿ èŠãªåé¡ã確èªã§ãããµã³ãã«ã¢ããªãå ¥æã§ããã°äŸ¿å©ã§ããããã¯æ£ããæ©èœããŸãã
éåæã¬ã³ããªã³ã°ãšãµã¹ãã³ã¹ã®ãªãªãŒã¹ã楜ãã¿ã«ããŠããŸã
@acdliteãµã¹ãã³ã¹ãšéåæã¬ã³ããªã³ã°ã«ã€ããŠã質åããŸãã
ç§ã®è³ªåã¯ãããããå°å
¥ãããŠããã®æ°ããããŒãžã§ã³ã®reactã§ã¢ããªãæžãå§ãããšãããã¯ãreact APIãšãreactã§ã®äººã
ã®ã³ãŒãã£ã³ã°æ¹æ³ãå€ããããšãæå³ããŸããïŒ ïŒãµã¹ãã³ã¹ãšéåæã¬ã³ããªã³ã°ã®æ©èœã䜿çšããäºå®ããªãå Žåã§ãïŒïŒ
ãµã¹ãã³ã¹ãšéåæã¬ã³ããªã³ã°ã䜿çšããŠreactã³ãŒããäœæããã®ã¯é£ãããšæããŸããïŒããããããã€ãã®æ°ããAPIãŸãã¯ãã®ä»ã®å¶çŽã®ããïŒããããå¿ èŠãšããªã人ã«ãšã£ãŠã¯ããªãæ°ããæ¹æ³ã§reactã䜿çšããããã«åŒ·å¶ããã®ã§ããïŒ ãããŠã圌ããä»ã®ããã«åå¿ããŠã³ãŒãã£ã³ã°ããããšãèš±å¯ããŸãããïŒ
ãµã¹ãã³ã¹ã§reactã³ãŒããæžãã®ã¯é£ãããããããªããšæããŸã
ç§ã®è©±ã®åŸåãèŠãæ©äŒããããŸãããïŒ ç§ã¯ãŸã£ããéã ãšæããŸãâããŒã¿ãã§ããã«ãµã¹ãã³ã¹ã䜿çšããããšã¯ãä»ã®äœãããïŒReduxãããŒã«ã«ç¶æ ããŸãã¯ä»ã®ã©ã€ãã©ãªãå«ãïŒãã¯ããã«é£ããããšã§ã¯ãããŸããã
@gaearonç§ã¯ããŠããŸããã ç§ã¯çè«çã«ãã£ãšè©±ããŠããŸããã åå¿ãç¥ã£ãŠãã人ã ã®ã»ããããã§ã«ãããšæ³åããŠãã ããã 人ã ãéåæã¬ã³ããªã³ã°ãšãµã¹ãã³ã¹ã®æ©èœãå¿ èŠãšããªãã®ãªãããªã圌ãã«ãæ°ãããåå¿ãåŠã°ããã®ã§ããããïŒ ç¹ã«ãæ°ãããåå¿ã䜿çšããã®ãé£ããå Žåã¯ã©ãã§ããããã ãããïŒç§ã¯ååãªæ å ±ãæã£ãŠããªãã®ã§ããããªãããŒããªéšåã«ã€ããŠééã£ãŠèšããããããŸãã-ç§ã¯ç§ã®èãã®ããã€ããå ±æããŠããã ãã§ã:)ã
ããæå³ã§ãã¢ããªã®10ïŒ ã«ãµã¹ãã³ã¹ãšéåæã¬ã³ããªã³ã°ã®æ©èœãå¿ èŠãªå Žåãä»ã®90ïŒ ã®ã±ãŒã¹ã§ã¯ããªã人ã ã«ãæ°ãããåå¿ãåŠã°ããã®ã§ããããã ãããããµã¹ãã³ã¹ãšéåæã¬ã³ããªã³ã°ã«é¢ããæ å ±ããŸã å€ãåéããŠããªãã£ããããééã£ãŠããå¯èœæ§ããããŸãã
ç§ã®ãã¢ããŸã èŠãŠããªããšãäŒè©±ãããã®ã¯é£ãããšæããŸãã
æ確ã«ããããã«ïŒ ãæ°ããReactãã¯ãããŸããããããã®æ©èœã¯æ¢åã®ãã¿ãŒã³ãå£ããŸããðã ãããã¯çžå çã§ãã ãããã®æ©èœã䜿çšããããã«ããŸã£ããç°ãªãæ¹æ³ã§ã³ãŒããèšè¿°ããå¿ èŠããããŸããããã ããäžéšã®æ©èœã¯ãææ°ã®ã©ã€ããµã€ã¯ã«ã¡ãœããã
ããã¯ããªãã®æžå¿µãšã¯çŽæ¥é¢ä¿ãããŸããããç§ã¯ããããã䜿çšããã®ãé£ããããšããããšã«åæããŸããã ãµã¹ãã³ã¹ã¯ãçŸåšååšããä»ã®ã©ã®ããŒãã¡ã«ããºã ãããã¯ããã«ç°¡åã«äœ¿çšã§ãããšæããŸãã ãããç§ããšãŠãè奮ããŠããçç±ã§ãã ãã ããå¿ èŠããªããã°ãæ°ããæ©èœå€ããã¿ãŒã³ã¯æ©èœãç¶ããŸãã
ç§ã¯æ¬åœã«ç§ã®è©±ãèŠãããšããå§ãããŸãã ãããã®æ©èœãå®éã«åäœããŠããã®ãèŠããšãããã¯ãã£ãšçã«ããªã£ãŠãããšç¢ºä¿¡ããŠããŸãã
@gaearon
å€ããã¿ãŒã³ã¯ãã¹ãŠæ©èœãç¶ããŸãã
ãã£ãŒãããã¯ãããããšããã³ã ããã§ãããããããæ©èœãå¿ èŠãªãã®ãªããæ©èœãè¿œå ãããåã®ããæ¹ã§æžããã¯ãã ãšæããŸãã
幞éãã
ã¡ãã£ãšãã³ïŒ@gaearonïŒãç§ã¯ã€ãŸããªãããšã§ã¯ãããŸãããããããç解ããããšæããŸãã ããªãã®äžã«èšã£ãïŒ
ãã ããå¿ èŠããªããã°ãæ°ããæ©èœã䜿çšããå¿ èŠã¯ãããŸããã å€ããã¿ãŒã³ã¯æ©èœãç¶ããŸãã
ããã¯ããå€ããReactã§è¡ã£ãã®ãšåãæ¹æ³ã§æ°ããReactã§ã³ãŒãã£ã³ã°ã§ããããšã瀺åããŸããããšãã°ãã©ã€ããµã€ã¯ã«ã¡ãœãããåãæ¹æ³ã§äœ¿çšã§ãããªã©ã§ãã
ãã ããããã§ãbvaughnã¯ãgetDerivedStateFromPropsïŒãŸãã¯componentWillReceivePropsïŒã¯ã1åã®æŽæ°ã§äœåºŠãåŒã³åºãããå¯èœæ§ãããããããã®äžã®ããŒã¿ããã§ããããªããœãªã¥ãŒã·ã§ã³ã§ãããšè¿°ã¹ãŠããŸãã
ã ããç§ã®è³ªåã¯ãçµå±ã®ãšãããæ°ããReactã以åãšãŸã£ããåãããã«äœ¿çšããããšã¯ã§ããªãããã§ãããïŒ çŸåšã®reactcomponentWillReceivePropsã®AFAIKã¯ã1åã®æŽæ°ã§äœåºŠãåŒã³åºãããªãã®ã§ãããã§ã¯ãããŸãããïŒ
@ giorgi-mïŒã¯ããã©ã€ããµã€ã¯ã«ã¡ãœããã¯å€æŽãããŠããŸãããèŠç¹ã¯ããµã¹ãã³ã¹èªäœããªããã€ã³æ©èœã§ãããšããããšã§ãã æ¢åã®ãã¹ãŠã®Reactã¬ã³ããªã³ã°ã¡ãœãããšReactã®ã¬ã³ããªã³ã°åäœã¯ãã®ãŸãŸæ©èœããŸãã ãã ããã¢ããªã®äžéšã«<AsyncMode>
ã¿ã°ãè¿œå ããŠãªããã€ã³ãããšãéåæããŒã¿ã®ããŒãºã瀺ãããã«Suspenseã®ã¢ãããŒãã䜿çšãå§ãããããå©çšã§ããããã«ãªããŸãã ãããã³ãŒãããŒã¹ã«è¿œå ããªããšãããã¯èµ·ãããŸããã
@ giorgi-m componentDidUpdate
componentWillReceiveProps
ãŸãã¯getDerivedStateFromProps
代ããã«componentDidUpdate
ã䜿çšããå¿
èŠããããŸãã
@markeriksonã€ãŸããããã§bvaughnãèšã£ãããšã¯ã <AsyncMode/>
æå¹ã«ããŠããªãå Žåã1åã®æŽæ°ã§_getDerivedStateFromProps_ãäœåºŠãåŒã³åºãããšãã§ãããšããããšã§ãããå¿
ããããããšã¯éããŸããã
ïŒãã®ãããªè³ªåãããŠç³ãèš³ãããŸããããæã
ç§ã«ãããã¢ãããããã¹ãŠãã«ããŒãããªãœãŒã¹ãèŠã€ãããŸããã§ããïŒã
psã bvaughnã¯ãŸãããªã³ã¯ãããã¹ã¬ããã§ããã®ãªãã·ã§ã³æ§ã«ã€ããŠèšåããŠããªãã£ãã®ã§ãããã¯ç§ã®çããåŒãèµ·ãããŸããã
éåææŽæ°ããã¥ãŒã«å
¥ããããã®ã¡ãœããïŒããšãã°ãã¬ã³ãã©ãŒåºæã®unstable_deferredUpdates()
ã§ã¯ãªãã¯ã©ã¹ã³ã³ããŒãã³ãã®deferSetState()
unstable_deferredUpdates()
ïŒãã³ã¢ãã§ãã¯ãªã¹ãã«è¿œå ããå¿
èŠããããŸããïŒ
ç§ã®ç解ã§ã¯ãéåæmode
ãã¡ã€ããŒã®æŽæ°ã¯éåæã«ãªããŸããã€ãŸããçè«çã«ã¯deferSetState()
ã¯äžèŠã§ãã ãã ãã unstable-async/suspense
ãã¢ã§ã¯ãåææŽæ°ãšéåææŽæ°ãæ··åšããŠããããã async
ã¢ãŒãïŒããŠãããŒãµã«ãã³ã³ããŒãã³ãã®å ŽåïŒã§ãããã©ã®ããã«å®è¡ã§ãããããããŸããã
ã¿ã€ã ã¹ã©ã€ã¹åã®ãã§ãã¯ãªã¹ãã«èŒã£ãŠããŸãã
ã³ã³ããŒãã³ãã¿ã€ããšããŠpromiseããµããŒã
ããã«é¢é£ããŠãããªããæã£ãŠãããšãïŒ
const PromiseType = new Promise(() => {})
class A extends Component {
componentDidMount() {}
componentDidUpdate() {}
render() {
return <div><PromiseType></PromiseType></div>
}
}
componentDidMount
ãšcomponentDidUpdate
ã©ã€ããµã€ã¯ã«ããã€åŒã³åºããããã«ã€ããŠã®ãã¥ãŒãªã¹ãã£ãã¯ã¯ãããŸããã
@thysultan ïŒ componentDidMount
ãšcomponentDidUpdate
ã¯ãUIããªãŒãå®å
šã«ã¬ã³ããªã³ã°ãããŠDOMã«é©çšããããšãã«ãã³ããããã§ãŒãºã§åŒã³åºãããŸãã
ãããã£ãŠããµã¹ãã³ã¹ã«ã€ããŠã®ç§ã®ç解ã«åºã¥ããšãçãã¯ã A
ã€ã³ã¹ã¿ã³ã¹ãå®éã«ããŠã³ããããããšã¯æ±ºããŠãªããšããããšã ãšæããŸãã PromiseType
_did_ã解決ããããããã®åå«ã®1ã€ã解決ãããªãçŽæãåŸ
ãšããšããå Žåãåã³ããŠã³ããããããšã¯ãããŸããã ãããã£ãŠããããã®äŸã§ã¯cDM
ãšcDU
ã¯å®è¡ãããŸããã
ïŒããã§ç§ã®ä»®å®ãééã£ãŠããå Žåã¯ã誰ããç§ãä¿®æ£ããŠãã ãã:)ïŒ
ããã componentDidMount
ãŸãã¯componentDidUpdate
ã¯ãããªãŒå
šäœã解決ãããåŸã«ã®ã¿å®è¡ãããã³ããããã§ãŒãºã§ã®ã¿å®è¡ãããŸãã ãã®ããªãŒã«ã¯ãæ瀺çã«é
眮ãããã¬ãŒã¹ãã«ããŒãå«ãŸããŠããå ŽåããããŸãïŒååã«åŸ
æ©ããåŸãããã®äžã®äœããäžæãããã©ããã«ãã£ãŠç°ãªããŸãïŒããã ãããã¬ãŒã¹ãã«ããŒãªãã§åãæ瀺çã«ã¬ã³ããªã³ã°ãããšãæçµçã«ã¯ãæºåãã§ããŠããªããç¶æ³ã
ç§ã¯ããã§éã¶ããšãã§ããããšãæ¬åœã«æ¥œãã¿ã«ããŠããŸãïŒããªãããŸã ã¯ãŒã«ãã¯ã€ããŠã§ãã«ããã®å®çšçãªããŒãžã§ã³ã眮ããŠããªãããšãç解ããããã ãã«ããããã®ãœãŒã¹ã³ãŒããé²èŠ§ããŸããïŒã
ããããªãªãŒã¹ããããã«ç§ãã¡ã«ã§ããããšã¯ãããŸããïŒ ïŒD
ãã¬ã€ãããå Žåã¯ããã¹ã¿ãŒããã³ã³ãã€ã«ã§ããŸãã fixtures/unstable-async/suspense
æé ãåç
§ããŠãã ãã
@gaearonããã¯çŸåšã®ç¶æ ã®ã¯ã©ã€ã¢ã³ãåŽã®ã¿ã§ãããšç§ã¯æ£ããã§ããïŒãµãŒããŒåŽã®ã¬ã³ããªã³ã°ããµããŒãããããã«ããã«å€ãã®äœæ¥ãè¡ãå¿ èŠããããŸãïŒïŒ
ç·šéãçããèŠã€ããŸããïŒãŠãããŒãµã«ã¢ããªã®SSRã§ãµã¹ãã³ã¹ã䜿çšããããšãç±å¿ã«æ¢ããŠããä»ã®äººã®ããã«ã ç§ã¯ãããä»ã®ãšããã¯ã©ã€ã¢ã³ãåŽã§ããããšãç§ãã¡ã«ç¥ããããã³ã«ããhttps://www.youtube.com/watch?v=z-6JC0_cOnsã瀺ããŠã
å®éãSSRã®ã±ãŒã¹ã«é¢é£ããäœæ¥ãéããªãéå§ããŸãã
ããŒãšã³ãã®ã¢ãã€ã«ããã€ã¹ã§å®è¡ãããŠããéåæReactã¢ããªã§ãã®ã·ããªãªãæ³åããŠã¿ãŠãã ããã
ãã®åé¡ã¯ããµã¹ãã³ã¹ã§èª¬æããã®ãšåã<Placeholder>
ãã¯ããã¯ã䜿çšããŠåé¿ã§ããŸããããšãã°ã1ç§åŸã«ã¹ãããŒã衚瀺ãããŸãã
ãã®ã·ããªãªã¯èæ
®ãããŠããŸããïŒ <Placeholder>
ã¯é
ãéåæã¬ã³ããªã³ã°ã§æ©èœããŸããïŒ
@luisherranzãããé²ãã«ã¯2ã€ã®ã¡ã«ããºã ããããŸãã
Reactã«ã¯ããã¹ãŠã®æŽæ°ã«é¢é£ä»ããããæéããããŸãã ã¯ãªãã¯ããã®ãããªä»ã®ã€ã³ã¿ã©ã¯ã·ã§ã³ããã®æŽæ°ã¯ãããé·ãæéãæ瀺çã«éžæããªãéããçŽ150ããªç§ä»¥å ã«ãã©ãã·ã¥ãããã¯ãã§ãïŒããšãã°ãå¿ é ã§ã¯ãªãæŽæ°ã®å ŽåïŒã ãã®ãããäœããã¹ã¬ãããå æããŠããå ŽåãReactã¯åæçã«ãã©ãã·ã¥ã匷å¶ããŸãã
Reactã¯ãå®éã«ã¯requestIdleCallback
䜿çšããªããªããŸãããããã¯ãå®éããã©ãŠã¶ãŒããããã¹ã±ãžã¥ãŒã«ããã®ã«ååç©æ¥µçã§ã¯ãªãããã§ãã æ£ç¢ºãªã¹ã±ãžã¥ãŒãªã³ã°ã¢ãããŒããæéã®çµéãšãšãã«å€åããå¯èœæ§ããããŸãããããã¯ééããªãç§ãã¡ãæ°ã«ãããŠããããšã§ãã
ãã³ã®çŽ æ©ãåçã«æè¬ããŸãã
- Reactã«ã¯ããã¹ãŠã®æŽæ°ã«é¢é£ä»ããããæéããããŸã
çŽ æŽãããã ãã¹ãã§ããAPIã¯ãã§ã«çšæãããŠããŸããïŒ
- Reactã¯å®éã«ã¯requestIdleCallbackã䜿çšããªããªããŸãããããã¯ãå®éã«ãã©ãŠã¶ãŒããããã¹ã±ãžã¥ãŒã«ããã®ã«ååç©æ¥µçã§ã¯ãªãããã§ãã
ããã¯ç§ãã¡ãå®éšããããšã§ãã TwitterãYouTubeããã®å€éšåºåãåã蟌ã¿ãããæ··éããã¢ããªã§ã¯ã requestIdleCallback
ãåŒã³åºãããŠã¬ã³ããªã³ã°ãå®äºãããŸã§ãæ°ç§ãããå ŽåããããŸãã ã ããðããã«ã
ãšããã§ãç§ãã¡ã«ãšã£ãŠãããªãã®æåã®çãã«é¢é£ããå¥ã®ãŠãŒã¹ã±ãŒã¹ããããŸãïŒç§ãã¡ã¯2ã€ã®ãªãã»ãããæã€ã¬ã€ãžãŒããŒãã䜿çšããããšããŠããŸãã 1ã€ç®ã¯éåæã¬ã³ããªã³ã°ãããªã¬ãŒãã2ã€ç®ã¯éåæãçµäºããŠããªãå Žåã«åæã¬ã³ããªã³ã°ãããªã¬ãŒããŸãã ãã®ãããªãã®ïŒ
ãããã£ãŠãæéã®ä»£ããã«ã2çªç®ã®ããªã¬ãŒã§ãã©ãã·ã¥ãå¶åŸ¡ããããšæããŸãã ããã¯æå³ããããŸããïŒ ããã¯å¯èœã§ããããïŒ
ãã¹ãã§ããAPIã¯ãã§ã«çšæãããŠããŸããïŒ
ãã¹ã¿ãŒãæå³ãããã©ããã¯ããããŸãããïŒéåæã¢ãŒãã¯npmãªãªãŒã¹ã§ã¯å ¬åŒã«ã¯å©çšã§ããŸããïŒãæå¹æéã¯ãã¹ãŠã®æŽæ°ã«èªåçã«å²ãåœãŠãããŸãã ã¯ãªãã¯ãªã©ã®ã€ãã³ãã®å Žåãæ¬çªã¢ãŒãã§ã¯çŽ150ããªç§ã§ãã ç¹å¥ãªäžå®å®ãªAPIãå¿ èŠãªå Žåã¯ã延æãããïŒããé·ãïŒæŽæ°ãéžæã§ããŸãããèšå®ããããšã¯ã§ããŸããã
ãããã£ãŠãæéã®ä»£ããã«ã2çªç®ã®ããªã¬ãŒã§ãã©ãã·ã¥ãå¶åŸ¡ããããšæããŸãã ããã¯æå³ããããŸããïŒ ããã¯å¯èœã§ããããïŒ
ãããããã¯å¯èœã§ãã ç§ã¯ããã§ãã®ãããªã¡ã«ããºã ã説æããŸããïŒ https ïŒ//github.com/oliviertassinari/react-swipeable-views/issues/453#issuecomment-417939459ã
ãã¹ã¿ãŒãæå³ããã®ãã©ããã¯ããããŸããïŒéåæã¢ãŒãã¯npmãªãªãŒã¹ã§ã¯å ¬åŒã«ã¯å©çšã§ããŸããïŒ
ã¯ãã <unstable_AsyncMode>
ã flushSync
ã unstable_deferredUpdates
ã®npmããã±ãŒãžã䜿çšããŠããŸãã
npmã«ãããã®å€æŽãå ããŠãã¢ã«ãã¡/ããŒã¿ããŒãžã§ã³ã®ãªãªãŒã¹ãéå§ããŠãã ããã ð
ãããããã¯å¯èœã§ãã ç§ã¯ããã§ãã®ãããªã¡ã«ããºã ã説æããŸããïŒoliviertassinari / react-swipeable-viewsïŒ453ïŒã³ã¡ã³ãïŒã
çŽ æŽãããã unstable_deferredUpdates
ã䜿çšããçŸåšã®å®è£
ãããã¯ããã«åªããŠããŸã:)
<div hidden>
䜿çšãéå§ããã®ãåŸ
ã¡ãããŸããã ããªããã¡ã¯çŽ æŽãããä»äºãããŠããŸãã
@luisherranz泚æããŠãã ããããããã®ãã®ã¯äžå®å®ã§ãã ãã°ãããããããªãéå¹ççã§ããå¯èœæ§ããããŸãïŒããšãã°ãéèŠãªæé©åïŒãåéãïŒã¯ãŸã å®è£
ãããŠããŸããïŒã æ°ããschedule
ã¢ãžã¥ãŒã«ïŒ schedule.unstable_scheduleWork
ïŒãåªå
ããŠã unstable_deferredUpdates
ãåé€ããŸãã
ã¯ããã¢ããªã®ããäžéšã«ã®ã¿äœ¿çšããéäžçã«ãã¹ãããŠããŸããããããŸã§ã®ãšããéåžžã«åªããŠããŸã:)
ãªããããã¯ã«ãªãå¯èœæ§ããããŸãïŒ
requestIdleCallback
ã¯1ç§éã«20åããåŒã³åºãããŸãã-6x2ã³ã¢ã®Linuxãã·ã³äžã®Chromeã¯ãUIäœæ¥ã«ã¯ããŸã圹ç«ã¡ãŸããã
requestAnimationFrame
ã¯ããé »ç¹ã«åŒã³åºãããŸãããååã瀺ãã¿ã¹ã¯ã«åºæã§ãã
ãã®ããã requestIdleCallback
䜿çšãåæ¢ããŸããã
requestIdleCallback
代ããã«äœã䜿çšããŠããŸããïŒ
ãã¡ããã æããªç§ã ã¹ã±ãžã¥ãŒã©ã¢ãžã¥ãŒã«ãrequestIdleCallback
代ããã«å
éšã§ã©ã®ãã©ãŠã¶APIã䜿çšããã®ãçåã«æããŸããã ãã£ãšã¯ã£ãããšè³ªåãæ瀺ãã¹ãã ã£ãã ð
ãããèŠã€ããã
https://github.com/facebook/react/blob/eeb817785c771362416fd87ea7d2a1a32dde9842/packages/scheduler/src/Scheduler.js#L212 -L222
ããã¯æ¬¡ã®ã¬ãã«ã®ã¯ãŒã«ã§ãã
ããã«ã¡ã¯ã
ãµã¹ãã³ã¹ãç解ããããšããŠãããšãã«ã Suspend
ã³ã³ããŒãã³ãã䜿çšããŠãããšãã«ã¢ããªã®ã©ã®éšåãå®éã«ãäžæåæ¢ããããŠããã®ãããããªãããšã«æ°ã¥ããŸããð³ð±ã
次ã®äŸã§ã¯ã Title
ãããã«è¡šç€ºããã Spinner
1000ããªç§åŸã«ã UserData
ã2000ããªç§åŸã«è¡šç€ºããããšäºæ³ããŸãïŒãã®ã³ã³ããŒãã³ãã®ããŒã¿ã®ãããŒããã«ã¯2000ããªç§ãããããïŒã
ããããç§ãèŠãŠããã®ã¯ã Title
ã1000msåŸã«Spinner
ãšäžç·ã«æåã«è¡šç€ºãããããšã§ãã
// longRunningOperation returns a promise that resolves after 2000ms
const UserResource = createResource(longRunningOperation);
function UserData() {
const userData = UserResource.read(cache, "Lorem Ipsum");
return <p>User Data: {userData}</p>;
}
function Spinner() {
return <h1>Fallback Loading Spinner</h1>;
}
function Title() {
return <h1>Hello World</h1>;
}
function App() {
return (
<React.Fragment>
<Title />
<Suspense maxDuration={1000} fallback={<Spinner />}>
<UserData />
</Suspense>
</React.Fragment>
);
}
unstable_createRoot(document.getElementById("mount")).render(<App />);
ïŒReact 16.6.0-alpha.8af6728ã䜿çšããå®å šãªäŸã¯ããcodesandboxã«ãããŸãïŒ
Title
ããã«è¡šç€ºããŠãã¢ããªã±ãŒã·ã§ã³ã®ä»ã®éšåã ãããäžæåæ¢ãããæ¹æ³ã¯ãããŸããïŒ ãããšãããããããµã¹ãã³ã¹ãå®å
šã«èª€è§£ããŸãããïŒ ïŒãã®çš®ã®è³ªåãããããè¯ãæ¹æ³ãããã°ãç§ã«ç¥ãããŠãã ããïŒ
ããããšãïŒ
ããã«ã¡ã¯@nilshartmannïŒ çŽ æŽããã質åã§ãïŒ
ã¿ã€ãã«ãããã«è¡šç€ºããŠãã¢ããªã±ãŒã·ã§ã³ã®ä»ã®éšåã ãããäžæåæ¢ãããæ¹æ³ã¯ãããŸããïŒ
ç§ãæ£ããç解ããŠããå Žåã¯ããã®äŸã®ããã«Title
ãDOMã«ãã©ãã·ã¥ããåã«ãReactã«æ瀺çã«_åŸ
æ©ããªã_ããã«æ瀺ããŠã Title
ããã«è¡šç€ºããä»ã®éšåã®ã¿ããäžæåæ¢ãããå¿
èŠããããŸããããã«ã¬ã³ããªã³ã°ããããšäºæ³ãããéšåã<Suspense maxDuration={0}>
ã©ããããããšã«ãããã¢ããªã±ãŒã·ã§ã³ã®äžéšãäœæããŸãã
ããã¯ãåºç€ãšãªãäœã¬ãã«ã®ã¹ã±ãžã¥ãŒã©ã¡ã«ããºã ãåå ã§ãããšæããŸããïŒ ç§ãããããã£ãšããç解ãããã®ã§ãããããã§ä»ã®ãšããããªãã®åé¡ã¯è§£æ±ºããã¯ãã§ãã
å®éã«ããã§äœãèµ·ãã£ãŠããã®ãèããŠè奮ããŠããŸãã
ïŒãã®çš®ã®è³ªåãããããè¯ãæ¹æ³ãããã°ãç§ã«ç¥ãããŠãã ããïŒ
ãããããããŸããã ðããã¯ç§ã«ã¯éåžžã«æçœã«æããŸãã 質åããŠãããŠããããšãïŒ
@TejasQç§ã®ãã©ãŠã¶ã§ã¯ããµã³ãã«ãããŒããããšããã©ãŒã«ããã¯ã¹ãããŒãããã«ã¬ã³ããªã³ã°ãããŸãã 1000msåŸã«ããŒãããã¹ãã§ã¯ãããŸãããïŒ
@TejasQã¯ããªãã®çãã«æè¬ããŸããããã@karlhorkyã¯æ£ããã§ãïŒä»ã¹ãããŒã¯ããã«çŸããŸãã
ãããïŒ ç§ã¯éããŸããã ç§ã¯è©Šããã ð ãããããäžåºŠèŠãŠãããªãã«æ»ã£ãŠããŸãããã ç§ã¯äœããéããã«éããªãã ð€·ââïž
ãæŽæ°ïŒç§ã¯ããã§ãããç解ããããšããŠããŸãã誰ãããªã¢ã«ã¿ã€ã ã§äžç·ã«ãããè¡ãããšã«èå³ãããã°ãç§ãã¡ã¯ååããããšãã§ããŸããã
2çªç®ã®æŽæ°ïŒ @ philipp-spiessãšç§ã¯ãããèŠãŸããããããŠç§ã¯æ¬åœã«å°æããŠããŸãã ç§ã¯ãŸã ãããç解ããŠããŸããã çŸæç¹ã§ã¯ããããå®éã«ã¯unstable_
ãšã¢ã«ãã¡æ©èœã§ããããããã°ãªã®ãããããšãåã«è¡šç€ºãããŠããªããã®ãªã®ãã¯ããããŸããã
ã©ã¡ãã®å Žåã§ããã³ã¢ããŒã ã¯åœ¹ç«ã€åçãåŸããã質åã䜿çšããŠReactãããã«åªãã/ãã芪ãã¿ããããã®ã«ããããšãã§ãããšæããŸãã
圌ããäœãèšããªããã°ãªããªããèŠãŠã¿ãŸãããã ðãããææããŠãããŠããããšãã@ nilshartmannïŒ
ããã¯Reactv16.6ã®äžéšãšããŠãªãªãŒã¹ãããŸãããïŒ ããã°æçš¿ã«ã¯ãSuspenseã䜿çšãããµã³ãã«ã³ãŒãã瀺ãããŠããŸãã
import React, {lazy, Suspense} from 'react';
const OtherComponent = lazy(() => import('./OtherComponent'));
function MyComponent() (
<Suspense fallback={<div>Loading...</div>}>
<OtherComponent />
</Suspense>
);
ããã¯Reactv16.6ã®äžéšãšããŠãªãªãŒã¹ãããŸãããïŒ
é 延èªã¿èŸŒã¿ã®ãŠãŒã¹ã±ãŒã¹ã®ã¿ãããã³åæã¢ãŒãã®ã¿ã 䞊è¡ã¢ãŒãã¯åŒãç¶ãWIPã§ãã
@nilshartmann
次ã®äŸã§ã¯ãTitleãããã«è¡šç€ºãããSpinnerã1000ããªç§åŸã«ãUserDataãçŽ2000ããªç§åŸã«è¡šç€ºããããšäºæ³ããŸãïŒãã®ã³ã³ããŒãã³ãã®ããŒã¿ã®ãããŒããã«ã¯2000ããªç§ãããããïŒã
maxDuration
æ©èœã«ã€ããŠå°ãæ··ä¹±ããŠãããšæããŸãã ããã¯æ°ããã¡ã³ã¿ã«ã¢ãã«ã§ããããããææžåããæéã¯ãŸã ãããŸããã ãã®ããã䞊è¡ã¢ãŒããå®å®ãããªãªãŒã¹ã«ãªããŸã§ããã°ããæ··ä¹±ãç¶ããã§ãããã
ããã¯ã®ææ¡ãçºè¡šããŠããã§ãšãããããŸãã ããŒã ãšäœããå ±æããããšæããŸãã å°ãåã«ãSuspenseã«äŒŒãæ©èœãæã€ReactAsyncãšããã³ã³ããŒãã³ãããªãªãŒã¹ããŸããã åºæ¬çã«ãPromiseã®è§£æ±ºãåŠçããisLoadingãstartedAtãreloadãcancelãªã©ã®ã¡ãœããããã¹ãŠå®£èšåAPIã§æäŸããŸãïŒ useAsyncããã¯ãé²è¡äžã§ãïŒã
ä»ãç§ã®äž»ãªé¢å¿äºã¯ãããããµã¹ãã³ã¹ãšã©ã®ããã«çµ±åããããã§ãã ã»ãšãã©ã®å Žåãç§ã¯ããããReactAsyncã®SuspenseAPIã䜿çšããŠãSuspenseã®ã¹ã±ãžã¥ãŒãªã³ã°æ©èœãç¡æã§æäŸããªããã䜿ãæ £ããã·ã³ãã«ãªReact AsyncAPIããŠãŒã¶ãŒã«æäŸã§ããŸãã ç§ãèŠãŠããããšã«ã€ããŠã¯ãReact Async APIã¯ãããæœè±¡çãªSuspense APIãšæ¯èŒããŠãããè³¢æã§èŠªãã¿ããããã®ã ãšå¿ããæã£ãŠããŸãã åºæ¬çã«ãReact Asyncã¯ããŠãŒã¹ã±ãŒã¹ã®ãããã«å°ãããµãã»ããã§æ©èœããããå ·äœçãªAPIãæäŸããããšããŸãã
ReactCacheã©ã€ãã©ãªãç¥ã£ãŠé©ããã React Asyncã®å Žåãç§ã¯æå³çã«ãã£ãã·ã¥ã¡ã«ããºã ãå«ããŸããã§ããããããã©ãããã¹ãåŠçããããšãéžæããŸããã ãã®äžã«ãã£ãã·ã¥ãè¿œå ããã®ã¯ããªãç°¡åã§ãã
æåŸã«ãã«ã¹ã¿ã ããã¯ãããµã¹ãã³ã¹æ©èœã«ã¢ã¯ã»ã¹ããããšãæžå¿µããŠããŸãã ãµã¹ãã³ã¹ã¯ããã€ãã®çµã¿èŸŒã¿ã³ã³ããŒãã³ãã«å€§ããäŸåããŠããããã§ãããã¯ãããããã䜿çšããããšã¯äžå¯èœã§ãïŒç§ã¯æããŸããïŒïŒã ãµã¹ãã³ã¹ããã¯ã¯ãããŸããïŒ ãŸãã¯ã2ã€ãçµ±åããä»ã®æ¹æ³ã¯ãããŸããïŒ
ããã«ã¡ã¯ã Suspense / Lazyã§ã³ãŒãããã¹ãããã«ã¯ã©ãããã°ããã§ããïŒ
çŸåšãrenderer.createïŒ...ïŒtoTreeïŒïŒãã¹ããŒããŸã
ãtoTreeïŒïŒã¯ãtag = 13ã®ããŒããåŠçããæ¹æ³ããŸã ç¥ããŸããã
Suspense
ã®å°éå
·maxDuration
ããåæã¢ãŒããšåæã¢ãŒãã®äž¡æ¹ã§ã¯ãªãã Concurrent Mode
ã§ã®ã¿äœ¿çšãããçç±ã 誰ãã説æããã®ãæäŒã£ãŠããããŸããïŒ
ïŒçŸæç¹ã§ã¯ïŒ Concurrent Mode
ããã®ããªãŒãä¿çã«ããŠããã匷å¶çã«ã³ããããããŸã§ã®æéãæå³ããŸããããã¯ãã¿ã€ã ã¹ã©ã€ã¹ã®æéãå¹æçã«å¶åŸ¡ããåæã¢ãŒãã§ã¯ã¿ã€ã ã¹ã©ã€ã¹ã¯ååšããŸããã ããªãŒãã³ãããããåã«åŸ
æ©ãããšãå¿
ç¶çã«ã³ããããè¡ãããŸã...åæã§ã¯ãããŸããã
ç§ã¯ããŒã¿ãã§ããçšã®å éšã¢ããªã±ãŒã·ã§ã³ã§Suspenseã䜿çšããŠããŸããããããŒã¿ãã§ããçšã«ãŸã 䜿çšãããŠããªãçç±ã«ããã«æ°ä»ããŸããã
ãã ããæçµçã«ã¯ãããŒã¿ã®ãã§ããã«äœ¿çšããããšãç®çãšããŠããŸãã ãããããã£ãã·ã¥ãããã€ããŒãé€ããŠAPIãå€§å¹ ã«å€æŽãããå¯èœæ§ã¯äœããšæãããå ŽåãããŒã¿ããã§ããããåŸã«ããŒã¿ãå€æŽããå¿ èŠãããå ŽåãSuspenseã¯ã©ã®ããã«æ©èœããã®ã§ããããã
äŸãšããŠãããã¯ç§ã®ã¢ããªã±ãŒã·ã§ã³ããã®æ¬åœã«ã²ã©ãããã¯ã§ãã
function useComponentList(id) {
const incomingComponents = useSuspenseFetch(
React.useCallback(() => getComponentAPI().listComponents(id), [id])
)
const map = React.useMemo(
() =>
Map(
(incomingComponents || []).map(component => [component.id, component])
),
[incomingComponents]
)
return useCacheValue(map)
}
ãã®ããã¯ïŒ
useCacheValue
ã§ã©ãããããããããè¿ããŸããããã¯ãç¹ã«åä»ãªãããã§ããuseCacheValue
ã¯æ¬¡ã®ããã«ãªããŸãã
export default function useCacheValue(value) {
const [state, setState] = React.useState(value)
React.useEffect(() => {
setState(value)
}, [value])
return [state, setState]
}
value
å€æŽïŒããŒã¿ãåãã§ãããããããšã瀺ããŸãïŒã«å¿çããããã¯ã§ãããšããèãã§ããŠãŒã¶ãŒã¯ãã®ç¶æ
ã®åå¿ã¢ããªè¡šçŸãå€æŽã§ããŸãã ããæå³ã§ãããã¯éåžžã«æªããã£ãã·ã¥ã®ããã«æ©èœããŸãïŒãã®ããååãä»ããããŠããŸãïŒã
ãã®ãã¿ãŒã³ãçŸåšã®ç¶æ ã®Reduxã§ã©ã®ããã«æ©èœãããã確èªããã®ã«èŠåŽããŠããŸãã ç§ã§ã¯ãªãããã°ã©ããŒã«ãã£ãŠæžããããšãããããŠãµã¹ãã³ã¹ãããŒã¿ãã§ããã®ãæºåãã§ããŠããããšãããããã©ã®ããã«èŠãããã«ã€ããŠã®çºèŠã¯ãããŸãããïŒ çŸç¶ã§ã¯ãããã¯åœä»€åãã§ãããã©ã°ã䜿çšããŠReduxãåç¬ã§äœ¿çšãããããã¯ããã«é¢åã§ãã
Reduxãç¬èªã®ããã¯ãæã£ãŠãããšãããã¯ããããã¯ããã«ç°¡åã«ãªããŸããããã¯ãReduxãå ¬éãããããšãæå³ããŠããªãã³ã³ããã¹ãã§HOCã䜿çšããããšãäž»ãªé£ããã§ããããã§ãããããã§ãå ¬åŒã®å 容ã確èªããããšæããŸããçãã¯:)
ãµã¹ãã³ã¹ã¯ãå€éšãã£ãã·ã¥ïŒç¶æ ã«ãã£ãŠé§åãããããã¯ã§ã¯ãªãïŒã§æ©èœããããšãç®çãšããŠããŸãã åçŽãªãŠãŒã¹ã±ãŒã¹ã§æ©èœãããã®ãããªãã£ãã·ã¥ã®ãªãã¡ã¬ã³ã¹å®è£ ãæäŸããŸãã ãªã¬ãŒã¯ç¬èªã®ãã£ãã·ã¥ã¡ã«ããºã ãå®è£ ããŸãã ä»ã®ããŒã«ïŒApolloãªã©ïŒããäºææ§ã®ããç¬èªã®ãã£ãã·ã¥ãå®è£ ã§ããããã«ãªããããã2ã€ã®å®è£ ã«è§Šçºãããå¯èœæ§ããããŸãã
çããå¿ èŠãªè³ªåã¯ãçªç¶å€ç°/ç¡å¹åã ãã§ã¯ãããŸããã ãŸããã¹ãããŒã衚瀺ããã¿ã€ãã³ã°ãåãäžããããããªãŒã®å€åŽã«ãããã€ã³ã©ã€ã³ã€ã³ãžã±ãŒã¿ãŒããªã©ã®äžè¬çãªãã¿ãŒã³ãèªã¿èŸŒã¿ç¶æ ã®èª¿æŽïŒãããããŠã³ã®é åºã§ããã¯ã解é€ããå¿ èŠããããã®ããŸãã¯ãã®ãŸãŸå ¥ã£ãŠããå¿ èŠããããã®ïŒã«ã€ããŠãèæ ®ããå¿ èŠããããŸããæºåå®äºïŒããªã¹ãã®ã¹ããªãŒãã³ã°ã¬ã³ããªã³ã°ããããéšåçãªæ°Žåè£çµŠã«ã©ã®ããã«åœ±é¿ããããªã©ã ç§ãã¡ã¯ãããã®ããšã«åãçµãã§ããŸããããããã®ãããã«ããå ¬åŒã®æšå¥šäºé ãã¯ãŸã ãããŸããã ããå Žåã¯ãæŽæ°ãçºè¡šããããã°ããããããŸãã
ã¡ãªã¿ã«ãããŒã¿ãã§ããã®ãµã¹ãã³ã¹ã¯ã人ã ãæ £ããŠãããã®ãšã¯ååã«ç°ãªãã¡ã³ã¿ã«ã¢ãã«ã§ãã Reduxã®ãããªéåžžã«å¶çŽã®ãªãã¡ã«ããºã ãšçµ±åããå Žåãå¿ ãããããã»ã©åŒ·åã«ãªããšæåŸ ããã®ã¯å ¬å¹³ã§ã¯ãªããšæããŸãã ããããç§ãã¡ã¯èŠãã§ãããã ä»ã¯äœãèšããŸããã
@gaearon ãç§ãã¡ã¯ãããã®ããšã«åãçµãã§ããŸãããšèšããšããç§ã賌èªã§ããåé¡ã¯ãããŸããããããšããããã®è°è«ã¯éå ¬éã§è¡ãããŠããŸããïŒ
ããããšãã @ gaearon :)
@ntuckerãã€ãã®ããã«ãé²è¡äžã®ã¢ã¯ãã£ããã£ãPRãšããŠèŠãããšãã§ããŸãã ããšãã°ã次ã®ããã«https://github.com/facebook/react/pull/14717 ã https://github.com/facebook/react/pull/14884 ã https://github.com/facebook/react/pull/15061 ã https://github.com/facebook/react/pull/15151 ã https://github.com/facebook/react/pull/15272 ã https://github.com/facebook/react/pull/15358 ã HTTPS ïŒ//github.com/facebook/react/pull/15367ãªã©ã åPRã«èª¬æçãªæ å ±ãå ¥ããããšããŠããŸããããã¹ãã«ããåäœã®å€åã確èªã§ããŸãã å®éšã®ããã¥ã¡ã³ãããŒã¯ãããã€ãã®çç±ã§äœããªã£ãŠããŸãã
å®éã«æ©èœããããšã確信ããåŸãéžæããã¢ãã«ã«é¢ããããå®å šãªèª¬æãæçš¿ããŸãã ãã¹ãŠã®å®éšã詳现ã«èª¬æããããšã¯ãç§ãã¡ã«ãšã£ãŠãã³ãã¥ããã£ã«ãšã£ãŠãçç£çã§ã¯ãªããšæããŸãã ç§ãã¡ã®æåã®å®éšã®ã»ãšãã©ã¯å€±æãããããã®ãã¹ãŠãææžåããŠèª¬æãããšãç§ãã¡ã®äœæ¥ãé ããªããŸãã
ããã«æªãããšã«ãããã«ããã人ã
ããå
ã
èšèšãããæ¹æ³ã§ã¯æ©èœããªãããšã«åŸã§æ°ä»ãäœãã®åšãã«ã¡ã³ã¿ã«ã¢ãã«ãæ§ç¯ããçµæã«ãªãããšããããããŸãã ïŒåé€ããã°ããã®maxDuration
ã§çºçããŠããããã«ãïŒãããã£ãŠãæéãšæéã®äž¡æ¹ãæå¹ã«æŽ»çšã§ããããã«ãªããŸã§ãäžéå端ãªã¢ã€ãã¢ã®å
±æãæ§ããããšæããŸãã ããã¯ãéå»ã«Reactãéçºããæ¹æ³ãšãäžèŽããŠããŸãã äœããæ¬åœã«æºåãã§ãããïŒã¡ã³ã¿ã«ã¢ãã«ã®çè«çãªèšè¿°ã§ãã£ãŠãïŒããããææžåããŠèª¬æããããšã«ãã¹ãŠã®æ³šæãåããŸãã
ã¡ãªã¿ã«ãããŒã¿ãã§ããã®ãµã¹ãã³ã¹ã¯ã人ã ãæ £ããŠãããã®ãšã¯ååã«ç°ãªãã¡ã³ã¿ã«ã¢ãã«ã§ãã Reduxã®ãããªéåžžã«å¶çŽã®ãªãã¡ã«ããºã ãšçµ±åããå Žåãå¿ ãããããã»ã©åŒ·åã«ãªããšæåŸ ããã®ã¯å ¬å¹³ã§ã¯ãªããšæããŸãã ããããç§ãã¡ã¯èŠãã§ãããã ä»ã¯äœãèšããŸããã
@gaearon ã幞ããªããšã«ããµã¹ãã³ã¹ã®ã¡ã³ã¿ã«ã¢ãã«ã¯ç§èªèº«ã®ã¡ã³ã¿ã«ã¢ãã«ãšå®å šã«äžèŽããŠããŸãã ããºã«ã®ãã®éšåãæå®ã®äœçœ®ã«åãŸãããšã«éåžžã«è奮ããŠããŸãã é 匵ã£ãŠãããŠããããšãïŒ
æšå¹Ž11æã«çºè¡šãããããŒããããïŒhttps://reactjs.org/blog/2018/11/27/react-16-roadmap.htmlïŒã¯ããµã¹ãã³ã¹ã®ãåæãããŒãžã§ã³ã2019幎第2ååæã«äºå®ãããŠããããšã瀺ããŠããŸãã 2019幎第3ååæãQ3ã§ã¯ãªãããŸãã¯Q3ãªã©ã«é¢ããŠå ¥æã§ããã¢ããããŒãã¯ãããŸããïŒ
ããã¯ç§ãèŠã€ããææ°ã®ããŒããããã¢ããããŒãã§ããïŒ https ïŒ//reactjs.org/blog/2019/08/08/react-v16.9.0.html#an -update-to-the-roadmap
10æã«å®éšçãªãªãªãŒã¹ãæäŸããŸããïŒ https ïŒ
ãµã¹ãã³ã¹ã¯ç§ã殺ããŠãã
@gaearonæ¬çªç°å¢ã§äœ¿çšãããŠãããšã®ããšã§ããã ããããç§ã¯æ¬çªç°å¢ã§ãå®éšçãªãã³ãŒãã䜿çšããããšã«éåžžã«æ¶æ¥µçã§ãã ããŒãããããã¹ããŒã¿ã¹ãé²æç¶æ³ãã¿ã€ãã³ã°ãªã©ã«ã€ããŠæ確ã§ã¯ãããŸãããããã¯ã¢ã«ãã¡ãããŒã¿ãRCã®å質ã§ããïŒ ãã®ãå®éšçããšããèšèã¯ãç§ã«ã¯ãããã«è§Šããªãã§ãã ããããšããæå³ã§ãã
ç§ãã¡ã¯çããã®ã³ãŒãã«åºã¥ããŠããžãã¹ãè¡ã£ãŠããŸããç§ãã¡ã¯çãçãããšåãããã«å§åãããŠãããšç¢ºä¿¡ããŠããŸãã å°ãæå¿«ã«ãããã°ãSOMETHINGã¯æ¬åœã«åœ¹ã«ç«ã¡ãŸãã ãŸãã§ãFacebookã§å¶äœäžãªã®ã§ãå®æã§ãããšæããŸãã
@mschipperheyn
ããã¯è€æ°å¹Žã«ããããããžã§ã¯ãã§ãã æ£çŽãªçãã¯ã2幎åã«å§ãããšãã«æã£ãŠãããããã¯ããã«å€ãã®ä»äºãçã¿åºãããšããããšã§ãã
ãããã幞ããªããšã«ãçŸåšã¯æ¬çªç°å¢ã§é »ç¹ã«äœ¿çšããŠãã
ä»æ¥ã®ããŸããŸãªã¯ãŒã¯ã¹ããªãŒã ã®å€§ãŸããªç¶æ ã¯æ¬¡ã®ãšããã§ãã
<Suspense>
ãšã³ãŒãåå²ã®ããã®API lazy
ã ïŒReact 16.6ã§åºè·ïŒcreateRoot
ããã³useTransition
ã ïŒ experimental
ãªãªãŒã¹ã§å©çšå¯èœïŒevent
ããååŸããããšãæ€èšããŠãã ããããŸãã§ãFacebookã§å¶äœäžãªã®ã§ãå®æã§ãããšæããŸãã
ç§ã¯ããããã®ããã«ã©ã®ããã«èŠããããèŠãããšãã§ããŸããããã®èªæžã¯å°ãææ°æ¶æ²ããŸãã :-)ç§ãã¡ã¯éå»æ°ã¶æéãããã«ãã³ã¹ãããã§åãçµãã§ããŸãããæè¡çãªåŽé¢ã®å€ãã¯ãå®æããŠããããã»ãŒå®æã«è¿ã¥ããŠããŸãã æ®ãã®äœåã®ã»ãšãã©ã¯2ã€ã®ã«ããŽãªã«åé¡ãããŸãã
å®å®ãããªãªãŒã¹ã§ããããã»ã¡ã³ãã§åºå®ããåã«ãåæèšèšã§çºèŠããæ¬ é¥ãä¿®æ£ããŸãã çŸåšæã£ãŠãããã®ããªãªãŒã¹ããå Žåã¯ãæ°ãæ以å ã«å€§å¹ ãªå€æŽãè¡ãå¿ èŠããããŸãã ããã¯çŽããããã ãã§ãããã
ãšã³ã·ã¹ãã ã®äºææ§ãšé©åãªããã©ã«ãã ã©ã€ãã©ãªãæ¢åã®ã¢ãããŒãã§ã¯æ©èœããªããããä»æ¥èª°ã䜿çšã§ããªããã®ããªãªãŒã¹ããŠã圹ã«ç«ã¡ãŸããã ãããã£ãŠãäœæ¥ã®å€§éšåïŒããšãã°ã useMutableSource
ãä»ããFluxã®ãããªã©ã€ãã©ãªãšã®äºææ§ãããåªããã€ãã³ãã»ãã³ãã£ã¯ã¹ã®éžæãæšå¥šããããã£ãã·ã¥æŠç¥ã®åºè·ïŒã¯ããªãªãŒã¹ãããã®ãå®éã«äœ¿çšã§ããããã«
ãä»æ¥ã¯äœ¿ããŸãããâŠæè¡çã«ã¯ãä»æ¥ã¯å
šéšäœ¿ããŸãã ããŸãã å
·äœçã«ã¯ããªã¬ãŒããã¯ãšã³ã³ã«ã¬ã³ãã¢ãŒãã䜿çšããŸãã ãŸã éèŠãªèšç»ãããå€æŽãšæ¢ç¥ã®åé¡ããããããçŸåšã®ç¶æ
ã¯ãåºãæ¡çšãããæºåãã§ããŠãããšèŠãªãåºæºãæºãããŠããŸããã ãã¡ããããã°ãAPIãããã«å€æŽããŠãããŸããªãå Žåã¯ãç§ãã¡ãšåãããã«@experimental
ãªãªãŒã¹ã䜿çšã§ããŸãã
Facebookãç§ãã¡ã®ãæãéããããããšããç¹ã§ããã§ç¹å¥ãªç«å Žã«ãããšã¯èšããŸããã ãŸã£ããéã«ãç§ãã¡ã¯å®äºããŠããŸãããããããå éšçã«ã¯ã解çŽã蚱容ãã移åäžã®åè»ã®äžã«æ§ç¯ããããšãããšããªãã®ã¯ããããç§ãã¡ãæ§ç¯ããŠãããã®ããã£ããããŠããããšãç¥ãæ¹æ³ã ããã§ãã ãã®éãããã°ããŒãã£ã³ã°ããªããã°ã6ãæã§çºèŠããæ¬ é¥ã¯ãçºèŠããŠåèšèšããã®ã«æ°å¹Žãããã§ãããã
èŠçŽãããšãããã¹ãããšã¯ãŸã ãããããããŸãã
@gaearonãã®ã¢ããããŒããããããšãïŒ ãããŠãç§ã®å£èª¿ãééã£ãŠããå Žåã¯ãè©«ã³ç³ãäžããŸãã äœã¶æãTwitterã粟æ»ããŠäœãèŠã€ãããªãã£ãã®ã§ãå°ãã€ã©ã€ã©ããããšãèªããŸãã ãã®åŽé¢Server renderer immediately flushes Suspense fallbacks (available in experimental releases)
ã¯ãå®è£
ã®ããã«ApolloGraphqlã䜿çšããŠããããã¹ãããéã«æéãå²ãåœãŠãããšãã§ãããã®ã®ããã«èŠããŸãã
ããã§ããå³æžé€šã®äœè ã奜å¥å¿æºçãªäººã ãéã³å§ããæºåãã§ããŠããã¯ãã§ãã äžè¶³ããŠããéšåã¯äž»ã«ã幞ããªéããæäŸããããšã«é¢ãããã®ã§ãããé 管ã®ã»ãšãã©ã¯ããã«ããã¯ãã§ãã
ãµãŒããŒã¬ã³ãã©ãŒã¯ãµã¹ãã³ã¹ãã©ãŒã«ããã¯ãå³åº§ã«ãã©ãã·ã¥ããŸãïŒå®éšçãªãªãªãŒã¹ã§å©çšå¯èœïŒ
ããã«ã€ããŠã©ãã§èªãããšãã§ããŸããïŒ äžŠè¡ã¢ãŒãAPIãªãã¡ã¬ã³ã¹ïŒå®éšçïŒãæåŸ ããŠããŸããããéããããŸããã§ããã
誰ããNext.jsããªã¬ãŒããã¯ã䞊è¡ã¢ãŒããäžç·ã«ïŒSSRã§ïŒã¹ããããããã¢ãæã£ãŠãããªããããã¯çŽ æŽãããã§ãããã ããã§ãªããã°ãååãªããã¥ã¡ã³ããèŠã€ããããšãã§ããã°ãéè©ŠãããããããããŸããã
@CrocoDillon
SSRã«é¢ããè¿œå ã®ããã¥ã¡ã³ãã¯ãããŸããããããã¯äž»ã«ãæ°ããããã©ã«ãã®åäœã§ããããã§ãã
ã³ã³ããŒãã³ãããµãŒããŒäžã§äžæåæ¢ãããšããããå®éšçãªãªãªãŒã¹ãããå Žåã¯ã代ããã«æãè¿ãSuspenseãã©ãŒã«ããã¯ããã©ãã·ã¥ããŸãã 次ã«ãã¯ã©ã€ã¢ã³ãã§createRoot(node, { hydrate: true }).render(<App />)
ãŸãã
ããã«ããããã¹ãŠã®æ°ãããã€ãã¬ãŒã·ã§ã³æ©èœããã§ã«æå¹ã«ãªã£ãŠããããšã«æ³šæããŠãã ããã ãããã£ãŠãããšãã°ããµã¹ãã³ã¹å¢çã¯ãµãŒããŒã§çæããããã©ãŒã«ããã¯HTMLã«ãã¢ã¿ããããããŠãããã¯ã©ã€ã¢ã³ãã¬ã³ããªã³ã°ãè©Šã¿ãŸãã
ãŸããã¢ããªå
šäœãèªã¿èŸŒãŸããåã«æ°Žåè£çµŠãéå§ã§ããããšã«ã泚æããŠãã ããã <App>
ãèªã¿èŸŒãŸãããšãæ°Žåè£çµŠã§ããŸãã 以äžã®ã³ã³ããŒãã³ããã³ãŒãã®æºåãã§ããŠããªããšãã«äžæããéãïŒã¬ã€ãžãŒãšåæ§ïŒã ãã®å ŽåãReactã¯ãµãŒããŒã®HTMLã³ã³ãã³ããä¿æããŸããããµã¹ãã³ã¹å¢çãããã«ãã¢ã¿ãããããŸãã åã³ã³ããŒãã³ããããŒãããããšãæ°Žåãç¶ç¶ãããŸãã æ°Žåããéšåã¯ã€ã³ã¿ã©ã¯ãã£ãã«ãªããã€ãã³ããåçããŸãã
ãããã@devknollã«æ¬¡ã®çµ±åã®è©Šã¿/äŸãå°ããããšãã§ããŸãã 圌ã¯ããããããã€ãæã£ãŠããŸãã
Next.jsã§åæã¢ãŒããæå¹ã«ããã«ã¯ã react@experimental
ãšreact-dom@experimental
ãã€ã³ã¹ããŒã«ãã以äžãnext.config.js
è¿œå ããŸãã
// next.config.js
module.exports = {
experimental: {
reactMode: 'concurrent'
}
}
ããã«é¢ããNext.jsã®ãã£ã¹ã«ãã·ã§ã³ã¯æ¬¡ã®ãšããã§ãïŒ https ïŒ
ãµãŒããŒã¬ã³ããªã³ã°ã§ãµã¹ãã³ã¹ãåŸ ã€ããšã¯å¯èœã§ããïŒããšãã°ãéçãµã€ãçæãªã©ã®å ŽåïŒïŒ ã³ãŒã«ããã¯ã®äœ¿çšãé©åãªããã©ã«ãã§ããããšã«åæããŸãããªãŒããŒã©ã€ãå¯èœãã©ããçåã«æã£ãŠããŸããïŒ
ãŸããã¢ããªå šäœãèªã¿èŸŒãŸããåã«æ°Žåè£çµŠãéå§ã§ããããšã«ã泚æããŠãã ããã ãã€
ããŒãããããããªãã¯æ°Žåããããšãã§ããŸãã 以äžã®ã³ã³ããŒãã³ããã³ãŒãã®æºåãã§ããŠããªããšãã«äžæããéãïŒã¬ã€ãžãŒãšåæ§ïŒã ãã®å ŽåãReactã¯ãµãŒããŒã®HTMLã³ã³ãã³ããä¿æããŸããããµã¹ãã³ã¹å¢çãããã«ãã¢ã¿ãããããŸãã åã³ã³ããŒãã³ããããŒãããããšãæ°Žåãç¶ç¶ãããŸãã æ°Žåããéšåã¯ã€ã³ã¿ã©ã¯ãã£ãã«ãªããã€ãã³ããåçããŸãã
@gaearonã¯ããµãŒããŒäžã§ã³ã³ããŒãã³ããéåžžã©ããã¬ã³ããªã³ã°ã§ããããã¯ã©ã€ã¢ã³ãäžã§ã¯React.lazyã䜿çšã§ãããšããæå³ã§ããïŒ ãµãŒããŒããå®å šãªããŒã¯ã¢ãããè¿ãããšãèš±å¯ããŸãããã¯ã©ã€ã¢ã³ãã§ã®ã³ã³ããŒãã³ãã³ãŒãã®è§£æãšã¬ã³ããªã³ã°ãé ãããŸãã ãµãŒããŒã§ã¬ã³ããªã³ã°ãããããŒã¯ã¢ããã¯ãããã§ãµã¹ãã³ã¹ã®ãã©ãŒã«ããã¯ãšããŠæ©èœããŸããïŒ
@robrichardç§ã¯å®éã«React.lazy
å®éã«è©Šããããšã¯ãããŸãããïŒFBã§ã¯å¥ã®ã©ãããŒã䜿çšããNextã«ãç¬èªã®ããŒãžã§ã³ããããŸãïŒããããã©ã®ããã«æ©èœããããæåŸ
ããŠããŸãã 確èªãã䟡å€ããããŸã:-)ç¹å®ã®å¶éããããŸããããšãã°ãå°éå
·ãæŽæ°ããŠäžèšã®ã¡ã¢ã®ãã€ã«ã¢ãŠãããªãå ŽåããŸãã¯ãã®äžã®ã³ã³ããã¹ããæŽæ°ããå Žåã¯ãäœããã¹ããããããªãããããããåé€ããŠãã©ãŒã«ããã¯ã衚瀺ããå¿
èŠããããŸãããããšã
@gaearonçŸåšã®ç¶æ ã®éšåçãªæ°Žå
unstable_createRoot
APIã䜿çšããŠããéããããã¯ãã¹ãŠã®@experimental
ãªãªãŒã¹ã§é·ãé䜿çšãããŠããŸããã
@gaearon ãããŒã¿é§ååã®äŸåé¢ä¿ãã®æå³ã詳ãã説æããŠ
@gaearon ãããŒã¿é§ååã®äŸåé¢ä¿ãã®æå³ã詳ãã説æããŠ
ã¯ãããã¡ããã äžèšã®ãªã¹ããç°¡æœã§ããããšããè©«ã³ããå¿ èŠããããŸããéåžžã«åçž®ãããŠããããããã®å€ãã¯éèŠãªåå¥ã®ãµããããžã§ã¯ãã§ãïŒãã®ãããæéãããã£ãŠããŸãïŒã
ããªãã®ç¹å®ã®è³ªåã«çããåã«ãäžæ©äžãã£ãŠãããåºãæèãäžããŸãããã ããåºãæèã§ã¯ãæ¬åœã«åªããããŒã¿ãã§ãããœãªã¥ãŒã·ã§ã³ãæ§ç¯ãã
ãå ¬åŒãReactã«å ¥ãã«ã¯éåžžã«é«ãåºæºããããŸãã ãReactyãã§ããããã«ã¯ãéåžžã®Reactã³ã³ããŒãã³ããšåæ§ã«æ§æããå¿ èŠããããŸãã ããã¯ãäœåãã®ã³ã³ããŒãã³ãã«æ¡åŒµã§ãããšã¯æããªããœãªã¥ãŒã·ã§ã³ãèª å®ã«æšå¥šã§ããªãããšãæå³ããŸãã ãŸããããã©ãŒãã³ã¹ãç¶æããããã«è€éã§æé©åãããæ¹æ³ã§ã³ãŒããèšè¿°ããªããã°ãªããªããœãªã¥ãŒã·ã§ã³ããå§ãããããšã¯ã§ããŸããã FBã§ã¯ããªã¬ãŒããŒã ããå€ãã®æèšãåŠã³ãŸããã 誰ããGraphQLã䜿çšã§ããããã§ã¯ãªãããŸãã¯ãªã¬ãŒã䜿çšããããšæãããã§ã¯ãããŸããïŒããèªäœã¯ããŸã人æ°ããªããããŒã ã¯å€éšã§ã®æ¡çšã®ããã«æé©åããŠããŸããïŒã ãã ããäžè¬çãªReactã®ããŒã¿ãã§ãããœãªã¥ãŒã·ã§ã³ã«ãRelayããåŸãèŠåŽããŠåŸãæèšãçµã¿èŸŒãŸããŠãããããã©ãŒãã³ã¹ãšã³ãã±ãŒã·ã§ã³ã®ã©ã¡ãããéžæããå¿ èŠããªãããšã確èªããããšæããŸãã
ããã¯å€§ããªã¢ããªã ãã§ã¯ãªãããšã匷調ããããšæããŸãã ãã®åé¡ã¯å€§ããªã¢ããªã§æãé¡èã§ãããnpmããå€æ°ã®ã³ã³ããŒãã³ããã€ã³ããŒãããå°ããªã¢ããªãããããã®éå¹çæ§ã®ãµãã»ããã«æ©ãŸãããŠããŸãã ã¯ã©ã€ã¢ã³ãåŽã®ã³ãŒãã倧éã«åºè·ããŠãŠã©ãŒã¿ãŒãã©ãŒã«ã«ããŒããããªã©ã ãŸãã¯ãäºåã«ããŒãããããŸãã ãŸããå°ããªã¢ããªãæ°žé ã«å°ããªã¢ããªã§ããç¶ããããã§ã¯ãããŸããã Reactã³ã³ããŒãã³ãã¢ãã«ãã¢ããªã®è€éãã«é¢ä¿ãªãåãããã«æ©èœããããã«ããããããµã€ãºã®ã¢ããªã«æé©ãªãœãªã¥ãŒã·ã§ã³ãå¿ èŠã§ãã
ããŠãããªãã®ç¹å®ã®è³ªåã«å¯ŸåŠããããã«ã ãªã¬ãŒã«ã¯ããããŒã¿é§ååã®äŸåé¢ä¿ããšåŒã°ããæ©èœããããŸãã ããã«ã€ããŠèãã1ã€ã®æ¹æ³ã¯ãåçãªimport
é²åã§ãã åçãªimport
ã¯å¿
ãããå¹ççã§ã¯ãããŸããã æ¡ä»¶ãçã®å Žåã«ã®ã¿ã³ãŒããããŒãããå ŽåïŒããšãã°ãããŠãŒã¶ãŒããã°ã€ã³ããŠããŸãããŸãã¯ããŠãŒã¶ãŒã«æªèªã¡ãã»ãŒãžããããŸãããïŒãå¯äžã®ãªãã·ã§ã³ã¯ãããé
延ããªã¬ãŒããããšã§ãã ãã ããããã¯ãäœãã䜿çšãããŠããå Žåã«ã®ã¿ããã§ããããéå§ãããŠããããšãæå³ããŸãïŒ React.lazy
ïŒã ããã¯å®éã«ã¯æé
ãã§ãã ããšãã°ãè€æ°ã®ã¬ãã«ã®ã³ãŒãåå²ã³ã³ããŒãã³ãïŒãŸãã¯ããŒã¿ãåŸ
æ©ããŠããã³ã³ããŒãã³ãïŒãããå Žåãæãå
åŽã®ã³ã³ããŒãã³ãã¯ããã®äžã®ã³ã³ããŒãã³ããããŒããããåŸã«ã®ã¿ããŒããéå§ããŸãã ããã¯éå¹ççã§ããããããã¯ãŒã¯ã®ããŠã©ãŒã¿ãŒãã©ãŒã«ãã§ãã ãªã¬ãŒãããŒã¿é§ååäŸåé¢ä¿ãã䜿çšãããšãã¯ãšãªã®äžéšãšããŠãã§ããããã¢ãžã¥ãŒã«ãæå®ã§ããŸãã ã€ãŸãããäœããã®æ¡ä»¶ãçã®å Žåããã®ã³ãŒããã£ã³ã¯ãããŒã¿å¿çã«å«ããŸããã ããã«ãããå¿
èŠã«ãªããã¹ãŠã®ã³ãŒãåå²ãã£ã³ã¯ãã§ããã ãæ©ãããŒãã§ããŸãã ã³ãã±ãŒã·ã§ã³ãããã©ãŒãã³ã¹ãšäº€æããå¿
èŠã¯ãããŸããã ããã¯å€§ããããšã§ã¯ãªãããã«æãããããããŸãããã補åã³ãŒãã®æåéãã®ç§æ°ãåæžããŸããã
ç¹°ãè¿ãã«ãªããŸãããRelayãReactã«å ¥ããŠããããã§ã¯ãªãã人ã ã«GraphQLã®äœ¿çšã匷å¶ããããããŸããã ããããæŠå¿µçã«ã¯ãæ©èœèªäœã¯æ±çšã§ãããåªãããªãŒãã³ãœãŒã¹ãœãªã¥ãŒã·ã§ã³ã䜿çšãããšãçŸåšãããã¯ããã«å€ãã®ã³ãŒãåå²ãå®è¡ã§ããŸãïŒãããã£ãŠãåºè·ãããã¯ã©ã€ã¢ã³ãJSã³ãŒããå€§å¹ ã«å°ãªããªããŸãïŒããã®æ±çšæ©èœã¯åŒã³åºãããŸããã ãããŒã¿é§ååã®äŸåé¢ä¿ãâããã¯ç§ãåç §ãããªã¬ãŒåã§ãã ãã®æ©èœã¯ãGraphQLãå¿ èŠãšããªããã倧ããªæšå¥šãœãªã¥ãŒã·ã§ã³ã®äžéšã«ãªããŸãã ããã¯åäžã®ç®æ¡æžãã®ãã€ã³ãã説æããã®ã«å€ãã®ããšã ã£ãã®ã§ãç§ã¯ãªã¹ãã§ãã®ååã§ãããåç §ããŸããã
ããããããæããã«ããããšãé¡ã£ãŠããŸãã
æãåèã«ãªãã³ã¡ã³ã
@mschipperheyn
ããã¯è€æ°å¹Žã«ããããããžã§ã¯ãã§ãã æ£çŽãªçãã¯ã2幎åã«å§ãããšãã«æã£ãŠãããããã¯ããã«å€ãã®ä»äºãçã¿åºãããšããããšã§ãã
ãããã幞ããªããšã«ãçŸåšã¯æ¬çªç°å¢ã§é »ç¹ã«äœ¿çšããŠãã
ä»æ¥ã®ããŸããŸãªã¯ãŒã¯ã¹ããªãŒã ã®å€§ãŸããªç¶æ ã¯æ¬¡ã®ãšããã§ãã
<Suspense>
ãšã³ãŒãåå²ã®ããã®APIlazy
ã ïŒReact 16.6ã§åºè·ïŒcreateRoot
ããã³useTransition
ã ïŒexperimental
ãªãªãŒã¹ã§å©çšå¯èœïŒevent
ããååŸããããšãæ€èšããŠãã ãããç§ã¯ããããã®ããã«ã©ã®ããã«èŠããããèŠãããšãã§ããŸããããã®èªæžã¯å°ãææ°æ¶æ²ããŸãã :-)ç§ãã¡ã¯éå»æ°ã¶æéãããã«ãã³ã¹ãããã§åãçµãã§ããŸãããæè¡çãªåŽé¢ã®å€ãã¯ãå®æããŠããããã»ãŒå®æã«è¿ã¥ããŠããŸãã æ®ãã®äœåã®ã»ãšãã©ã¯2ã€ã®ã«ããŽãªã«åé¡ãããŸãã
å®å®ãããªãªãŒã¹ã§ããããã»ã¡ã³ãã§åºå®ããåã«ãåæèšèšã§çºèŠããæ¬ é¥ãä¿®æ£ããŸãã çŸåšæã£ãŠãããã®ããªãªãŒã¹ããå Žåã¯ãæ°ãæ以å ã«å€§å¹ ãªå€æŽãè¡ãå¿ èŠããããŸãã ããã¯çŽããããã ãã§ãããã
ãšã³ã·ã¹ãã ã®äºææ§ãšé©åãªããã©ã«ãã ã©ã€ãã©ãªãæ¢åã®ã¢ãããŒãã§ã¯æ©èœããªããããä»æ¥èª°ã䜿çšã§ããªããã®ããªãªãŒã¹ããŠã圹ã«ç«ã¡ãŸããã ãããã£ãŠãäœæ¥ã®å€§éšåïŒããšãã°ã
useMutableSource
ãä»ããFluxã®ãããªã©ã€ãã©ãªãšã®äºææ§ãããåªããã€ãã³ãã»ãã³ãã£ã¯ã¹ã®éžæãæšå¥šããããã£ãã·ã¥æŠç¥ã®åºè·ïŒã¯ããªãªãŒã¹ãããã®ãå®éã«äœ¿çšã§ããããã«ãä»æ¥ã¯äœ¿ããŸãããâŠæè¡çã«ã¯ãä»æ¥ã¯å šéšäœ¿ããŸãã ããŸãã å ·äœçã«ã¯ããªã¬ãŒããã¯ãšã³ã³ã«ã¬ã³ãã¢ãŒãã䜿çšããŸãã ãŸã éèŠãªèšç»ãããå€æŽãšæ¢ç¥ã®åé¡ããããããçŸåšã®ç¶æ ã¯ãåºãæ¡çšãããæºåãã§ããŠãããšèŠãªãåºæºãæºãããŠããŸããã ãã¡ããããã°ãAPIãããã«å€æŽããŠãããŸããªãå Žåã¯ãç§ãã¡ãšåãããã«
@experimental
ãªãªãŒã¹ã䜿çšã§ããŸããFacebookãç§ãã¡ã®ãæãéããããããšããç¹ã§ããã§ç¹å¥ãªç«å Žã«ãããšã¯èšããŸããã ãŸã£ããéã«ãç§ãã¡ã¯å®äºããŠããŸãããããããå éšçã«ã¯ã解çŽã蚱容ãã移åäžã®åè»ã®äžã«æ§ç¯ããããšãããšããªãã®ã¯ããããç§ãã¡ãæ§ç¯ããŠãããã®ããã£ããããŠããããšãç¥ãæ¹æ³ã ããã§ãã ãã®éãããã°ããŒãã£ã³ã°ããªããã°ã6ãæã§çºèŠããæ¬ é¥ã¯ãçºèŠããŠåèšèšããã®ã«æ°å¹Žãããã§ãããã
èŠçŽãããšãããã¹ãããšã¯ãŸã ãããããããŸãã